一:HttpServletResponse对象介绍
HttpServletResponse为server发送给client的响应,这个对象封装了响应状态、响应数据、响应头等信息。
1:向client发送响应数据的相关方法
ServletOutputStream getOutputStream()
return a ServletOutputStream for writing binary data
PrintWriter getWriter()
Return a PrintWriter object that can return charactor data to client
2:向client发送响应状态码的相关方法
void setStatus(int sc)
HttpServletResponse中封装了很多响应状态码的常量,在使用过程中直接引用这些常量设置响应状态,避免直接调用数字。
状态码404对应的常量
/**
* Status code (404) indicating that the requested resource is not
* available.
*/
public static final int SC_NOT_FOUND = 404;
状态码200对应的常量
/**
* Status code (202) indicating that a request was accepted for
* processing, but was not completed.
*/
public static final int SC_ACCEPTED = 202;
状态码500对应的常量
/**
* Status code (500) indicating an error inside the HTTP server
* which prevented it from fulfilling the request.
*/
public static final int SC_INTERNAL_SERVER_ERROR = 500;
二:HttpServletResponse对象常见应用
2.1:用OutputStream流向浏览器输出中文
/**
* 以outPutStream的方式输出中文
* @param response
* @throws IOException
*/
private void outPutChineseByOutPutStream(HttpServletResponse response) throws IOException {
// TODO Auto-generated method stub
String data="中国";
/**
* 需要设置服务器端输出内容的编码格式与浏览器端展示内容的编码格式一致,否则会发生乱码的现象?此处data.getBytes("utf-8")表示
* 服务端输出内容的编码格式为utf-8,所以需要设置浏览器展示内容的编码格式为utf-8
* 通过response.setHeader("content-type", "text/html;charset=UTF-8")可以控制浏览器端的编码格式
*/
response.setHeader("content-type", "text/html;charset=UTF-8");
OutputStream outputStream = response.getOutputStream();
//字符串转字节数组,采用utf-8进行转换,如果不设置则采用系统默认的编码格式
byte[] bytes = data.getBytes("utf-8");
//使用OutPutStream流向客服端输出字节数组
outputStream.write(bytes);
}
2.2:用PrintWriter方式向浏览器输出中文
/**
* 以PrintWriter的方式输出中文
* @param response
* @throws IOException
*/
private void outPutChineseByPrintWriter(HttpServletResponse response) throws IOException {
// TODO Auto-generated method stub
String data="中国-PRINTWRITER";
/**
* 此处设置服务器端向客服端发送内容的编码方式(此处需要先设置输出编码格式,然后再生成PrintWriter,否则编码无效)
*/
response.setCharacterEncoding("utf-8");
PrintWriter pw = response.getWriter();
/**
* 通过模拟http meta的方式来控制浏览器显示内容的编码方式(这种方式在chrome无效,但在ie中ok)
*/
response.setHeader("content-type", "text/html;charset=UTF-8");
pw.write(data);
}
2.3:如果希望服务器输出什么浏览器就能看见什么,那么服务器输出的内容为字符串
response.setCharacterEncoding("utf-8");
PrintWriter pw = response.getWriter();
response.setHeader("content-type", "text/html;charset=utf-8");
pw.write("输出1:");
//pw.write(1); //如果直接输出1在chome上显示的是一个无效字符
pw.write(1+"");
response.setHeader("content-type", "text/html;charset=utf-8");
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write("输出1:".getBytes("utf-8"));
//outputStream.write(1); //如果直接输出1在chome上显示的是一个无效字符
outputStream.write((1+"").getBytes("utf-8"));
2.4:文件下载
/**
* 文件下载(字节流输出)
* @param response
* @throws IOException
*/
@SuppressWarnings("resource")
private void downLoadFileByOutPutStream(HttpServletResponse response) throws IOException {
// TODO Auto-generated method stub
/**
* 1:获取下载文件的绝对路径
* 2:获取要下载文件的名称
* 3:设置响应头为content-disposition,控制浏览器当前以下载的形式打开文件
* 4:得到当前下载文件的输入流
* 5:得到输出流
* 6:将输入流写入到buffer缓存区
* 7:使用输出流将缓存区的数据输出到客户端浏览器
*/
String path=this.getServletContext().getRealPath("/resources/images/图片.jpg");
String fileName=path.substring(path.lastIndexOf("\\")+1);
//如果文件名是中文需要设置编码否则会出现乱码,URLEncoder.encode(文件名,编码格式)
response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(fileName, "utf-8"));
FileInputStream fis=new FileInputStream(path);
byte[] buffer=new byte[1024];
OutputStream os = response.getOutputStream();
int len=0;
while((len=fis.read(buffer))>0){
os.write(buffer, 0, len);
}
fis.close();
}
注意:推荐用OutPutStream流,避免用PrintWriter流来输出下载内容。OutPutStream为字节流可以处理任意数据类型,PrintWriter为字符流只能处理字符流数据无法处理字节流数据。如:音频、视频、图片等。
三:HTTPServletResponse常见应用–设置响应头控制浏览器行为
3.1:设置http响应头控制浏览器禁止缓存当前文档内容
response.setDateHeader("expries", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
3.2:设置http响应头控制浏览器定时刷新网页
Response.setHeader(“refresh” ,”5”);
3.2:通过response实现请求重定向
请求重定向是指:一个web资源收到客服端请求后,通知客服端去访问另一个web资源,这就是请求重定向。如用户登录:用户访问登录页面,请求登录,登录验证通过后会跳转到其他页面,这个过程就为请求重定向。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//通过设置响应状态为302,响应头为Location实现重定向
//response.setHeader("Location", "/index.jsp");
//response.setStatus(HttpServletResponse.SC_FOUND);
//直接调用sendRedirect实现response重定向(sendRedirect的内部就是通过设置响应状态为302,响应头为location实现)
response.sendRedirect("/index.jsp");
}