JavaWeb中的绝对路径和相对路径问题

在开发的时候,因为路径,往往会造成很多问题。所以开发时,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)处于同一目录,找不到,所以就会访问失败。这就出现了路径错乱的问题。

JavaWeb中的绝对路径和相对路径问题_第1张图片


 总结:



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");


你可能感兴趣的:(JavaWeb中的绝对路径和相对路径问题)