web乱码和路径问题

1 乱码问题

乱码问题产生的根本原因是什么

  1. 数据的编码和解码使用的不是同一个字符集

  2. 使用了不支持某个语言文字的字符集

各个字符集的兼容性

  • 由上图得知,上述字符集都兼容了ASCII

  • ASCII中有什么? 英文字母和一些通常使用的符号,所以这些东西无论使用什么字符集都不会乱码

1 .1HTML乱码问题

设置项目文件的字符集要使用一个支持中文的字符集

  • 查看当前文件的字符集

    置项目文件的字符集要使用一个支持中文的字符集

  • 查看当前文件的字符集

  • 查看项目字符集 配置,将Global Encoding 全局字符集,Project Encoding 项目字符集, Properties Files 属性配置文件字符集设置为UTF-8

  • 编辑

当前视图文件的字符集通过<meta charset="UTF-8"> 来告知浏览器通过什么字符集来解析当前文件

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    中文
</body>
</html>

1.2 Tomcat控制台乱码

在tomcat10.1.7这个版本中,修改 tomcat/conf/logging.properties中,所有的UTF-8为GBK即可

  • 修改前
  • 修改后

sout乱码问题,设置JVM加载.class文件时使用UTF-8字符集

  • 设置虚拟机加载.class文件的字符集和编译时使用的字符集一致

  • -Dfile.encoding=UTF-8

2 路径问题

相对路径和绝对路径

  • 相对路径

    • 相对路径的规则是: 以当前资源所在的路径为出发点去寻找目标资源

    • 相对路径不以 / 开头

    • 在file协议下,使用的是磁盘路径

    • 在http协议下,使用的是url路径

    • 相对路径中可以使用 ./表示当前资源所在路径,可以省略不写

    • 相对路径中可以使用../表示当前资源所在路径的上一层路径,需要时要手动添加

  • 绝对路径

    • 绝对路径的规则是: 使用以一个固定的路径做出出发点去寻找目标资源,和当前资源所在的路径没有关系

    • 绝对路径要以/ 开头

    • 绝对路径的写法中,不以当前资源的所在路径为出发点,所以不会出现 ./ 和../

    • 不同的项目和不同的协议下,绝对路径的基础位置可能不同,要通过测试确定

    • 绝对路径的好处就是:无论当前资源位置在哪,寻找目标资源路径的写法都一致

  • 应用场景

    1. 前端代码中,href src action 等属性

    2. 请求转发和重定向中的路径

2.1.1 相对路径情况分析

相对路径情况1:web/index.html中引入web/static/img/logo.png

html 复制代码
#### 10.2.1.1  相对路径情况分析

> 相对路径情况1:web/index.html中引入web/static/img/logo.png

