重定向
sendRedirect(xxx)
重定向是客服端行为 ,流程是
- 客户端发送http请求给服务器
- 服务器接收请求后发送302状态码和新的请求地址给客户端
- 客户端接收到302状态码后,会自动发送新的http请求到新的请求地址
所以重定向一共有两次请求,地址栏会发生变化,因为是新的请求所以request不能传递
请求转发
request.getRequestDispatcher("xxxxx").forward(request,response );
请求转发是服务器行为,流程是
- 客户端发送http请求给服务器
- 服务器接收请求后在内部自己转发到新的地址
- 服务器返回响应给客户端
所以请求转发只有一次转发,地址栏不会变,一直都是第一次的地址,request可以传递
路径问题
- 重定向因为是从客户端发来的,所以只知道发到那个服务器,不知道发给那个项目,所以重定向的"/"表示"http:服务器ip:8080/"
- 请求转发因为服务器内部自己转发,因此知道发给那个项目,所以请求转发的"/"表示"http:服务器ip:8080/项目名/"
- 重定向没有"/"表示在当前目录,请求转发没有"/"表示相对于当前资源的相对路径
额外记录一下
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<base href="<%=basePath%>">
在jsp中加入这段代码,表示当前的基础路径为"http:服务器ip:8080/项目名/",对后面的路径提交很方便友好