关于Web应用路径设置的说明,也就是绝对路径与相对路径的理解咯。
首先我们来看一个问题:
① 创建Web应用Path,目录结构如图所示
② 在a.html中有超链接<a href=“b.html”>To b.html,TestServlet中转发到a.html
a.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>相对路径与绝对路径</title>
</head>
<body>
<a href="b.html">To b.html</a>
</body>
</html>
TestServlet:
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/dir/a.html").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
}
index.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="TestServlet">TestServlet</a>
</body>
</html>
③ 如果先直接访问a.html,再通过超链接转到b.html没有问题,在这里就不试了。
④ 如果先通过TestServlet转发到a.html,则浏览器地址栏会变成 http://localhost:8989/Path/TestServlet
点击TestServlet:
此时再点击超链接<a href=“b.html”>To b.html就会发生问题,找不到b.html。如图:
如何解决?
原因是超链接<a href=“b.html”>To b.html使用的是相对路径,浏览器进行解析时,只能以当前浏览器地址栏里的路径为基准。例如,当前浏览器地址栏里的内容是:http://localhost:8989/Path/TestServlet
那么经过浏览器解析后b.html的访问地址就成了:http://localhost:8989/Path/TestServletb.html这显然无法访问到b.html。
完整的url构成如下图:
关于相对路径和绝对路径的说明:
相对路径:虚拟路径如果不以“/”开始,就是相对路径,浏览器会以当前资源所在的虚拟路径为基准对相对路径进行解析,从而生成最终的访问路径。此时如果通过转发进入其他目录,再使用相对路径访问资源就会出错。所以为了防止路径出错,我们经常将相对路径转化为绝对路径的形式进行请求。
绝对路径:虚拟路径以“/”开始,就是绝对路径。
① 在服务器端:虚拟路径最开始的“/”表示当前Web应用的根目录。只要是服务端解析的绝对路径,都是以web根目录为起始的。由服务器解析的路径包括:<1> web.xml的配置路径、<2>request转发的路径。
② 在浏览器端:虚拟路径最开始的“/”表示当前主机地址。
例如:链接地址“/Path/dir/b.html”经过浏览器解析后为:
相当于http://localhost:8989/Path/dir/b.html
由浏览器解析的路径包括:
<1>重定向操作:response.sendRedirect("/xxx")
<2>所有HTML标签:<a href="/xxx"> 、<form action="/xxx"> 、link、img、script等
这些最后的访问路径都是 http://localhost:8989/xxx
所以我们可以看出,如果是浏览器解析的路径,我们必须加上项目名称才可以正确的指向资源。http://localhost:8989/Path/xxx
<1>重定向操作:
response.sendRedirect(request.getContextPath()+"/xxx");
<2>所有HTML标签:<a href="/项目名/xxx">; <form action=“/项目名/xxx">
- 在浏览器端,除了使用绝对路径之外,我们还可以使用base标签+相对路径的方式来确定资源的访问有效。
- base标签影响当前页面中的所有相对路径,不会影响绝对路径。相当于给相对路径设置了一个基准地址。
- 习惯上在html的标签内,声明:
<!-- 给页面中的相对路径设置基准地址 -->
<base href="http://localhost:8080/Test_Path/"/>
接着html中的路径就可以使用相对路径的方式来访问。比如:
<h4> base+相对路径</h4>
<!-- <base href="http://localhost:8080/Test_Path/"/> -->
<a href="1.html">1.html</a><br/>
<a href="a/3.html">a/3.html</a><br/>
<!-- servlet映射到了项目根目录下,可以直接访问 -->
<a href="PathServlet">PathServlet</a><br/>
知道原理了问题还没解决呢?
修改一下a.html的跳转地址就好啦。
a.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>相对路径与绝对路径</title>
<base href="http://localhost:8989/Path/"/>
</head>
<body>
<a href="dir/b.html">To b.html</a>
</body>
</html>
然后我们再来访问一下:
刚在这错了,继续访问一下:
如图:访问成功了,原理就地址栏的url哦。就是项目访问地址+页面相对地址就好了。
有人不理解这个Path哪来的,以前访问的不是自己项目名吗?怎么成Path了?
我告诉你们啊,
这个可以设置的,看这里:
关于这个路径有时候我就设置成’/’,访问起来就方便了,不过自己熟悉关于web中的url组成怎么喜欢怎么设置。对于学技术这点,我觉得你们不但要知其然,还要知其所以然,有时候底层的铺垫决定了你是否盖起你心中的那座摩天大楼。继续加油吧。