1 乱码问题
乱码问题产生的根本原因是什么
-
数据的编码和解码使用的不是同一个字符集
-
使用了不支持某个语言文字的字符集
各个字符集的兼容性
-
由上图得知,上述字符集都兼容了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路径
-
相对路径中可以使用 ./表示当前资源所在路径,可以省略不写
-
相对路径中可以使用../表示当前资源所在路径的上一层路径,需要时要手动添加
-
-
绝对路径
-
绝对路径的规则是: 使用以一个固定的路径做出出发点去寻找目标资源,和当前资源所在的路径没有关系
-
绝对路径要以/ 开头
-
绝对路径的写法中,不以当前资源的所在路径为出发点,所以不会出现 ./ 和../
-
不同的项目和不同的协议下,绝对路径的基础位置可能不同,要通过测试确定
-
绝对路径的好处就是:无论当前资源位置在哪,寻找目标资源路径的写法都一致
-
-
应用场景
-
前端代码中,href src action 等属性
-
请求转发和重定向中的路径
-
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)
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
-
访问test.html的url为 : http://localhost:8080/web03_war_exploded/a/b/c/test.html
-
当前资源为 : test.html
-
当前资源的所在路径为 : http://localhost:8080/web03_war_exploded/a/b/c/
-
要获取的目标资源url为 : http://localhost:8080/web03_war_exploded/static/img/logo.png
-
test.html中定义的了 :
<img src="../../../static/img/logo.png"/>
-
寻找方式就是在当前资源所在路径(http://localhost:8080/web03_war_exploded/a/b/c/)后拼接src属性值(../../../static/img/logo.png),其中 ../可以抵消一层路径,正好是目标资源正常获取的url(http://localhost:8080/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="../../../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
-
当前资源为 : view1Servlet
-
当前资源的所在路径为 : http://localhost:8080/web03_war_exploded/
-
要获取的目标资源url为 : http://localhost:8080/web03_war_exploded/static/img/logo.png
-
view1.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)
html<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <img src="static/img/logo.png"> </body> </html>
2.1.2 绝对路径情况分析
绝对路径情况1:web/index.html中引入web/static/img/logo.png
-
访问index.html的url为 : http://localhost:8080/web03_war_exploded/index.html
-
绝对路径的基准路径为 : http://localhost:8080
-
要获取的目标资源url为 : http://localhost:8080/web03_war_exploded/static/img/logo.png
-
index.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>
绝对路径情况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相对路径写法
-
访问ServletA的url为 : http://localhost:8080/web03_war_exploded/x/y/z/servletA
-
当前资源为 : servletA
-
当前资源的所在路径为 : http://localhost:8080/web03_war_exploded/x/x/z/
-
要获取的目标资源url为 : http://localhost:8080/web03_war_exploded/a/b/c/test.html
-
ServletA重定向的路径 : ../../../a/b/c/test/html
-
寻找方式就是在当前资源所在路径(http://localhost:8080/web03_war_exploded/x/y/z/)后拼接(../../../a/b/c/test/html),形成(http://localhost:8080/web03_war_exploded/x/y/z/../../../a/b/c/test/html)每个../抵消一层目录,正好是目标资源正常获取的url(http://localhost:8080/web03_war_exploded/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 resp.sendRedirect("../../../a/b/c/test.html"); } }
2.2.2绝对路径写法
-
访问ServletA的url为 : http://localhost:8080/web03_war_exploded/x/y/z/servletA
-
绝对路径的基准路径为 : http://localhost:8080
-
要获取的目标资源url为 : http://localhost:8080/web03_war_exploded/a/b/c/test.html
-
ServletA重定向的路径 : /web03_war_exploded/a/b/c/test.html
-
寻找方式就是在基准路径(http://localhost:8080)后面拼接(/web03_war_exploded/a/b/c/test.html),得到( http://localhost:8080/web03_war_exploded/a/b/c/test.html)正是目标资源访问的正确路径
-
绝对路径中需要填写项目上下文路径,但是上下文路径是变换的
- 可以通过 ServletContext的getContextPath()获取上下文路径
-
可以将项目上下文路径定义为 / 缺省路径,那么路径中直接以/开头即可
java//绝对路径中,要写项目上下文路径 //resp.sendRedirect("/web03_war_exploded/a/b/c/test.html"); // 通过ServletContext对象动态获取项目上下文路径 //resp.sendRedirect(getServletContext().getContextPath()+"/a/b/c/test.html"); // 缺省项目上下文路径时,直接以/开头即可 resp.sendRedirect("/a/b/c/test.html");
2.3 请求转发中的路径问题
目标 :由x/y/servletB请求转发到a/b/c/test.html
java
@WebServlet("/x/y/servletB")
public class ServletB extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
2.3.1 相对路径写法
-
访问ServletB的url为 : http://localhost:8080/web03_war_exploded/x/y/servletB
-
当前资源为 : servletB
-
当前资源的所在路径为 : http://localhost:8080/web03_war_exploded/x/x/
-
要获取的目标资源url为 : http://localhost:8080/web03_war_exploded/a/b/c/test.html
-
ServletA请求转发路径 : ../../a/b/c/test/html
-
寻找方式就是在当前资源所在路径(http://localhost:8080/web03_war_exploded/x/y/)后拼接(../../a/b/c/test/html),形成(http://localhost:8080/web03_war_exploded/x/y/../../a/b/c/test/html)每个../抵消一层目录,正好是目标资源正常获取的url(http://localhost:8080/web03_war_exploded/a/b/c/test/html)
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>