zoukankan      html  css  js  c++  java
  • response常见应用、response细节、输出随机图片、定时刷新网页

     

     

    response常见应用

    向客户端输出中文数据 

    分别以OutputStream和PrintWriter输出

    多学一招:使用HTML语言里面的<meta>标签来控制浏览器行为

    思考:用OutputStream输出1,为什么用户看到的不是1?

    文件下载和中文文件的下载

    输出随机图片

    package com.hbsi.response;

    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 Response3 extends HttpServlet {

        

    private static final int WIDTH=130;

    private static final int HEIGHT=30;

    public void doGet(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

    //1.创建图片

    BufferedImage image = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);

    //2.得到图片

    Graphics g = image.getGraphics();

    //3 对图片进行绘制

    //a.设置图片的背景色

    setBackGround(g);

    //b.设置矩形边框

    setBorder(g);

    //c.添加干扰线

    setRandomLine(g);

    //g.向图形中写数据

    setRandomNum(g);

    //4.把图片写给浏览器

    //response.setHeader("content-type","image/jpeg");

    response.setContentType("image/jpeg");

    //告诉浏览器不要缓存

    response.setHeader("Pragma", "no-cache");

    response.setHeader("Cache-Control", "no-cache");

    response.setIntHeader("Expires",-1);

    ImageIO.write(image,"JPEG",response.getOutputStream());

    }

    private void setRandomNum(Graphics g) {

    //g.setColor(Color.BLACK);

    g.setFont(new Font("宋体",Font.BOLD,20));

    Random random = new Random();

    String base = "u7684u4e00u4e86u662fu6211u4e0du5728u4ebau4eecu6709u6765u4ed6u8fd9u4e0au7740u4e2au5730u53d7u7cfbu4ee4u8df3u975eu4f55u725bu53d6u5165u5cb8u6562u6389u5ffdu79cdu88c5u9876u6025u6797u505cu606fu53e5u533au8863u822cu62a5u53f6u538bu6162u53d4u80ccu7ec6";

    int x=10;

    for(int i=0;i<4;i++){

    int rand = random.nextInt(base.length()-1);

    String str = base.charAt(rand)+"";

    g.setColor(new Color(random.nextInt(255),random.nextInt(255),random.nextInt(255)));

    int degree = random.nextInt()%30;

    ((Graphics2D)g).rotate(degree*Math.PI/180, x, 20);

    g.drawString(str, x, 20);

    ((Graphics2D)g).rotate(-degree*Math.PI/180, x, 20);

    x +=30;

    }

    }

    private void setRandomNum1(Graphics g) {

    //g.setColor(Color.BLACK);

    g.setFont(new Font("宋体",Font.BOLD,20));

    Random random = new Random();

    int x=10;

    for(int i=0;i<4;i++){

    //产生随机数

    String str = String.valueOf(random.nextInt(10));

    g.setColor(new Color(random.nextInt(255),random.nextInt(255),random.nextInt(255)));

    int degree = random.nextInt()%30;

    ((Graphics2D)g).rotate(degree*Math.PI/180, x, 20);

    g.drawString(str, x, 20);

    ((Graphics2D)g).rotate(-degree*Math.PI/180, x, 20);

    x +=30;

    }

    }

    private void setRandomLine(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.BLUE);

    g.drawRect(1, 1, WIDTH-2, HEIGHT-2);

    }

    private void setBackGround(Graphics g) {

    g.setColor(Color.WHITE);

    g.fillRect(0,0, WIDTH, HEIGHT);

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

    doGet(request, response);

    }

    }

    发送http头,控制浏览器定时刷新网页(REFRESH)

    package com.hbsi.response;

    import java.io.IOException;

    import javax.servlet.ServletException;

    import javax.servlet.http.HttpServlet;

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

    public class Response4 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

    String message = "<meta http-equiv='refresh' content='3;url=/servletdemo/index.jsp'>登陆成功,3秒后自动跳转到首页,如果没有请点<a href=''>超链接</a>";

    this.getServletContext().setAttribute("message",message);

    this.getServletContext().getRequestDispatcher("/message.jsp").forward(request, response);

    }

    private void test2(HttpServletResponse response) throws IOException {

    //假设这是一个处理登陆的servlet,假设登陆成功了

    response.setContentType("text/html;charset=utf-8");

    response.setHeader("refresh","3;url=/servletdemo/index.jsp");

    response.getWriter().write("登陆成功,3秒后自动跳转到首页,如果没有请点<a href=''>超链接</a>");

    }

    private void test1(HttpServletResponse response) throws IOException {

    //response.setHeader("Refresh","1");

    response.getWriter().write(new java.util.Date().toLocaleString());

    response.setHeader("refresh","3;url=http://www.sina.com");

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

    doGet(request, response);

    }

    }

    发送http头,控制浏览器禁止缓存当前文档内容 重定向

    package com.hbsi.response;

    import java.io.IOException;

    import javax.servlet.ServletException;

    import javax.servlet.http.HttpServlet;

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

    //重定向的特点

    //1.浏览器向服务器发2次请求,有2个response和request对象

    //2.地址栏会发生变化。

    public class Response5 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

    response.getWriter().write("aaaaaaa");

    /*response.setStatus(302);

    response.setHeader("location","/servletdemo/index.jsp");*/

    response.sendRedirect("/servletdemo/index.jsp");

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

    doGet(request, response);

    }

    }

    Servlet的中文输出问题à原理 

    浏览器接收到的中文字符并不是中文符号本身,而是它的某种字符集编码的数据。 

    浏览器必须使用正确的字符集编码进行查看,才能将它所接收到的数据显示为正确的中文字符。 

    当Servlet程序仅仅需要输出纯文本格式的响应正文时,通常应调用ServletResponse对象的getWriter方法返回一个PrintWriter对象,然后使用这个PrintWriter对象将文本内容写入到客户端。 

    Java程序中的字符文本在内存中是以unicode编码的形式存在的,PrintWriter对象在输出字符文本时,需要先将它们转换成其他某种字符集编码的字节数组后输出。

    ServletResponse对象的getWriter方法返回的PrintWriter对象默认使用ISO8859-1字符集编码进行Unicode字符串到字节数组的转换,由于ISO8859-1字符集中根本就没有中文字符,Unicode编码的中文字符将被转换成无效的字符编码后输出给客户端。  

    Servlet的中文输出问题à解决办法

    ServletResponse接口中定义了setCharacterEncoding、setContentType等方法来指定ServletResponse.getWriter方法返回的PrintWriter对象所使用的字符集编码。

    调用ServletResponse接口中定义的setContentType方法,在HTTP响应消息的Content-Type头字段中指定响应正文的字符集编码。   

    使用<meta>标签模拟响应消息头

    利用HTTP消息的响应头字段,可以让浏览器完成各种有用的功能,但是,这需要通过编写WEB服务器端的程序来实现。如果不会服务器端编程的普通HTML页面制作者也想借助HTTP消息的响应头字段来实现一些特殊功能,他们该怎么办呢? 

    HTML语言中专门定义了<meta>标签的http-equiv属性来在HTML文档中模拟HTTP响应消息头,当浏览器读取到HTML文档中具有http-equiv属性的<meta>标签时,它会用与处理WEB服务器发送的响应消息头一样的方式来进行处理。  

    举例: 

    <meta http-equiv="Expires" content="0">

    <meta http-equiv="Cache-Control" content="no-cache">

    <meta http-equiv="Pragma" content="no-cache">

    <meta http-equiv="Refresh" content="0;url=http://www.it315.org">

    <meta http-equiv="Content-Type" content="text/html; charset=GB2312">

    通过response实现请求重定向。

    请求重定向指:一个web资源收到客户端请求后,通知客户端去访问另外一个web资源,这称之为请求重定向。

    应用场景:用户登陆。

    实现方式

    response.sendRedirect()

    实现原理:

    302状态码和location头即可实现重定向

    response细节

    getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。

    getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。  

    Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。 

    Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象。

  • 相关阅读:
    html5 File api 上传案例
    DOM操作
    箭头函数
    js 高级函数
    导入导出封装
    函数
    哲学/文学
    qtMd5 加密算法
    生活感悟
    C# 小技巧
  • 原文地址:https://www.cnblogs.com/zhangzhifeng/p/4308560.html
Copyright © 2011-2022 走看看