请求转发forward
-> xxServlet收到请求
-> 直接转发给yyServlet
-> yyServlet返回给客户端
整个过程中,客户端发出一个请求,收到一个响应。
实现:
方式一:利用RequestDispather接口中的forward方法实现请求转发。
RequestDispather实例对象
RequestDispather实例对象是由Servlet引擎创建的,它用于包装一个要被其他资源调用的资源(例如Servlet,HTML文件,JSP文件等),并可以通过其中的方法将客户端的请求转发给所包装的资源。
public class forwardServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {PrintWriter out=response.getWriter();System.out.println("forwardServlet's doGet");String path="testServlet";//1.调用HttpServletRequest的getRequestDispatcher()方法,调用时需要传入转发的地址;RequestDispatcher requestDispatcher=request.getRequestDispatcher(path);//2.调用HttpServletRequest的forward(request,response)方法进行请求的转发;requestDispatcher.forward(request,response);}}
代码流程分析
- forwardServlet收到客户端的请求后,forwardServlet调用HttpServletRequest的getRequestDispatcher()方法,
- forward(request,response)方法进行请求转发,将请求直接转发给testServlet
- testServlet将响应返回给客户端。
请求重定向redirect
xxServlet收到请求,然后发出一个响应给客户端,客户端立即又发送一个请求访问xxServlet中给的URL,即yyServlet的路径,然后yyServlet给客户端一个响应。整个过程中,客户端发出两个请求,收到两个响应。
实现
利用HttpServletResponse的sendRedirect(path)方法实现请求重定向。
public class redirectServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("redirectServlet's doGet");String path="testServlet";response.sendRedirect(path);}
}
区别
转发 Forward | 重定向 sendRedirect |
---|---|
服务器端的跳转 | 客户端的跳转 |
服务器直接将请求转发到其他JSP或者Servlet | 服务器会返回客户端一个响应报头和新的URL地址 |
参数的信息原封不动的传递 | 原来的参数信息如果服务器没有特殊处理就不存在了 |
请求转发不知道,他只需要有返回即可; | 请求重定向,前端知道后端访问了多少个servlet |
请求转发始终显示的是原来的servlet,转发只能看见第一次访问的页面URL,以后的工作都是有服务器来做的 | 重定向会改变地址栏的url地址,会直接显示出被重定向之后的结果,也就是说重定向可以看见目标页面的URL |
请求转发只能在自己项目内转发,不可以到外部地址 | 方法不仅可以重定向到当前应用程序中的其他资源,还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源 |
使用转发后,之前的request中存放的变量不会失效,就像两个页面拼在了一起,调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程 | 使用重定向后,之前的request中存放的变量全部失效,并进入一个新的request作用域 |