JSP和 servlets 中的绝对路径之间有什么区别。
我的示例项目结构:
Dynamic Project name:PathTest
1.html path:PathTest\WebContent\html\1.html
Context root of Project =PathTest
我通过多次尝试找到了以下内容
在Test.jsp内部(在Webcontent下): 链接到1.html, < a href =“/ PathTest / html / 1.html”> 1.jsp< / a>< br />
在web.xml内部(在WEB-INF下):
提供准确的aboslute路径,因为我打电话给来自1.html的Serv servelt
&LT; URL模式 “&GT; /html/Serv.do< / url-pattern的” &GT;
(/ PathTest不包含在此处)
Serv.java内部:
使用sendRedirect方法来1.html:
res.sendRedirect( “/ PathTest / HTML / 1.HTML”);
Serv.java内部:
使用getRequestDispatcher方法到1.html:
RequestDispatcher dispatch = req.getRequestDispatcher(“/ html / 1.html”);
(/ PathTest不包含在此处)
我的问题是:为什么在上述情况下需要不同的绝对路径以及容器如何在这种情况下找到资源?
通过制作context root ='/',我找到了避免这种混淆的方法 这样我就不必在任何场景中包含'/ PathTest'。但是将上下文根作为'/'是一种好习惯吗?
答案 0 :(得分:0)
/PathTest
是Servlet / JSP术语中名为context path
的概念的值,它是servlet上下文的属性。
您面临两个环境:浏览器和Servlet / JSP容器。
浏览器(仅限)看到HTTP协议,以及通过它传输的任何内容:HTML,CSS和javascript。当您生成这些内容时,您需要在必要时放置/PathTest
,但这不是全部。现在context path
只在Servlet / JSP环境中有意义。你的浏览器什么都不知道,它可能会处理一些完全不相关的技术,甚至不是JSP容器,只关心它。
在Servlet / JSP容器中,您也不需要指定值/PathTest
,而您也不应该!如果需要,使用HttpServletRequest.getContextPath()
获取实际值。
现在让我们分别看一下案例:
在JSP中:<a href="">...</a>
将输出HTML,这是浏览器看到的内容,但内容是由JSP容器生成的,因此您需要输入值 context path
,以便链接可以正常工作。
&lt; a href =“&lt;%= request.getContextPath()%&gt; /html/1.html”&gt; 1.html&lt; / a&gt;
在web.xml中,不需要放置context path
,它只由服务器解释,服务器已经知道tcontext路径的值已经在其他地方了。
HttpServletResponse.sendRedirect(String location)
会向浏览器发送临时重定向响应(HTTP状态3xx)。因此,您需要手动包含上下文路径。在某些情况下,您可能希望在上下文路径之外重定向。
HttpServletRequest.getRequestDispatcher(String path)
仅用作在上下文路径中转发或包含资源的方式。