Web 基础 9 Response对象的简介
2018-03-27 本文已影响18人
小熊先生很不开心
1.1 Response的概述
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象和代表响应的response对象。
request和response对象既然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象即可。
HttpServletResponse对象服务器的响应。这个对象中封装了向客户端发送响应状态码(即响应行)、发送响应头、发送数据的方法。
1.1 HttpServletResponse(Response) 对象
1.1.2 Response 输出流
- 字符输出流
response.getWriter().println("hahaha");
- 字节输出流
response.getOutputStream().write("hahah".getBytes());
- 输出中文
- 由于浏览器与服务器之间的的编码不统一 会导致中文输出出现乱码
可以使用以下代码查看编码格式
String encoding = response.getCharacterEncoding();//ISO-8859-1
pw.println(encoding);
为了中文输出格式统一,需要统一客户端与服务器端的编码格式
- 方法一 :设置响应头,告诉浏览器你应该使用什么编码
//response.setHeader("Content-type", "text/html;charset=UTF-8");
//注释的方法和setContenType效果相同可以根据习惯自己使用
response.setContentType("text/html;charset=UTF-8");
os.write("小熊先生不开心".getBytes("UTF-8"));
- 方法二 : 设置响应的编码
字符流
//设置浏览器接收数据使用的编码
response.setContentType("text/html;charset=UTF-8");
//获取字符输出流对象
PrintWriter pw = response.getWriter();
pw.println("小熊先生不开心");//默认使用的编码是ISO-8859-1
字节流
response.setContentType("text/html;charset=UTF-8");
response.getOutputStream().write("小熊先生".getBytes("UTF-8"));
这里的后面的getBytes("UTF-8")必须加(一定要记住啊)
1.2 常用的响应行头操作
1.2.1 Refresh 定时刷新或者跳转
- 格式
response.setHeader("Refresh", "需要的时间单位秒");//刷新
response.setHeader("Refresh", "需要的时间单位秒;URL=需要跳转的网址或者内部资源");//刷新
- 代码实现
public class ResponseDemo4 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
* Refresh:
* 定时自动刷新
* 定时自动跳转
*
*/
//设置响应数据的类型和编码
response.setContentType("text/html;charset=UTF-8");
//获取字符输出流对象
PrintWriter out = response.getWriter();
/*
//随机数
Random r = new Random();
int n = r.nextInt();
out.println(n);
//定时自动刷新
response.setHeader("Refresh", "3");
*/
//定时自动跳转
//response.setHeader("Refresh", "3;URL=http://www.baidu.com");
//正斜杠代表WEB服务器的根路径
response.setHeader("Refresh", "3;URL=/myResponse/ResponseDemo");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
1.2.2 Location 可以用于重定向
- 格式
设置相应头
设置相应状态码
- 代码实例
//原理:设置location响应头,同时还需要设置一个响应码(状态码),302/307
response.setHeader("Location", "http://www.baidu.com");
//response.setStatus(307);
response.setStatus(HttpServletResponse.SC_TEMPORARY_REDIRECT);//307
- 简化代码
是不是觉的这样比较麻烦,其实有更简单的方法
//重定向
response.sendRedirect("http://www.baidu.com");
//正斜杠代表的是WEB服务器的根路径
response.sendRedirect("/myResponse/ResponseDemo");
1.3 Content-disposition 可以用于下载文件
//文件下载
//设置响应头
//response.setHeader("Content-disposition", "attachment;filename=pic01.jpg");
//响应头里不能有中文,中文被认为是不安全的字符
//可以用下面的方法进行编码
String s = URLEncoder.encode("最可爱的熊本部.jpg", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + s);
//获取字节输出流对象
OutputStream os = response.getOutputStream();
//创建字节输入流对象
String path = getServletContext().getRealPath("/WEB-INF/pic01.jpg");
FileInputStream fis = new FileInputStream(path);
int len = 0;
byte[] bys = new byte[1024];
while((len = fis.read(bys)) != -1) {
//向客户端发送数据
os.write(bys,0,len);
}
//释放资源
fis.close();
其中对于IO的对接 有Apache的工具类IOUtils 可以自行百度下载
这里有一个重要的说明对于新手,把jar包直接放在WEN-INF下的lib文件夹即可
response.setHeader("Content-disposition", "attachment;filename=br.png");
String path = getServletContext().getRealPath("/WEB-INF/br.png");
BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(path));
IOUtils.copy(bis, bos);
是不是简单了很多了 哈哈