request 转发,转发包含,重定向

1)实现转发实现


// [1] 实现转发
RequestDispatcher dispatcher = request.getRequestDispatcher("/Demo01"); // 直接就是<url-pattern> 中的路径
dispatcher.forward(request, response);

// 使用转发之前不能使用 PrintWrite out = response.getWrite();  
out.print("你好");  输出,这样写没有什么错,
但是一旦使用  out.flush(); // 清空缓存,显示内容就会。 报错
java.lang.IllegalStateException:




// [2]实现转发包含
RequestDispatcher dispatcher = request.getRequestDispatcher("/Demo01"); // 直接就是<url-pattern> 中的路径
dispatcher.include(request, response); // 既可以携带上 转发前servelt 输出内容,又可以输出 转发后页面的数据。




/*
* [1] 共享同一个 requeset 对象。
* [2] 可以使用 setAttribute  getAttribute
* [3] forward 可以访问 同一个项目下的 所有资源文件,比如 /WEB-INF/web.xml 文件  (WEB-INF目录下的资源是私有化的,通过路径的方式不能登陆进去,而forward不是通过路径访问的,所以可以访问。include 也不能访问这个目录。)

* 注意点 :使用forward 和 include 不会改变 地址。 重定向会改变路径
*    其中跳转的路径地址直接就是 web.xml 中 <url-paramter>中的地址值
*    

* */
// [3]实现重定向
response.sendRedirect("Demo02"); // 地址栏  /项目名/servlet名  但是直接填  servlet名字 在地址自动生成了 /Day927/Demo02


//地址栏会发生变化
// 是客户端的两次访问服务器,所以在地址栏发生变化,所以在重定向到另一个页面,使用的是 doget() 方法。


//在重定向情况下,第二次的request是找不到第一次request域对象中的内容


//在重定向情况下,request域对象不能用了,我们servletContext域对象替代。


——————————————————————————————————————————————————————————
请求转发和请求包含
1. 都是在一个请求中跨越多个Servlet
2. 多个Servlet在一个请求中,他们共享request对象,就是AServlet中setAttribute()保存数据在BServlet中getAttribute()取出数据
3. AServlet转发到BServlet,那么整个请求由BServlet来完成,AServlet不在插手
4. AServlet包含BServlet,那么两个Servlet共同完成处理请求。
5. 请求转发和请求包含都需要使用一个对象RequestDispatcher


RequsetDispatcher rd = request.getRequestDispatcher("/BServlet"); //参数路径与被转发或被包含的Servlet的<url-pattern>一致
rd.forward(request,response);  //请求转发 
rd.include(request,response);  //请求包含




请求转发: 由AServlet转发到BServlet


在AServlet中可以添加响应头,不能添加响应体。




请求包含:AServlet包含BServlet
在AServlet中既可以添加响应头,也可以添加响应体。


请求转发是一个请求,而重定向是2个请求
请求转发后浏览器地址栏不会发生变化,重定向会发生变化
请求转发的目标只能是本项目中的资源,重定向的目标可以是其他应用
请求转发对AServlet和BServlet的请求方法是相同的,就是要么都是GET,要么都是POST,因为他们是同一个请求。
请求转发可以在多个Servlet中共享request的数据,而重定向不行。





你可能感兴趣的:(javaweb)