HttpServletResponse简介

本文记录Java学习过程中遇到的HttpServletResponse~

在Servlet的API中,定义了一个HttpServletResponse接口,它继承自ServletResponse接口,专门用来封装HTTP的响应消息。

由于HTTP的响应消息分为状态行、响应消息头和消息体三部分。因此,在HttpServletResponse接口中定义了向客户端发送响应状态码、响应消息头和响应消息体的方法。

发送状态码相关的方法

当Servlet向客户端发送响应消息时,需要在响应消息中设置状态码。为此,HttpServletResponse接口中,定义了两个发送状态码的方法,具体如下:

1.setStatus(int status)方法

该方法用于设置HTTP响应消息的状态码,并生成相应状态行。由于响应状态行中的状态描述信息直接与状态码相关,而HTTP版本由服务器确定。因此,只用通过setStatus(int status)方法设置了状态码,即可实现状态行的发送。需要注意的是,正常情况下,Web服务器会默认产生一个状态码为200的状态行。

2.sendError(int status)方法

该方法用于发送表示错误信息的状态码。例如,404状态码表示找不到客户端请求的资源。在response对象中,提供了两个重载的sendError方法,具体如下:

public void sendError(int code) throws java.io.IOException
public void sendError(int code, String message) throws java.io.IOException

在上面重载的两个方法中,第一个方法只是发送错误信息的状态码,而第二个方法除了发送状态码外,还可以增加一个用于提示说明的文本信息,该文本信息将出现在发送给客户端的正文内容中。

发送响应消息头相关的方法

1.addHeader(String name, String value)和setHeader(String name, String value)方法

这两个方法都是用来设置HTTP协议的响应头字段。其中,参数name用来指定响应头字段的名称,参数value用来指定响应头字段的值。不同的是,addHeader()方法可以增加同名的响应头字段,而setHeader()方法则会覆盖同名的头字段。

2.addIntHeader(String name, int value)和setIntHeader(String name, int value)方法

这两个方法专门用于设置包含整数值的响应头。避免了使用addHeader()和setHeader()方法时,需要将int类型的设置值转换为String类型的麻烦。

3.setContentLength(int len)方法

该方法用于设置响应消息的实体内容的大小,单位为字节。对于HTTP协议来说,这个方法就是设置Content-Length响应头字段的值。

4.setContentType(String type)方法

该字段用于设置Servlet输出内容的MIME类型,对于HTTP协议来说,就是设置Content-Type响应头字段的值。例如,如果发送到客户端的内容是jpeg格式的图像数据,就需要将响应头字段的类型设置为“image/jpeg”。需要注意的是,如果响应的内容为文本,setContentType()方法还可以设置字符编码,例如,text/html;charset=UTF-8。

5.setLocale(Locale loc)方法

该方法用于设置响应消息的本地化信息。对HTTP来说,就是设置Content-Language响应头字段和Content-Type头字段中的字符集编码部分。需要注意的是,如果HTTP响应消息没有设置Content-Type头字段,setLocale()方法设置的字符集编码不会出现在HTTP消息的响应头中;如果调用了setCharacterEncoding()或setContentType()方法指定了响应内容的字符集编码,setLocale()方法将不再具有指定字符集编码的功能。

6.setCharaceterEncoding(String charset)方法

该方法用于设置输出输出内容实用的字符编码。对HTTP协议来说,就是设置Content-Type头字段中的字符集编码部分。如果没有设置Content-Type头字段,setCharacterEncoding方法设置的字符集编码不会出现在HTTP消息的响应头中。setCharacterEncoding()方法比setContentType()和setLocale()方法的优先权高,它的设置结果将覆盖setContentType()和setLocale()方法所设置的字符码表。

注意:在上面列举的一系列方法中,addHeader()、setHeader()、addIntHeader()和setIntHeader()方法都是用于设置各种头字段的,而setContentType()、setLocale()和setCharacterEncoding()方法用于设置字符编码,这些设置字符编码的方法可以有效解决乱码问题。

发送响应消息体相关的方法

由于在HTTP响应消息中,大量的数据都是通过响应消息体传递的。因此,ServletResponse遵循以IO流传递大量数据的设计理念。在发送响应消息体时,定义了两个与输出流相关的方法,具体如下:

1.getOutputStream()方法

该方法所获取的字节输出流对象为ServletOutputStream类型。由于ServletOutputStream是OutputStream的子类,它可以直接输出字节数组中的二进制数据。因此,要想输出二进制格式的响应正文,就需要使用getOutputStream()方法。

2.getWriter()方法

该方法所获取的字符输出流对象为PrintWriter类型。由于PrintWriter类型的对象可以直接输出字符文本内容。因此,要想输出内容全为字符文本的网页文档,需要使用getWriter()方法。

注意:虽然response对象的getOutputStream()和getWriter()方法都可以发送响应消息体,但是他们之间互相排斥,不可同时使用,否则会发生IllegalStateException异常。

标签: none