Servlet规范系列 之 ServletResponse源码分析

欢迎大家关注本博,同时欢迎大家评论交流,可以给个赞哦!!!

  ServletResponse由Servlet容器来管理,当客户请求到来时,容器创建一个ServletRequest对象,封装请求数据,同时创建一个ServletResponse对象,封装响应数据。这两个对象将被容器作为service()方法的参数传递给Servlet,Servlet利用ServletRequest对象获取客户端发来的请求数据,利用ServletResponse对象发送响应数据。

  ServletResponse

  ServletResponse主要用于响应的封装,提供了很多响应相关操作,具体API如下:

package javax.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Locale;

/**
 * 定义一个对象来帮助servlet向客户机发送响应.
 * Servlet容器创建一个ServletResponse对象,并将其作为参数传递给Servlet的service方法.
 * 要在MIME主体响应中:
 * 发送二进制数据,请使用getOutputStream返回的ServletOutputStream.
 * 发送字符数据,请使用getWriter返回的PrintWriter对象.
 * 要混合二进制和文本数据,例如,要创建多部分响应,请使用ServletOutputStream并手动管理字符部分.
 * MIME正文响应的字符集可以使用setCharacterEncoding和setContentType方法显式指定,也可以隐式使用setLocale方法指定,显式规范优先于隐式规范.
 * 如果没有指定字符集,将使用ISO-8859-1.
 * 必须在getWriter之前和提交要使用的字符编码的响应之前调用setCharacterEncoding、setContentType或setLocale方法.
 */
public interface ServletResponse {
    
    

    /**
     * 返回用于此响应中发送的正文的字符编码(MIME字符集)的名称.
     * 字符编码可能是使用setCharacterEncoding或setContentType方法显式指定的,也可能是隐式使用setLocale方法指定的.显式规范优先于隐式规范.
     * 在调用getWriter或在提交响应之后对这些方法的调用对字符编码没有影响.如果未指定字符编码,则返回ISO-8859-1.
     * @return Character Encoding,例如:UTF-8.
     */
    public String getCharacterEncoding();

    /**
     * 返回用于此响应中发送的MIME正文的内容类型.
     * 在提交响应之前,必须使用setContentType指定正确的内容类型.
     * 如果未指定内容类型,则此方法返回null.
     * 如果已指定内容类型,并且已显式或隐式指定字符编码,如getCharacterEncoding或getWriter中所述,则返回的字符串中包含charset参数.如果未指定字符编码,则省略charset参数.
     * @return Content-Type,例如:text/html; charset=UTF-8
     */
    public String getContentType();

    /**
     * 返回ServletOuputStream用于在response中写入二进制数据.
     * Servlet容器不编码二进制数据.
     * 调用ServletOutputStream的flush()方法提交response.
     * ServletOutputStream和PrintWriter不可同时使用.
     * @return ServletOutputStream实例.
     */
    public ServletOutputStream getOutputStream() throws IOException;

    /**
     * 返回一个getWriter对象,该对象可以向客户端发送字符文本.
     * PrintWriter使用getCharacterEncoding返回的字符编码.
     * 如果响应的字符编码没有按照getCharacterEncoding中的描述指定(即,该方法只返回默认值ISO-8859-1),
     *  则getWriter将其更新为ISO-8859-1.
     * 调用PrintWriter的flush()方法提交response.
     * PrintWriter和ServletOutputStream不可同时使用.
     * @return PrintWriter实例.
     */
    public PrintWriter getWriter() throws IOException;

    /**
     * 设置发送到客户端的响应的字符编码(MIME字符集),例如UTF-8.
     * 如果字符编码已经由setContentType或setLocale设置,则此方法将重写它.
     * 可以重复调用此方法来更改字符编码.如果在调用getWriter之后或在提交响应之后调用它,则此方法无效.
     * 如果协议提供了一种方法,容器必须将用于servlet响应的编写器的字符编码传递给客户机.
     * 在HTTP的情况下,字符编码作为文本媒体类型的Content-Type报头的一部分进行通信.
     * 请注意,如果Servlet没有指定内容类型,则字符编码不能通过HTTP头进行通信.但是,它仍然用于对通过Servlet响应的编写器写入的文本进行编码.
     * @param 编码字符串.
     */
    public void setCharacterEncoding(String charset);

