[Java] 请求转发, 请求包含与请求重定向

[Java] 请求转发, 请求包含与请求重定向

请求转发: 

request.getRequestDispatcher("/DispatcherTest2").forward(request, response);

或 

this.getServletContext().getRequestDispatcher("/DispatcherTest2").forward(request, response);

Note:
1)一次请求只能转发一次, 否则会发生下面的异常: -- 可以得到第一次转发获取的数据
java.lang.IllegalStateException: Cannot forward after response has been committed
2)当有数据已经写到客户端时再请求转发也会抛出异常. 


3)若转发前有数据写入到response缓冲区,则请求转发会清空response缓冲区的实体内容, 但不会清空请求头信息. 


请求包含:

当需要将多个servlet的输出合并到一块打给浏览器时可以使用请求包含
request.getRequestDispatcher("/DispatcherTest2").include(request, response);
或 

this.getServletContext().getRequestDispatcher("/DispatcherTest2").include(request, response);


Notice:
    1) 被包含的Servlet程序不能改变响应消息的状态码和响应头,如果它里面存在这样的语句,这些语句的执行结果将被忽略.
    2)常被用来进行页面布局


请求重定向:

response.sendRedirect(request.getContextPath() + "/DispatcherTest2");
Notice:
1) 不能在数据已经发送到浏览器之后再进行请求重定向:
java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committed

2) 在请求重定向之前写入到response缓冲区的数据会被清空
3) 一次请求只能重定向一次



Summary:

请求重定向地址栏会发生变化.请求转发地址栏不发生变化.
请求重定向两次请求两次响应.请求转发一次请求一次响应.

如果需要在资源跳转时利用request域传递域属性则必须使用请求转发
如果希望资源跳转后修改用户的地址栏则使用请求重定向
如果使用请求转发也可以重定向也可以,则优先使用请求转发,减少浏览器对服务器的访问次数减轻服务器的压力.



发布了25 篇原创文章 · 获赞 36 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/DreamLi1314/article/details/78868084