存在的问题
相对路径,相对于当前资源的路径,转发可能会导致相对路径出现问题
所有推荐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。