+ 访问index.html的url为   :  http://localhost:8080/web03_war_exploded/index.html
+ 当前资源为                      :  index.html
+ 当前资源的所在路径为  : http://localhost:8080/web03_war_exploded/
+ 要获取的目标资源url为 :  http://localhost:8080/web03_war_exploded/static/img/logo.png
+ index.html中定义的了    : `<img src="static/img/logo.png"/>`
+ 寻找方式就是在当前资源所在路径(http://localhost:8080/web03_war_exploded/)后拼接src属性值(static/img/logo.png),正好是目标资源正常获取的url(http://localhost:8080/web03_war_exploded/static/img/logo.png)

相对路径情况2:web/a/b/c/test.html中引入web/static/img/logo.png

绝对路径情况2:web/a/b/c/test.html中引入web/static/img/logo.png

index.html 和a/b/c/test.html 以及view1Servlet 中的路径处理

解决方案

2.2 重定向中的路径问题

目标 :由/x/y/z/servletA重定向到a/b/c/test.html

java 复制代码
@WebServlet("/x/y/z/servletA")
public class ServletA extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
    }
}
  • 访问test.html的url为 : http://localhost:8080/web03_war_exploded/a/b/c/test.html

  • 绝对路径的基准路径为 : http://localhost:8080

  • 要获取的目标资源url为 : http://localhost:8080/web03_war_exploded/static/img/logo.png

  • test.html中定义的了 : <img src="/web03_war_exploded/static/img/logo.png"/>

  • 寻找方式就是在基准路径(http://localhost:8080)后面拼接src属性值(/web03_war_exploded/static/img/logo.png),得到的正是目标资源访问的正确路径

    html 复制代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <!-- 绝对路径写法 -->
        <img src="/web03_war_exploded/static/img/logo.png">
    </body>
    </html>

    绝对路径情况3:web/WEB-INF/views/view1.html中引入web/static/img/logo.png

  • view1.html在WEB-INF下,需要通过Servlet请求转发获得

    java 复制代码
    @WebServlet("/view1Servlet")
    public class View1Servlet extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            RequestDispatcher requestDispatcher = req.getRequestDispatcher("WEB-INF/views/view1.html");
            requestDispatcher.forward(req,resp);
        }
    }
  • 访问view1.html的url为 : http://localhost:8080/web03_war_exploded/view1Servlet

  • 绝对路径的基准路径为 : http://localhost:8080

  • 要获取的目标资源url为 : http://localhost:8080/web03_war_exploded/static/img/logo.png

  • view1.html中定义的了 : <img src="/web03_war_exploded/static/img/logo.png"/>

  • 寻找方式就是在基准路径(http://localhost:8080)后面拼接src属性值(/static/img/logo.png),得到的正是目标资源访问的正确路径

    html 复制代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
    <img src="/web03_war_exploded/static/img/logo.png">
    </body>
    </html>
    2.1.3 base标签的使用

    base标签定义页面相对路径公共前缀

  • base 标签定义在head标签中,用于定义相对路径的公共前缀

  • base 标签定义的公共前缀只在相对路径上有效,绝对路径中无效

  • 如果相对路径开头有 ./ 或者../修饰,则base标签对该路径同样无效

    html 复制代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <!--定义相对路径的公共前缀,将相对路径转化成了绝对路径-->
        <base href="/web03_war_exploded/">
    </head>
    <body>
        <img src="static/img/logo.png">
    </body>
    </html>
    2.1.4 缺省项目上下文路径

    项目上下文路径变化问题

  • 通过 base标签虽然解决了相对路径转绝对路径问题,但是base中定义的是项目的上下文路径

  • 项目的上下文路径是可以随意变化的

  • 一旦项目的上下文路径发生变化,所有base标签中的路径都需要改

  • 将项目的上下文路径进行缺省设置,设置为 /,所有的绝对路径中就不必填写项目的上下文了,直接就是/开头即可

2.2.1相对路径写法
java 复制代码
@WebServlet("/x/y/servletB")
public class ServletB extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}
2.3.1 相对路径写法
java 复制代码
@WebServlet("/x/y/servletB")
public class ServletB extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("../../a/b/c/test.html");
        requestDispatcher.forward(req,resp);
    }
}
2.3.2绝对路径写法
  • 请求转发只能转发到项目内部的资源,其绝对路径无需添加项目上下文路径

  • 请求转发绝对路径的基准路径相当于http://localhost:8080/web03_war_exploded

  • 在项目上下文路径为缺省值时,也无需改变,直接以/开头即可

    java 复制代码
    @WebServlet("/x/y/servletB")
    public class ServletB extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            RequestDispatcher requestDispatcher = req.getRequestDispatcher("/a/b/c/test.html");
            requestDispatcher.forward(req,resp);
        }
    }
2.3.3目标资源内相对路径处理
  • 此时需要注意,请求转发是服务器行为,浏览器不知道,地址栏不变化,相当于我们访问test.html的路径为http://localhost:8080/web03_war_exploded/x/y/servletB

  • 那么此时 test.html资源的所在路径就是http://localhost:8080/web03_war_exploded/x/y/所以test.html中相对路径要基于该路径编写,如果使用绝对路径则不用考虑

    html 复制代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <!--
    		当前资源路径是     http://localhost:8080/web03_war_exploded/x/y/servletB
            当前资源所在路径是  http://localhost:8080/web03_war_exploded/x/y/
            目标资源路径=所在资源路径+src属性值 
    		http://localhost:8080/web03_war_exploded/x/y/../../static/img/logo.png
            http://localhost:8080/web03_war_exploded/static/img/logo.png
    		得到目标路径正是目标资源的访问路径	
        -->
    <img src="../../static/img/logo.png">
    </body>
    </html>
相关推荐
m0_7482338817 小时前
【学一点儿前端】本地或jenkins打包报错:getaddrinfo ENOTFOUND registry.nlark.com
前端·servlet·jenkins
岁岁岁平安2 天前
JavaWeb学习(6)(核心三大组件、过滤器(Filter)原理、配置过滤器与error页面)
java·学习·servlet·web·过滤器·filter
zz.YE3 天前
【Java Web】Servlet 快速入门
java·后端·servlet
四月天行健3 天前
【JavaEE】—— JWT+Filter过滤器、Interceptor拦截器实现登录校验(拦截请求)
java·spring·servlet
婷子19214 天前
忘记jenkins密码,跳过密码登录发现没有manage user选项的重置密码的方法
运维·servlet·jenkins
李豆豆喵4 天前
第32天:安全开发-JavaEE应用&Servlet路由技术&JDBC&Mybatis数据库&生命周期
安全·servlet·java-ee
等什么君!4 天前
使用前,后端写 具有分页效果的数据展示
java·前端·servlet·状态模式
潜水的码不二5 天前
JAVAWeb中的Servlet学习
servlet
兴奋の大公猴5 天前
Java课程设计项目-servlet+jsp美食系统、菜品管理系统
java·servlet·课程设计