response对象的组成及应用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27656675/article/details/69675698

web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。request和response对象既然代表请求与响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了,要向客户机输出数据,只需要找response对象就行了。
HttpServletResponse对象服务器的响应。这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。

这里写图片描述

一,response响应的构成:
响应行:
状态码(Status Code):void setStatus(int sc) 设置状态码;常用的状态码有:200(请求成功处理),302(请求重定向),304(服务器段资源没有改动,通知客户端查找本地资源),404(客户端的访问资源不存在),500(服务器内部出错)
响应头: Header Info(key:value的形式,一个key对应一个value,一个key对应多个value)
设置头信息:
void setHeader(String name, String value) (一个key对应一个value)经常使用的;eg:setHeader(“aa”,”bb”); setHeader(“aa”,”cc”); 结果:aa:cc
setHeader(String,String) 替换原有值
addHeader(String,String) 在原有值添加
void setIntHeader(String name, int value)
void setDateHeader(String name, long date) 值是毫秒值(int 秒 long 毫秒)
void addHeader(String name, String value) (一个key对应多个value) eg:addHeader(“aa”,”bb”); addHeader(“aa”,”cc”); 结果:aa:bb,cc

响应体
ServletOutputStream getOutputStream() 字节输出流
PrintWriter getWriter() 字符输出流

二,下面为一些response状态码和头信息的应用:
(1)通过response实现请求重定向
请求重定向指:一个web资源收到客户端请求后,通知客户端去访问另外一个web资源,这称之为请求重定向,302(状态码)+Location(应用头) —— response.sendRedirect
例如:用户登陆时,用户名密码错误,重定向回登陆页面

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
    // 获得请求中 用户名和密码
    String username = request.getParameter("username");
    // 字符串要为form表单对象name属性
    String password = request.getParameter("password");
    // 假设admin/admin 就是用户名和密码
    if (username.equals("admin") && password.equals("admin")) {
    // 登陆成功
    response.setContentType("text/html;charset=utf-8");
    response.getWriter().println("登陆成功!");
    } else {
    // 用户名或者密码错误 ---- 重定向登陆页面
    // response.setStatus(302);
    // response.setHeader("Location", "/study/response/demo.html");
    response.sendRedirect("/study/response/demo.html");
    }
}

(2)发送http头,控制浏览器定时刷新网页(refresh),用到,响应头refresh。利用HTML标签来控制浏览器行为

//定时刷新
response.setHeader("refresh", "5;url=/study/hello.html");
response.setContentType("text/html;charset=utf-8");
response.getWriter().println("页面会在5秒后 自动跳转hello.html");
//HTML中meta标签,可以产生Http响应头信息相同效果 
<meta http-equiv="refresh" content="5;url=/study/response/login.html">

其中:http-equiv 响应头信息name,content 响应头信息value

(3)禁用浏览器缓存(三个头信息)
发送http头,控制浏览器禁止缓存当前文档内容,通过设置三个Http头信息禁用浏览器缓存,分别为:
Cache-Control : no-cache
Pragma : no-cache
Expires: Thu, 01 Dec 1994 16:00:00 GMT (非常特殊,转换特定日期格式才可以)

// 设置response 的三个头信息
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
// Expires 要求格式为日期格式
// 通过setDateHeader设置一个毫秒信息,自动转换日期格式
response.setDateHeader("Expires", -1);

有些动态页面,每次访问内容都不同,如果浏览器缓存页面,无法查看最近内容,禁用缓存通常应用与网银,页面的数据是发生变化的。

(4)response向页面输出中文(乱码问题)
1)字节流输出中文:ServletOutputStream getOutputStream() ,为字节输出流。会发生乱码和浏览器的编码有关,解决办法是:可以设置浏览器默认打开时候的编码集,在获得字节数组的时候,传入一个编码集。

//设置浏览器默认打开时的编码
   response.setHeader("Content-Type", "text/html;charset=UTF-8");
//设置获取字节数组时的编码
   response.getOutputStream().write("中文".getBytes("UTF-8"));

2)字符流输出中文:PrintWriter getWriter(),为字符输出流。
因为response的字符流的缓冲区是ISO-8859-1编码,所以肯定会发生乱码,解决的办法是:设置response缓冲区的编码,设置浏览器默认打开时候的字符集编码。

//设置response缓冲区的编码.
   response.setCharacterEncoding("UTF-8");
//设置浏览器打开文件的时候采用的编码
   response.setHeader("Content-Type", "text/html;charset=UTF-8");
//简写方式
 response.setContentType("text/html;charset=UTF-8");

注意:
1,字节流与字符流是互斥的,同一个页面只能使用一种流,不同同时向页面响应;
2,使用字符流输入数字时,有可能存在问题,所以想要输入数字时,使用字符串。例如:“1”。
3,getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。
4, Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。
5,Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎tomcat将调用close方法关闭该输出流对象。调用close的时候,应该会调用flushBuffer

(5)实现文件的下载(初级下载)
1)超链接,浏览器可以解析直接打开(如果浏览器不能识别的格式,会弹出下载窗口。但是如果浏览器识别的话,会默认打开文件)。
2)弹出下载窗口:
前提条件:先准备一个文件,然后读取文件,读入到输入流中,通过response读出到浏览器端。设置头信息:response.setHeader(“Content-Disposition”,” attachment;filename=”+文件名称);通过response.getOutputStream()向浏览器端输出。

(6)输出验证码图片
1)在内存中生成图片:可以使用BufferedImage对象,该对象可以获取画笔对象
getGraphics();
2)随机生成字母或数字:可以使用Random对象;
3)把生成的数字或字母写在图片上:通过画笔中的方法;
4)把图片生成到页面上:可以使用ImageIO对象。
具体的操作如下:

//建立BufferedImage对象:指定图片的长度宽度和类型:
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//取得Graphics对象,用来绘制图片 
Graphics graphics = image.getGraphics();
//绘制背景颜色
graphics.setColor(Color.WHITE);
graphics.fillRect(0, 0, width, height);
//绘制边界
graphics.setColor(Color.BLUE);
graphics.drawRect(0, 0, width - 1, height - 1);
//生成随机数
Random random = new Random();
random.nextInt(n); // 生成0到n的随机数,前闭后开
//绘制干扰线
graphics.drawLine(x1, y1, x2, y2);
//设置字体(如果验证码是中文,要使用中文的字体库)
graphics.setFont(new Font("Times New Roman", Font.PLAIN, 18));
//通过词库生成随机验证码内容
//"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
//汉字:\u4e00 —— \u9fa5
graphics.drawString(str, x, y);
//设置旋转
Graphics2D graphics = (Graphics2D) image.getGraphics();
graphics.rotate(theta, x, y);
//释放此图形的上下文以及它使用的所有系统资源
 graphics.dispose();
//通过ImageIO对象的write静态方法将图片输出 
ImageIO.write(image, "jpg", resp.getOutputStream());
阅读更多
想对作者说点什么?
相关热词

博主推荐

换一批

没有更多推荐了,返回首页