欢迎大家关注本博,同时欢迎大家评论交流,可以给个赞哦!!!
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相对比较简单,主要涉及了响应主体写入、响应字符集、响应缓存相关、响应提交、区域设置等。
若文中存在错误和不足,欢迎指正!
本博微信公众号“超哥说码”,欢迎大家订阅,公众号正在完善中,会及时将更优质的博文推送于您!