1). 为什么要解决相对路径的问题:
在有一个 Servlet 转发页面的情况下, 会导致相对路径的混乱.
比如: -WebContent(当前WEB应用的名称)
-a.jsp
-test
-b.jsp
-c.jsp
超链接 转发 超链接
希望的是从a.jsp-----> HelloServlet------->b.jsp----->与b.jsp同一路径的c.jsp。
(此时的地址栏为/HelloServlet,而不是/test/b.jsp)
a.jsp: <a href="helloServlet">To B PAGE</a>
HelloServlet: request.getRequestDispatcher("/test/b.jsp").forward(request, response);
b.jsp: <a href="c.jsp">TO C Page</a>.
注意, 运行a.jsp后,点击 To B PAGE 超链接后的浏览器的地址栏的值: http://localhost:8989/day_36/HelloServlet, 虽然页面上显示的是test 路径下的 b.jsp。
而 b.jsp 页面有一个超链接: 默认情况下, href="c.jsp"是相对地址, c.jsp 应该和 b.jsp 在同一路径下。
此时点击TO C Page超链接后的浏览器地址栏显示: http://localhost:8989/day_36/c.jsp。因为 href="c.jsp"是相对路径,由于上一页面的浏览器地址为http://localhost:8989/day_36/HelloServlet,于是相对于HelloServlet 路径而言,href="c.jsp"的地址应该是 http://localhost:8989/day_36/c.jsp。
但在根目录下并没有 c.jsp, 所以会出现路径混乱的问题.
2). 使用绝对路径会解决以上的问题:
绝对路径: 相对于当前 站点 根目录的路径.
http://localhost:8989/day_36/c.jsp: 其中,http://localhost:8989/ 是当前 站点的根目录, /day_36 是 contextPath当前WEB应用的根目录,
/c.jsp 是相对于当前 WEB 应用的一个文件路径。 写绝对路径时,我们在需要当前 WEB 应用的路径下添加contextPath。.
比如:
<a href="helloServlet">To B Page</a>
分析:href="ToBServlet"没有/是相对路径,默认是相对于当前WEB应用的的路径。如果要写绝对路径,那么需要把当前WEB应用的路径添加上去,用ContextPath来表示。
需改为: <a href="<%= request.getContextPath() %>/helloServlet">To B Page</a>
response.sendRedirect("a.jsp");
分析:sendRedirect("a.jsp")没有/是相对路径,默认是相对于当前WEB应用的的路径。如果要写绝对路径,那么需要把当前WEB应用的路径添加上去,用ContextPath来表示。
需改为: response.sendRedirect(request.getContextPath() + "/a.jsp");
<form action="AddServlet"></form>
分析:action="AddServlet"没有/是相对路径,默认是相对于当前WEB应用的的路径。如果要写绝对路径,有时候需要把当前WEB应用的路径添加上去,用ContextPath来表示。
需改为: <form action="<%= request.getContextPath() %>/AddServlet"></form>
3). 在 JavaWEB 应用中 / 代表的是:
有时代表当前 WEB 应用的根目录, 有时代表的是站点的根目录。
问题在于:写绝对路径时,什么时候不用加ContextPath?以及什么时候不用加/?
1>/ 代表的是当前 WEB 应用的根路径:
若没有/是相对路径,只要相对路径正确可以不用管。若有 / 要写绝对路径。/ 所在的命令或方法需被 WEB 服务器解析, 而不是直接打给浏览器, 则 / 代表 WEB 应用的根路径.
此时编写绝对路径就不需要添加 contextPath 了,因为/本身就代表当前WEB 应用的根路径。
①请求转发:
request.getRequestDispatcher("/test/b.jsp").forward(request, response);
或<jsp:forward page="/test/b.jsp"></jsp:forward>
②在 web.xml 文件中做 Serlvet 映射路径时, <url-pattern>/helloServlet</url-pattern>里的/代表当前WEB应用根目录
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.tt.javaweb.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/helloServlet</url-pattern>
</servlet-mapping>
2>/ 代表的是站点的根目录:
若没有/是相对路径,只要相对路径正确可以不用管。若有 / 要写绝对路径。/直接交由浏览器解析, / 代表的就是站点的根路径,。
为了让路径完整需要把当前WEB应用的路径添加上去,此时必须加上 contextPath。
①请求重定向:
response.sendRedirect("/a.jsp");
分析:看到有/代表要写绝对路径。因为/代表当前站点,这样的路径不完整。
修改成:response.sendRedirect("<%= request.getContextPath() %>/a.jsp");
②超链接:
<a href="/helloServlet">To B Page</a>
分析:看到有/代表要写绝对路径。因为/代表当前站点,这样的路径不完整。
修改成: <a href="<%= request.getContextPath() %>/helloServlet">To B Page</a>
③表单中的action:
<form action="/helloServlet"></form>
分析:看到有/代表要写绝对路径。因为/代表当前站点,这样的路径不完整。
修改成: <form action="<%= request.getContextPath() %>/helloServlet"></form>
4). 如何获取 contextPath:
ServletContext: getContextPath()
HttpServletRequest: getContextPath()
5)几个路径的获取
//http://localhost:8080/20161024/login/b.jsp
String requestUrl = request.getRequestURL().toString();
///20161024/login/b.jsp
String requestUri = request.getRequestURI();
//获取请求的servletPath:servlet的映射路径:/login/b.jsp
String servletPath = request.getServletPath();