Web服务器收到一个http请求,会针对每个请求创建一个HttpServletRequest和HttpServletResponse对象,向客户端发送数据的是HttpServletResponse,从客户端取数据的是HttpServletRequest;HttpServletResponse对象可以向客户端发送三种类型的数据分别为1)响应消息头2)状态码3)消息正文,Servlet API中定义的ServletResponse接口类用于创建响应消息。
HttpServletResponse是专用于HTTP协议的ServletResponse子接口,它用于封装HTTP响应消息,定义了一系列用于描述各种HTTP状态码的常量。在service()方法内部调用HttpServletResponse对象的各种方法来创建响应消息。具体查看HttpServletResponse的API。在SpringMVC中Controller的某个方法上加@ResponseBody注解,表示该方法的返回结果直接写入HTTP response body中,但是实际使用中发现最后生成的response中"Content-Type"的值不正确,导致浏览器不能正确处理返回的内容,因此此方式不建议使用。
HttpServletResponse对象的帮助工具类,代码图:
代码图
为了方便大家,分享具体工具代码如下:
package com.portal.app.todo.tools;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author 头条号路人宅
* 来源 路人宅
* HttpServletResponse帮助工具类
*/
public final class ResponseUtils {
public static final Logger log = LoggerFactory.getLogger(ResponseUtils.class);
/**
* 发送文本使用UTF-8编码
* @param response
* HttpServletResponse
* @param text
* 发送的字符串
*/
public static void renderText(HttpServletResponse response, String text) {
render(response, "text/plain;charset=UTF-8", text);
}
/**
* 发送json使用UTF-8编码
* @param response
* HttpServletResponse
* @param text
* 发送的字符串
*/
public static void renderJson(HttpServletResponse response, String text) {
render(response, "application/json;charset=UTF-8", text);
}
/**
* 发送xml使用UTF-8编码
* @param response
* HttpServletResponse
* @param text
* 发送的字符串
*/
public static void renderXml(HttpServletResponse response, String text) {
render(response, "text/xml;charset=UTF-8", text);
}
/**
* 发送内容使用UTF-8编码
* @param response
* @param contentType
* @param text
*/
public static void render(HttpServletResponse response, String contentType,
String text) {
response.setContentType(contentType);
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
try {
response.getWriter().write(text);
} catch (IOException e) {
log.error(e.getMessage(), e);
}
}
}
个人总结:
1)ServletResponse接口中定义了setCharacterEncoding、setContentType和setLocale等方法来指定ServletResponse.getWriter方法返回的PrintWriter对象所使用的字符集编码,调用ServletResponse接口中定义的setContentType方法,在HTTP响应消息的Content-Type头字段中指定响应正文的字符集编码。
2)禁止浏览器缓存当前文档内容,具体代码如下:
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
3)Java程序中的字符文本在内存中是以unicode编码的形式存在的,PrintWriter对象在输出字符文本时,需要先将它们转换成其他某种字符集编码的字节数组后输出。
4)浏览器接收到的中文字符并不是中文符号本身,而是它的某种字符集编码的数据,因此浏览器必须使用正确的字符集编码进行查看,才能将它所接收到的数据显示为正确的中文字符。