在开发的时候,因为路径,往往会造成很多问题。所以开发时,JavaWeb尽可能的用绝对路径
a.jsp
<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong><body> <h1>A page</h1> <a href="pathProblem/b.jsp">To B page</a> </body></strong></span>
b.jsp
<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong><body> <h1>B page</h1> Citys:<%= request.getAttribute("citys") %> <a href="c.jsp">To C page</a> </body></strong></span>
c.jsp
<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong><body> <h1>C page</h1> <a href="../a.jsp">To A page</a> </body></strong></span>
上面3个jsp,都是相对路径,可以正常访问
但是,通过转发和重定向后
a.jsp
<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong><body> <h1>A page</h1> <a href="testServlet">To B page</a> </body></strong></span>
b.jsp
<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong><body> <h1>B page</h1> Citys:<%= request.getAttribute("citys") %> <a href="c.jsp">To C page</a> </body></strong></span>
c.jsp
<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong><body> <h1>C page</h1> <a href="../a.jsp">To A page</a> </body></strong></span>
testServlet
<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>@WebServlet("/testServlet") public class testServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.模拟从数据库中查询数据 List<String> citys = Arrays.asList("BJ","SH","GZ"); request.setAttribute("citys", citys); // 根目录下pathProblem 目录 下的b.jsp request.getRequestDispatcher("/pathProblem/b.jsp").forward(request, response); } }</strong></span>
a.jsp 可以访问 b.jsp,但是b.jsp却不能访问c.jsp?
因为在 a.jsp
转发到 b.jsp后,路径( http://localhost:8080/Session/testServlet ),从b.jsp 再去c.jsp时,因为 b->c 是相对路径,所以 b 会认为 c.jsp 和当前WEB应用的根目录 ( /Session)处于同一目录,找不到,所以就会访问失败。这就出现了路径错乱的问题。
总结:
1.绝对路径的问题
1). 开发时建议编写 "绝对路径" :写绝对路径肯定不会出问题,但是写相对路径有时候就会出现问题
在由 Servlet 转发到 JSP 页面时,此时浏览器地址栏上显示的是Servlet 的路径,而若 JSP 的页面的超链接还是相对于该 JSP
页面的地址,则可能会出现路径混乱的问题.
根目录
-/a.jsp
-path
-/b.jsp
-/c.jsp
a.jsp -> Servlet 转发 -> b.jsp (有超链接,连接到和b.jsp 同目录下c.jsp 这时就会出现问题)->页面混乱
2).编写绝对路径可以避免上述问题:
绝对路径: 相对当前 Web 应用的根路径(ContextPath)的路径,即任何路径都必须带上ContextPath.
http://localhost:8080/Session/a.jsp √. ContextPath -> Session
http://localhost:8080/a.jsp ×. 当前站点 -> http://localhost:8080/
3).JavaWeb 中的 ‘/‘ 到底代表什么?
①.有时候代表的是: 当前WEB应用的根路径(http://localhost:8080/ContextPath/) :若 ‘/‘ 需要交给Servlet 来处理
>请求转发时,request.getRequestDispatcher("/xxxx").forward(,,);
>web.xml 中 映射Servlet
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern> /TestServlet </url-pattern>
</servlet-mapping>
>各种定制标签中的 /
②.有时代表的是当前WEB站点的根路径(http://localhost:8080/):若 ‘/‘ 交给浏览器处理
>超链接:<a href="/XXXX">
>表单中的action <form action="/login.jsp">
>做请求重定向的时候,response.sendRedirect("/a.jsp");
如何完成编写绝对路径:
若‘/‘代表的是站点的根目录,在其前面加上ContextPath 就可以了,而ContextPath 可以由request.getContextPath() 或
application.getContextPath() 得到
<a href="/TestPath">B page</a> 就无法访问Servlet
改为 <a href="<%=request.getContextPath()%>/TestPath"> B page </a>
response.sendRedirect(request.getContextPath()+"/pathProblem/b.jsp");