1、HttpServletRespon对象
在Servlet API中,定义了一个HttpResponse接口,它继承于ServletResponse接口,专门用于封装HTTP响应消息
HTTP响应消息分为响应状态行、响应消息头、响应消息体三部分,所以HttpResponse接口中定义了向客户端发送响应状态码、响应消息头、响应消息体的方法
1.1 发送状态码相关的方法
当Servlet向客户端回送响应消息时,需要在响应消息中设置状态码,状态码代表客户端请求服务器的结果
- 1、setStatus(int status)方法
功能:设置HTTP响应消息的状态码并生成响应状态行
解释:响应状态行中的状态描述信息直接与状态码相关,而HTTP版本由服务器确定,所以只要通过此方法设置了状态码,即可实现状态行的发送
- 2、sendError(int sc)方法
功能:发送表示错误信息的状态码
- 3、sendError(int code,String message)方法
功能:除了设置状态码外,还会向客户端发送一条错误信息
解释:服务器默认会创建一个HTML格式的错误服务页面作为响应结果,其中包含参数message指定的文本信息,这个HTML页面的内容类型为“text/html”,保留cookies和其他未修改的响应头信息。如果一个对应传入的错误码的错误页面已经在web.xml中声明,那么这个声明的错误页面会将优先建议的message参数服务于客户端
1.2 发送响应消息头相关的方法
当Servlet向客户端发送响应消息时,由于HTTP协议的响应消息头字段有很多种,所以Httpresponse接口定义了一系列设置HTTP响应头字段的方法
- 1、void addHeader(String name,String value)方法和void setHeader(String name,String value)方法
参数:name为响应头字段的名称,value为响应头字段的值
相同处:这两个方法都是用于设置HTTP协议的响应头字段
不同处:addHeader()方法可以增加同名的响应头字段,而setHeader()方法会覆盖同名的头字段
- 2、void addIntHeader(String name,int value)方法和void setIntHeader(String name,int value)方法
相同处:这两个方法都是专门用于设置包含整数值的响应头。避免调用addHeader()和setHeader()方法时,需要将int类型的设置值转换为String类型的麻烦
- 3、void setContentLength(int len)方法
该方法用于设置响应消息的实体内容大小,单位为字节。对于HTTP协议来说,这个方法就是设置Content-Length响应头字段的值
- 4、void setContentType(String type)方法
该方法用于设置Servlet输出内容的MIME类型,对于HTTP协议来说,就是设置Content-Type响应头字段的值。
例如,如果发送到客户端的内容是JPEG格式的图像数据,就需要将响应头字段的类型设置为“image/jpeg”。
需要注意的是,如果响应的内容为文本,该方法还可以用于设置字符编码,例如text/html;charset=UTF-8
- 5、void setLocale(Locale loc)方法
该方法用于设置响应消息的本地化信息,对于HTTP来说,就是设置Content-Language响应头字段和Content-Type头字段中的字符集编码部分。
需要注意的是,如果HTTP消息没有设置Content-Type头字段,setLocale()方法设置的字符集编码不会出现HTTP消息的响应头中,如果调用setCharacterEncoding()方法或setContentType()方法指定了响应内容的字符集编码,setLocale()方法将不在具有指定字符集编码的功能
- 6、void setCharacterEncoding(String charset)方法
该方法用于设置输出内容使用的字符编码,对于HTTP协议来说,就是设置Content-Type头字段中的字符集编码部分。如果没有设置Content-Type头字段,setCharacterEncoding()方法设置的字符集编码不会出现在HTTP消息的响应头中。
setCharacterEncoding()方法的优先权比setContentType()和setLocale()高,它的设置结果将覆盖后两个方法的设置结果
总结:addHeader()、setHeader()、addIntHeader()、setIntHeader()方法用于设置各种头字段,而setContentType()、setLocale()和setCharacterEncoding()方法用于设置字符集编码,这些设置字符编码的方法可以有效解决中文字符乱码问题
1.3 发送响应消息体相关的方法
在HTTP响应消息中,大量数据都是通过响应消息体传递的,所以ServletResponse遵循IO流传递大量数据的设计理念。
在发送响应消息体时,定义了两个与输出流相关的方法:
- 1、getOutputStream()方法
该方法获取的字节输出流对象为ServletOutputStream类型。由于ServletOutputStream类型是OutputStream的子类,所以它可以直接输出字节数组中的二进制数据。因此要输出二进制格式的响应正文,就需要调用getOutputStream()方法
- 2、getWriter()方法
该方法所获取的字符输出流对象为PrintWriter类型。因为PrintWriter类型的对象可以直接输出字符文本内容,所以想要输出内容为字符文本的网页文档,就需要调用getWriter()方法
2、HttpServletResponse应用
2.1实现请求重定向
在某些情况下,针对客户端的请求,一个Servlet类可能无法完成全部工作,这时可以使用请求重定向来完成
请求重定向是指Web服务器接收到客户端的请求后,可能由于某些条件限制,不能访问当前请求的URL所指向的Web资源,而是指定了一个新的资源路径,让客户端重新发送请求
为了实现请求重定向,HttpServletResponse接口定义了一个sendRedirect()方法,该方法用于生成302响应码和Location响应头,从而通知客户端重新访问Location响应头中指定的URL
该方法完整声明:
public void sendRedirect(java.lang.String location)throws java.io.IOException
参数location可以使用相对URL,Web服务器会自动将相对URL翻译成绝对URL,再生成Location头字段
案例:用户登录
先在Web目录下写login.html和welcome.html
编写一个ServletLogin类用于处理用户的登录请求
结果: