在JDK中,这个接口没有任何子接口和实现类。但是在ServletContext接口(Defines a set of methods that a servlet uses to communicate with its servlet container)中有几个get方法来获得RequestDispatcher对象。
RequestDispatcher接口,也仅有两个方法:
void forward(ServletRequest request, ServletResponse response),把一个request从一个Servlet中转发到服务端的另一处资源(servlet, JSP file, or HTML file)。
该方法允许一个servlet对请求进行初步处理,并允许另一个资源生成响应。
对于通过getRequestDispatcher()获得的RequestDispatcher, ServletRequest对象调整了其路径元素和参数,以匹配目标资源的路径。
forward()方法,应该在将response提交给客户机之前(在response body output被刷新之前)调用。如果response已经被提交了,调用forward()会抛出IllegalStateException。 response缓冲区中未提交的输出,在forward()调用前,会自动被清除。(Uncommitted output in the response buffer is automatically cleared before the forward.)
传递给forward的两个对象,要和servlet中service方法中获得的对象是相同的。即针对的是同一次请求过程。
void include(ServletRequest request, ServletResponse response),这个方法用于向response中添加一些资源(servlet, JSP page, HTML file)。
这里就涉及到ServletResponse对象了,它代表着一个要被返回的Response。ServletResponse对象也由Servlet容器创建,(在这样的一个转发过程中)它的路径元素和参数与调用者的保持不变(The ServletResponse object has its path elements and parameters remain unchanged from the caller\'s. )而且进行include操作的servlet,无法改变response的状态码,也无法设置header信息,这样的操作会被无视掉。(why?)
这里 include方法的ServletRequest request和ServletResponse response必须与传递给调用该include方法的servlet的service方法的两个ServletRequest request和ServletResponse response是同一对(反正一般也不会自己创建了),或者是包装前面这两个对象的ServletRequestWrapper或ServletResponseWrapper类的子类。
三、ServletResponse接口
3.1
HttpServletResponse接口的父接口,定义一个对象来帮助servlet向客户端发送response。
Servlet容器会创建一个 ServletResponse对象,然后与ServletRequest一起传递给servlet的service方法。
如果要在MIME body response中发送二进制数据,请使用getOutputStream()返回的ServletOutputStream。(什么是MIME)
要发送字符数据,使用getWriter()返回的PrintWriter对象。
要混合二进制和文本数据,例如,创建一个multipart响应,请使用ServletOutputStream并手动管理字符部分。
MIME主体响应的字符集可以使用以下任何一种技术显式指定:
per request, per web-app (using ServletContext.setRequestCharacterEncoding(java.lang.String), deployment descriptor(即web.xml)), and per container (for all web applications deployed in that container, using vendor specific configuration(更改web容器的配置)).
如果使用了前面提到的多种技术,那么优先级就是所列的顺序。
对于每个请求,可以使用本接口中的setCharacterEncoding(java.lang.String)和setContentType(java.lang.String)方法显式地指定响应的字符集,或者隐式地使用setLocale(java.util.Locale)方法 。
显式规范优先于隐式规范。如果没有明确指定字符集,将使用ISO-8859-1。
setCharacterEncoding、setContentType或setLocale方法的调用必须在getWriter之前,并在提交要使用的字符编码的响应之前
3.2 方法
ServletResponse接口定义的方法并不复杂,都和设置response的相关的格式有关,其中的一些会设置reponse header。
四、再谈谈ServletContext接口
前面已经提到过了,ServletContext中定义了一系列方法让servlet与servlet容器打交道,例如获取文件的MIME类型、分派request或写入日志文件。
每个Java虚拟机中的每个“web应用程序”,都有一个上下文(context)。
而一个“Web Application”的定义: