servlet · 2019-09-01 0

Servlet转发与重定向和JSP路径问题

存在的问题

相对路径,相对于当前资源的路径,转发可能会导致相对路径出现问题

所有推荐Servlet转发与重定向和JSP都使用绝对路径

一、JSP 路径

假如当前项目名为 JavaWeb,所有页面上的绝对路径,/ 都是代表从服务器根开始,http://localhost:8080

栗:<a href="/hello.jsp"></a> 代表访问路径为 http://localhost:8080/hello.jsp,我们需要的是 http://localhost:8080/JavaWeb/hello.jsp

修改如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    String path = request.getContextPath();
// 获得项目完全路径(获得到的地址就是 http://localhost:8080/JavaWeb/)
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<html>
<head>
    <!-- base需要放到head中 -->
    <base href="<%=basePath%>">
</head>
<body>
    <!-- 指定了base,这里使用相对路径,此时相对于base -->
    <a href="hello.jsp"></a>
</body>
</html>

二、Servlet 转发

Servlet 转发,以 / 开始,代表的是项目根开始,http://localhost:8080/JavaWeb

// 转发到 http://localhost:8080/JavaWeb/hello.jsp
request.getRequestDispatcher("/hello.jsp").forward(request, response);

三、Servlet 重定向

Servlet 重定向,以 / 开始,代表的是从服务器根开始,http://localhost:8080

使用 request.getContextPath() 获得项目根路径(即 /JavaWeb),

// 重定向到http://localhost:8080/JavaWeb/hello.jsp
response.sendRedirect(request.getContextPath() + "/hello.jsp");

另:为了实现重定向,在 HttpServletResponse 接口中定义了一个 sendRedirect() 方法,该方法用于生成 302 响应码和 Location 响应头,从而通知客户端重新访问 Location 响应头中指定的URL。