Web开发之response

Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。


我们要获取客户机提交过来的数据,只需要找request对象就行了。要向容器输出数据,只需要找response对象就行了。

下面我们介绍response的主要用法

中文文件名文件的下载

关于编码:
文件内容要用 response.setContextChest()
文件名用URLEncoder.encode()

//获取文件的路径
String path = getServletContext().getRealPath("/WEB-INF/classes/美女.jpg");//默认从工程路径开始

//创建输入流
InputStream is = new FileInputStream(path);
byte[] bs = new byte[1024];
int b = 0;

//创建输出流对象
ServletOutputStream os = response.getOutputStream();

//对中文进行编码
//先拿到中文的文件名,"/"以"\\"替换(Windows平台特性)
String name = path.substring(path.lastIndexOf("\\") + 1, path.length());

//对中文文件名进行编码
name = URLEncoder.encode(name, "utf-8");    

//通知浏览器以下载的方式打开文件
response.setHeader("Content-Disposition", "attachment;filename=美女.jpg");    

while((b = is.read(bs)) != -1){
    os.write(bs, 0, b);
}

输出随机图片

  • HTML页面上

    需要设置一个图片,然后图片地址设置为servlet。点击按钮重新让图片的url改变为访问servlet(url地址每次需要不一样,不然会有缓存,可以采用+一个当前时间)

  • servlet中

    //创建两个变量
    int width = 120;
    int height = 30;
    //创建内存图片
    BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
    //创建画笔
    Graphics g = image.getGraphics();
    //指定边框的颜色
    g.setColor(Color.RED);
    //画图像的边框
    g.drawRect(0, 0, width, height);
    
    //填充一下矩形的背景色
    //设定画笔的颜色
    g.setColor(Color.YELLOW);
    //填充矩形的背景
    g.fillRect(1, 1, width-2, height-2);
    
    //设置字体大小
    g.setFont(new Font("幼圆",Font.BOLD + Font.ITALIC,25));   
    
    //填充内容
    Random r = new Random();        
    
    //设置画笔颜色
    g.setColor(Color.GRAY);
    //花30条干扰线
    for(int i=0;i<30;i++){
        g.drawLine(r.nextInt(width),r.nextInt(height),r.nextInt(width),r.nextInt(height));
    }   
    
    //画到图片中
    //设定画笔的颜色
    g.setColor(Color.RED);
    
    //随机产生4个汉子
    String s = "末日没有进行曲IhavenoMoney";
    //先将汉字转换成Unicode编码
    //可新建一个properties然后输入汉字,看源码 
    s = "\u672B\u65E5\u6CA1\u6709\u8FDB\u884C\u66F2IhavenoMoney";
    for(int i = 0; i<4; i++){
        char c = s.charAt(r.nextInt(s.length()));
        int flag = r.nextBoolean()?1:-1;
        g.drawString(c+"",20 + 20*i + flag*r.nextInt(10),23 + flag*r.nextInt(5));
    }       
    
    //随机产生4个数字输出到页面
    for(int i = 0; i<4; i++){
        int n = r.nextInt(10);
        //画到图片中
        g.drawString(n+"",20 + 20*i,20);
    }
    
    //告诉客户端不要缓存
    response.setHeader("Expires", -1+"");
    response.setHeader("Cache-control","no-cache");
    response.setHeader("Pragram","no-cache");
    
    //将图片输出到客户端
    ImageIO.write(image, "jpg", response.getOutputStream());
    

定时刷新

//每隔2s刷新
response.setHeader("Refresh", "2");
response.getWriter().write("aa"+new Random.nextInt());

//每隔2s刷新到其他资源
response.setHeader("Refresh", "2;url=/a.html");
response.getWriter().write("aa"+new Random.nextInt());

控制客户端浏览器的缓存

response.setContentType("text/html;charset=UTF-8");
response.getWrite().write("圣诞快乐");

//控制缓存的时间
//时间是从1970年的1月1日0点0时0分0秒0毫秒开始计时
response.setDateHeader("Expires", System.currentTimeMills() + 10000);

请求重定向

System.out.println("servletresponse");

//第一种方式
response.setStatus(302);
response.setHeader("Location","ServletResponse/servlet/ServletRespon2");

//第二种方式(底层和第一种方式实现一样)
response.sendRedirect("Location","ServletResponse/servlet/ServletRespon2");

response对象的一些细节

//不要在一个servlet中同时使用字节流和字符流
//以下会引发500错误
response.getOutputStream().write("圣诞快乐".getBytes());
response.getWriter().write("末日没有进行曲");
  1. getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。
  2. Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。
  3. Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象。 所以这个流自己可以不关,但是自己开的其他流应该关掉。
posted @ 2015-12-25 21:14  末日没有进行曲  阅读(141)  评论(0编辑  收藏  举报