一、请求转发与重定向区别
简单理解:
请求转发:当你要租房时,你去找中介,中介帮你找房源,你只向中介发起一次请求,中介将你的信息发送给挑剔的房东(请求转发中的请求所带的参数传递),房东同意租房,中介找到房源返回给你,房源是房东的,不是中介的,中介只是帮你找房东,最终你还是向房东租房(业务逻辑不是你请求的资源实现的)。
**重定向:**当你要租房时,你去问商店老板有房子租吗(向商店发一次请求),商店老板说没有剩余房子出租,但是隔壁应该有房子出租(重定向到隔壁),然后你又去隔壁询问(又一次发起请求),隔壁说有,你成功租到房子。
具体含义:
重定向:
-
可以理解为是客户端行为,客户端发起一次请求,服务器端给出一次响应,但这个响应包含下一次客户端需要访问的服务器端处理程序的地址,客户端再次发起请求,将会得到处理结果,也就意味着重定向客户端至少发起两次请求
-
当使用了重定向跳转页面后,在其客户端路径栏显示的应该是其重定向的路径,客户端是可以观察到页面地址变化的,重定向是客户端至少做了两次访问请求的
请求转发:
-
可以理解是服务器端行为,客户端发起一次请求,这个请求在整个服务器端可以被多次传递,但都是由服务器端的处理程序传递给另一个处理程序,客户端不需要发起二次请求,无论这个请求经历过多少个处理程序,始终都是同一个请求,也就意味着,这个请求中的数据经历过的每一个处理程序都可以使用
-
中间传递的是自己容器的request,客户端的路径栏显示的还是第一次访问的路径,客户端是感觉不到服务器做了转发的,请求转发客户端是只做了一次请求。
设置重定向的两种方式
@WebServlet("/responseServlet")
public class ResponseServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//方式一:使用状态码302与设置响应头Location来重定向
response.setStatus(302);
response.setHeader("Location","Servlet2");
//方式二:使用response.sendRedirect()方法来重定向
// response.sendRedirect("Servlet2");
System.out.println("response");
}
}
设置请求转发的方式:
@WebServlet("/requestServlet")
public class RequestServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通过request对象的getRequestDispatcher()方法获得Servlet2的路径,在通过forward方法将参数传递给Servlet2
request.getRequestDispatcher("Servlet2").forward(request,response);
}
}
跳转页面Servlet2
@WebServlet("/Servlet2")
public class Servlet2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("servlet2");
response.getWriter().print("this is servlet2");
}
}