HttpServletResponse

i解决Servlet中乱码的问题:
    way1:
        //设置response使用的码表,以控制response以什么码表向浏览器读出数据
        response.setCharacterEncoding("UTF-8");
        //制定浏览器以什么码表打开服务器发送的数据
        response.setHeader("content-type","text/html;charset=UTF-8");
    way2:    
        //这个方法间接也把setCharacterEncoding设置好了
        //response.setContentType("text/html;charset=UTF-8");
response的getOutputStream和getWriter方法
    OutputStream:字节流
        //程序以什么输出,就一定要控制什么码打开
        private void test1(HttpServletResponse response) throws IOException,
                UnsupportedEncodingException {
            response.setHeader("content-type","text/html;charset=UTF-8");//注意中间是分号,不是逗号
            OutputStream out=response.getOutputStream();
            String data="中国";
            out.write(data.getBytes("UTF-8"));    
        }
        public void test(){
            OutputStream out=response.getOutputStream();
            //用html中的meta标签来模拟一个http响应头,来控制浏览器的响应
            out.write(("<meta http-equiv='content-type' content='text/html; charset=UTF-8'>").getBytes());
            String data="中国la";
            out.write(data.getBytes("UTF-8"));
        }
    PrintWriter://字符流
        //设置response使用的码表,以控制response以什么码表向浏览器读出数据
        response.setCharacterEncoding("UTF-8");
        //制定浏览器以什么码表打开服务器发送的数据
        response.setHeader("content-type","text/html;charset=UTF-8");
        
        //这个方法间接也把setCharacterEncoding设置好了
        //response.setContentType("text/html;charset=UTF-8");
        PrintWriter p=response.getWriter();//只能打印字符串
        String data="中国d";
        p.write(1);//这样是不行的,结果是浏览器制定的数码1对应的数据
        p.write(data);
        p.print(data);
        
    细节:
        *getOutputStream和getWriter方法分别用于得到输出二进制数据,输出文本数据的
            ServeletOutputStream,PrintWriter对象
        *getOutputStream 和getWriter这两个方法是互斥的,调用了其中的一个方法后就不能调用另外一个方法。
            java.lang.IllegalStateException:...has already been called for this response(同时调用的异常)
        *Servlet引擎会调用close方法去关闭这两个输出流对象(注意:其他自己创的流要自己关)
  

刷新有两个作用1,不管有没有缓存,就向服务器发出请求
                    2,把上次的事情再干一次
    
重定向:
    重定向的特点:
         *浏览器会向服务器发送两次,意味着就有两个response,request
         *重定向技术会使浏览器地址栏会发生变化
         用户登录和购物车会用到重定向技术
        response.setStatus(302);
        response.setHead("location","URL");
                =
        response.setRedirect("URL");实现原理:302状态码和location头即可实现重定向
自动更新:
    response.setHeader("refresh","3;url=/day_06/index.jsp");
    
设置缓存:
    resoonse.setHeader("expires","time(mills)"):
            注意:比如设置缓存为一个小时System.currentTimeMillIs()+1000*3600
使用response实现资源下载:

String path=this.getServletContext().getRealPath("/download/1.jpg");
        String name=path.substring(path.lastIndexOf("\\")+1);
        response.setHeader("content-disposition","attachment;filename="+name);
        InputStream in=null;
        OutputStream out=null;
        try{
            in=new FileInputStream(path);
            int len=0;
            byte buffer[]=new byte[1024];
            out=response.getOutputStream();
            while((len=in.read(buffer))>0){
                out.write(buffer,0, len);
            }
            
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            if(in!=null){
                in.close();
            }
        }
        
response实现验证码:
    小技巧:将鼠标放在图片上,图片出现文字用的是Img中的titile(alt="图片加载失败",alt是无法找到图片显示的)

  小技巧:将鼠标放在图片上,图片出现文字用的是Img中的titile(alt="图片加载失败",alt是无法找到图片显示的)
    jsp部分:
        <script language="javascript" >
        function update(img){
          img.src=img.src+"?"+new Date().getTime();
        }
        </script>
        或者onclick="this.src=this.src+'?'+new Date().getTime()""
        <img src="/day_06/Demo3" title="换一张" alt="图片加载失败" onclick="update(this)" style="cursor:pointer"><br/>

Servlet代码
       import
java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Demo3 extends HttpServlet { private static final int HEIGHT =25; private static final int WIDTH = 123; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("UTF-8"); response.setHeader("content-type","text/html;charset=UTF-8"); BufferedImage b=new BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_INT_RGB); Graphics g=b.getGraphics(); //设置背景色 setBackGround(g); //设置表框 setBorder(g); //画干扰线 dramLine(g); //写随机数 setRandomNumber((Graphics2D)g); //图像写给浏览器 response.setContentType("image/jpeg"); //静止缓存这张图片,不是再进这个网站是无法获得新的图片 //图片动态变化不要缓存 response.setDateHeader("expries",-1); response.setHeader("Pragma","no-cache"); response.setHeader("Cache-control","no-cache"); ImageIO.write(b,"jpg",response.getOutputStream()); } private void setRandomNumber(Graphics2D g){ g.setColor(Color.RED); g.setFont(new Font("宋体",Font.BOLD,20)); int x=10; for(int i=0;i<4;i++){ Random random=new Random(); int number=random.nextInt(10); int dushu=random.nextInt()%60; g.rotate(dushu*Math.PI/180,x,20);//,x,20); g.drawString(number+"", x, 20); g.rotate(-dushu*Math.PI/180,x,20);//旋转回去 x+=30; } } private void dramLine(Graphics g){ g.setColor(Color.GREEN); Random random=new Random(); for(int i=0;i<5;i++){ int x1=random.nextInt(WIDTH); int y1=random.nextInt(HEIGHT); int x2=random.nextInt(WIDTH); int y2=random.nextInt(HEIGHT); g.drawLine(x1, y1, x2, y2); } } private void setBorder(Graphics g) { g.setColor(Color.BLACK); g.drawRect(1, 1, WIDTH-2, HEIGHT-2); } private void setBackGround(Graphics g) { g.setColor(Color.white); g.fillRect(0, 0, WIDTH, HEIGHT); }

 

posted @ 2016-04-16 15:54  戒。  阅读(137)  评论(0编辑  收藏  举报