这里就以笔记的形式记录,就不展开讲。便于以后复习。
转发和包含
- 概念
- 请求转发:
Servlet
源组件先对请求做一些预处理操作,然后把请求转发给其他Web
组件(转发的目标组件)来完成包括生成响应结果在内的后续操作 - 包含:
Servlet
源组件把其他Web组件生成的响应结果包含到自身的响应结果中
- 请求转发:
- 共同点
- 源组件和目标组件处理的都是同一个客户端请求,共享同一个
ServletRequest
对象和ServletResponse
对象 - 目标组件可以是
Servlet
、JSP
、HTML
文档 - 都依赖于
javax.servlet.RequestDispatcher
接口来转发请求。
- 源组件和目标组件处理的都是同一个客户端请求,共享同一个
关于
javax.servletrequestDispatcher
接口javax.servlet.RequestDispatcher
是一个请求分发器。它有两个方法,通过这两个方法来进行请求的转发和包含
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
对象- 调用
ServletContext
对象的getRequestDispatcher(String path)
方法,path
指定目标组件的路径(绝对路径,由web
应用的根目录/
开头,必须是绝对路径,否则报错) - 调用
ServletRequest
对象的getRequestDispatcher(String path)
方法,path
指定目标组件的路径(相对路径,相对于当前Servlet
所在的目录,不以/
开头,但是,它还是可以接受绝对的路径的)
- 调用
forward()
方法执行的特点:
- 此方法先清空源组件用于存放响应数据正文的缓冲区(但不会清空
Header
和StatuCode
)。所以源组件生成的响应结果不会被发送到客户端。 - 在调用这个方法之前,如果已经提交了源组件的响应结果,会抛出
IlleageStaeexception
异常。
- 此方法先清空源组件用于存放响应数据正文的缓冲区(但不会清空
include()
方法执行的特点:
- 此方法执行时,会把目标组件生成的响应结果包含到源组件响应结果中。
重定向
- 重定向机制运作流程
- 用户在浏览器端输入
URL
,访问特定资源 - 服务器端返回一个
302
的状态码和一个URL
的响应结果 - 浏览器根据服务器端返回的
URL
自动重新向此URL
发起请求 - 浏览器端接收到响应结果
- 用户在浏览器端输入
HttpServletResponse
接口的重定向方法
HttpServletResponse
的sendRedirect(String location)
方法用于把请求重定向- 方法中的参数
location
可以以当前服务器根路径”/”,或者以http://
开头,来重定向到本服务器的另一个Servlet
或者页面,或者Internet
上任意一个有效的页面 - 在源组件中调用这个方法,那么源组件生成的响应结果,除了一个状态码
302
和一个重定向的URL
,不会发送其他任何响应结果给浏览器,但是在这个方法之后,如果还有代码需要执行,仍然会被执行 - 这个方法在调用时,一律自动返回状态码
302
,并且浏览器在收到状态码后,即刻自动重新请求给定的URL
- 如果在这个方法调用前,源组件提交了响应结果,那么抛出
IllegalStateException
异常
- 特点
- 重定向实际上是你在访问一个资源时,发送了两次请求,第一次请求,没有获取到需要的资源,服务器只是给你一个
URL
,让你重新向这个URL
再次发起请求,获取资源,不过这次请求是浏览器自动完成的 - 源组件和目标组件不共享同一
ServletRequest
和ServletResponse
对象(两次请求)。
- 重定向实际上是你在访问一个资源时,发送了两次请求,第一次请求,没有获取到需要的资源,服务器只是给你一个