请求重定向,请求转发

重定向机制的运作流程:
1、用户在浏览器端输入特定URL,请求访问服务器端的某个组件
2、服务器端的组件返回一个状态码为302的响应结果。
3、当浏览器端接收到这种响应结果后,再立即自动请求访问另一个web组件
4、浏览器端接收到来自另一个web组件的响应结果。

HttpServeltResponse的sendRedirect(String location)用于重定向

特点:
1.Servlet源组件(下图中的Servlet1)生成的响应结果不会被发送到客户端。response.sendRedirect(String location)方法一律返回状态码为302的响应结果。
2.如果源组件在进行重定向之前,已经提交了响应结果,会抛出IllegalStateException。为了避免异常,不应该在源组件中提交响应结果。
3.在Servlet源组件重定向语句后面的代码也会执行。
4.源组件和目标组件不共享同一个ServletRequest对象。
5.对于sendRedirect(String location)方法的参数,如果以“/”开头,表示相对于当前服务器根路径的URL。以“http"//”开头,表示一个完整路径。
6.目标组件(下图中的Servlet2)不必是同一服务器上的同一个web应用的组件,它可以是任意一个有效网页。

 

 

 

请求转发:

一个Servlet对象无法获得另一个Servelt对象的引用;如果需要多个Servet组件共同协作(数据传递),只能使用Servelt规范为我们提供的两种方式:
--请求转发:Servlet(源组件)先对客户请求做一些预处理操作,然后把请求转发给其他web组件(目标组件)来完成包括生成响应结果在内的后续操作。
--包含:Servelt(源组件)把其他web组件(目标组件)生成的响应结果包含到自身的响应结果中。
转发包含的共同点
--源组件和目标组件处理的都是同一个客户请求,源组件和目标组件共享同一个ServeltRequest和ServletResponse对象
--目标组件都可以为Servlet、JSP或HTML文档
--都依赖 javax.servlet.RequestDispatcher接口

“RequestDispather”

表示请求分发器,它有两个方法:
  forward():把请求转发给目标组件
  public void forward(ServletRequest request,ServletResponse response)
             throws ServletException,java.io.IOException


  include():包含目标组件的响应结果
  public void include(ServletRequest request,ServletResponse response)
             throws ServletException,java.io.IOException
得到RequestDispatcher对象
  1、ServletContext对象的getRequestDispather(String path1)
    path1必须用绝对路径,即以”/”开头,若用相对路径会抛出异常IllegalArgumentException
  2、ServletRequest对象的getRequestDispatcher(String path2)
    path2可以用绝对路径也可以用相对路径

 

dispatcher.forward(request,response)的处理流程:


1、清空用于存放响应正文数据的缓冲区
2、如果目标组件为Servlet或JSP,就调用它们,把它们产生的响应结果发送到客户端;如果目标组件为文件系统中的静态HTML文档,就读取文档中的数据并把它发送给客户端。
特点:
1、由于forward()方法先清空用于存放响应正文数据的缓冲区,因此源组件生成的响应结果不会被发送到客户端,只有目标组件生成的响应结果才会被送到客户端。
2、如果源组件在进行请求转发之前,已经提交了响应结果(如调用了response的flush或close方法),那么forward()方法会抛出IllegalStateException。为了避免该异常,不应该在源组件中提交响应结果。

 

include()方法的处理流程:


1、如果目标组件为Servlet或JSP,就执行它们,并把它们产生的响应正文添加到源组件的响应结果中;如果目标组件为HTML文档,就直接把文档的内容添加到源组件的响应结果中。
2、返回到源组件的服务方法中,继续执行后续代码块。
特点:
1、源组件与被包含的目标组件的输出数据都会被添加到响应结果中。
2、在目标组件中对响应状态代码或者响应头所做的修改都会被忽略。

 

----------------------------request-------------------------------

request对象实现请求转发:请求转发指一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理。
request对象提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发。
request对象同时也是一个域对象,开发人员通过request对象在实现转发时,把数据通过request对象带给其它web资源处理。
setAttribute方法
getAttribute方法  
removeAttribute方法
getAttributeNames方法

----------------------------请求范围------------------------------------

web应用范围内的共享数据作为ServeltContext对象的属性而存在(setAttribute),只要共享ServletContext对象也就共享了其数据。
请求范围内的共享数据作为ServletRequest对象的属性而存在(setAttribute),只要共享ServletRequest对象也就共享了其数据。

 

posted @ 2017-11-08 11:27  fengyu后  阅读(767)  评论(0编辑  收藏  举报