    /**
     * 在HTTP响应头Content-Length中设置响应体内容的长度.
     * @param 指定返回给客户端的内容的长度.设置Content-Length头.
     */
    public void setContentLength(int len);

    /**
     * 如果尚未提交响应,则设置发送到客户端的响应的内容类型.
     * 给定的内容类型可以包括字符编码规范,例如,text/html;charset=UTF-8.
     * 如果在调用getWriter之前调用此方法,则仅从给定的内容类型设置响应的字符编码.
     * 可以重复调用此方法来更改内容类型和字符编码.如果在提交响应后调用此方法,则此方法无效.
     * 如果在调用getWriter之后或在提交响应之后调用它,则不会设置响应的字符编码.
     * @param MIME类型.
     */
    public void setContentType(String type);

    /**
     * 设置响应正文的首选缓冲区大小.Servlet容器将使用至少与请求大小相同的缓冲区.实际使用的缓冲区大小可以使用getBufferSize.
     * 更大的缓冲区允许在实际发送任何内容之前写入更多内容,从而为Servlet提供更多时间来设置适当的状态代码和标头.
     * 较小的缓冲区减少了服务器内存负载,并允许客户端更快地开始接收数据.
     * 必须在写入任何响应正文内容之前调用此方法.如果已写入内容或已提交response,则此方法将抛出IllegalStateException.
     * @param 缓冲区大小.
     */
    public void setBufferSize(int size);

    /**
     * 返回用于响应的实际缓冲区大小.
     * 如果不使用缓冲,则此方法返回0.
     * @return 使用实际缓冲区大小.
     */
    public int getBufferSize();

    /**
     * 强制将缓冲区中的任何内容写入客户端.对此方法的调用会自动提交响应,这意味着将写入状态代码和标头.
     * @throws IOException .
     */
    public void flushBuffer() throws IOException;

    /**
     * 清除响应中基础缓冲区的内容,而不清除标头或状态码.如果响应已提交,此方法将抛出IlleglaStateException.
     */
    public void resetBuffer();

    /**
     * 返回一个布尔值,指示是否已提交响应.已提交的响应已写入其状态代码和标头.
     */
    public boolean isCommitted();

    /**
     * 清除缓冲区中存在的所有数据以及状态代码和标头.如果响应已提交,此方法将抛出IlleglaStateException.
     */
    public void reset();

    /**
     * 在response未提交时,设置response的locale.
     * 如果尚未使用setContentType或setCharacterEncoding设置字符集、getWriter尚未被调用、response尚未被提交,它还会为区域设置适当的响应字符编码.
     * 可以重复调用此方法来更改区域设置和字符编码.如果在提交响应后调用该方法,则该方法无效.
     * 如果在使用字符集规范调用setContentType之后、调用setCharacterEncoding之后、调用了getWriter之后,或者在响应被提交之后调用,它不会设置响应的字符编码.
     * 如果协议提供了一种方法,容器必须将用于servlet响应的编写器的区域设置和字符编码传递给客户端.
     * 在HTTP的情况下,语言环境通过Content-Language报头进行通信,字符编码作为文本媒体类型的Content-Type报头的一部分.
     * 请注意,如果Servlet没有指定内容类型,则字符编码不能通过HTTP头进行通信.但是,它仍然用于对通过Servlet响应的编写器写入的文本进行编码.
     * @param loc locale.
     */
    public void setLocale(Locale loc);

    /**
     * 返回使用setLocale指定的区域设置.setLocale在response提交之后不会生效.
     * 如果没有指定locale,返回容器默认的locale.
     * @return locale.
     */
    public Locale getLocale();

}

  ServletResponse的API相对比较简单,主要涉及了响应主体写入、响应字符集、响应缓存相关、响应提交、区域设置等。

  若文中存在错误和不足,欢迎指正!

本博微信公众号“超哥说码”,欢迎大家订阅,公众号正在完善中,会及时将更优质的博文推送于您!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/securitit/article/details/108046073
今日推荐