总所周知:请求的转发与重定向是Servlet控制页面跳转的主要方法,在Web应用中使用的非常广泛,也是面试中问到servlet技术高频点。
请求转发
一个Web资源收到客户端的请求后,通知服务器去调用另一个Web资源进行处理,称之为请求转发。
分析:
(1)Servlet接收到浏览器端的请求后,进行了一定的处理。一开始不会进行响应,而是在服务器端内部“转发”给其它的Servlet程序进行继续处理。在这种情况下浏览器只会发出1次请求,浏览器的URL地址栏也不会发生改变,用户是感受不到请求转发的操作。
(2)转发请求的Servlet和目标的Servlet共享同一个request对象。
(3)实现转发的API
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//1.使用RequestDispatcher对象封装目标资源的绝对路径
RequestDispatcher dispatcher = request
.getRequestDispatcher("/pages/login.html");
//2.调用RequestDispatcher对象的forward()方法“前往”目标资源
//注意:传入的参数必须是传递给当前Servlet的service方法的那两个ServletRequest和ServletResponse对象
dispatcher.forward(request, response);
}
请求重定向
一个web资源收到客户端请求后,通知客户端去访问另外一个web资源,称之为请求重定向。
分析:
(1)Servlet接收到浏览器端请求并处理完成后,给浏览器端一个特殊的响应,这个特殊的响应要求浏览器去请求一个新的资源,整个过程中浏览器端会发出两次请求,且浏览器地址栏会改变为新资源的地址。
(2)在重定向请求情况下,原Servlet和目标资源之间就不能共享请求域数据。
(3)实现重定向的API
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//1.调用HttpServletResponse对象的sendRedirect()方法
//2.传入的参数是目标资源的绝对路径
response.sendRedirect(request.getContextPath()+"/pages/login.html);
}
两者区别
请求转发(由服务器解析) | 请求重定向(由浏览器解析) | |
---|---|---|
浏览器地址 | 不改变 | 改变 |
客户端发送请求次数 | 1 | 2 |
是否共享request对象数据 | 是 | 否 |
能否共享目标资源WEB-INF下资源 | 能 | 否 |
☝上述分享来源个人总结,如果分享对您有帮忙,希望您积极转载;如果您有不同的见解,希望您积极留言,让我们一起探讨,您的鼓励将是我前进道路上一份助力,非常感谢!我会不定时更新相关技术动态,同时我也会不断完善自己,提升技术,希望与君同成长同进步!
☞本人博客:https://coding0110lin.blog.youkuaiyun.com/ 欢迎转载,一起技术交流吧!