Servlet开发(二)Response对象常见应用

(WEB学习笔记 一)

1、向客户端输出中文数据

(如何解决向客户端输出中文数据乱码问题,分别以OutputStream和PrintWriter输出

1)以OutputStream输出

有两种方式解决向客户端输出中文数据乱码问题:如代码中 test1(); 和 test2(); 方法所示

public class ResponseDemo1 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        test2(response);

    }

    //方式一: 解决乱码问题,保证输出编码和浏览器的编码保持一致
    public void test1(HttpServletResponse response) throws IOException{

        String data ="中国";

         OutputStream out = response.getOutputStream();

         // 程序以码表输出 ,一定要控制输出的格式相同.控制浏览器输出同样的格式
         response.setHeader("Content-type", "text/html;charset=gbk");

        // out.write(data.getBytes());  //可能这样输出的就是乱码
         //out.write(data.getBytes("UTF-8")); //乱码
         //out.write(data.getBytes("GB2312"));
         out.write(data.getBytes("GBK"));

    }

    //方式二:模拟一个http相应头
     public void test2(HttpServletResponse response) throws IOException{

         String data ="中国2";
        //模拟一个html:<meta>标签 (类似于index.jsp里面的)模拟http响应头
         OutputStream out = response.getOutputStream();

         out.write("<meta http-equiv = ‘content-type‘ content=‘text/html;charset = gbk‘>".getBytes());
         out.write(data.getBytes("gbk"));
     }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doGet(request, response);

    }

}

2)以PrintWriter输出

三种方式解决:如下代码,使用时采用其中一种方式即可

 private void test1(HttpServletResponse response) throws IOException {

         String data = "中国";

        // 设置 Response相应的码表 以控制Response以什么码表向浏览器输出 默认IOS-8859-1 编码集

        // 默认输出的编码集
        // response.setHeader("Content-type", "text/html;charset=ISO-8859-1");

         // 第一种方式 改变默认的响应头  把默认的编码集改成我们所需要的
        // response.setHeader("Content-type", "text/html;charset = GB2312");

          // 第二种方式设置CharacterEncoding编码集
         //response.setCharacterEncoding("GB2312");

         //第三种方式 设置contentType等价于 第一种方式和第二种方式的累加
         response.setContentType("text/html;charset = GB2312");

         PrintWriter out = response.getWriter();
         out.write(data); //直接这样,乱码

     }

2、文件下载(通过设置相应头信息即可完成下载功能)

首先在新建的Web工程的webRoot下新建download文件夹,把自己要下载的文件拷贝进去。

然后新建一个ServletDemo3,来完成从服务器下载文件

1)普通数字或者英文字母文件名的文件下载

private void test1(HttpServletResponse response) {

         String path=this.getServletContext().getRealPath("/download/4.jpg");//得到文件根路径
         //System.out.println(path);  //D:\Java\web_tomcat\apache-tomcat-7.0.62\webapps\JavaServlet\download\4.jpg

          //得到文件的名字
         String filename = path.substring(path.lastIndexOf("\\")+1); // "\"最后一次出现的位置
        // System.out.println(filename); //4.jpg

        //通过IO流往外写出数据
         InputStream in = null;
         OutputStream out =null;

        //要想完成下载必须设置下载响应头信息
         response.setHeader("content-disposition", "attzchment;filename=" + filename);

         try {
            in = new FileInputStream(path);
            int hasRead=0;
            byte [] buffer=new byte[1024];
            out=response.getOutputStream();
            while((hasRead = in.read(buffer))!= -1){
                                out.write(buffer,0,hasRead);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {

            e.printStackTrace();
        }finally{
            try {
                in.close();
                out.close();
            } catch (IOException e) {

                e.printStackTrace();
            }
        }
     }

在网页上运行程序,自动跳出下载提示框:

2)解决下载的文件的文件名是中文的问题

(若文件名是中文时可能出现乱码,或者文件名不存在( . jpg)的情况)

(1)一般情况下只需要对下载的文件进行编码即可

String fname= URLEncoder.encode(filename,"UTF-8");  

具体示例代码如下:

 private void test2(HttpServletResponse response) throws IOException {
            String path=this.getServletContext().getRealPath("/download/图片.jpg");
            System.out.println(path);
            String filename=path.substring(path.lastIndexOf("\\")+1);

            //通过IO流往外写出数据
            InputStream in =null;
            OutputStream out =null;

            //需要对下载的文件名进行编码
            String fname= URLEncoder.encode(filename,"UTF-8");          

            //要想完成下载必须设置下载相应头信息
            response.setHeader("content-disposition", "attachment;filename="+fname); //fname为编码之后的名字

            try {
                in=new FileInputStream(path);
                int hasRead=0;
                byte [] buffer=new byte[1024];
                out=response.getOutputStream();
                while((hasRead=in.read(buffer))!=-1){
                    out.write(buffer,0,hasRead);
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally{
                try {
                    in.close();
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

(2)有时需要针对不同的浏览器进行编码

(PS:有的浏览器的编码方式可能和其他浏览器的不同)

如火狐浏览器:

根据不同的浏览器进行编码,代码如下:

//根据不同的浏览器进行编码
private String encodDownFileName(String filename,String agent) throws IOException{ //agent代表使用的浏览器
    if(agent.contains("Firefox")){
        //火狐浏览器  需要单独编码
        filename ="=?UTF-8?B?"+new BASE64Encoder().encode(filename.getBytes("UTF-8"))+"?=";

         }else{
                //IE或者其他浏览器
                filename=URLEncoder.encode(filename,"UTF-8");
            }
     return filename;     //返回编码好的名字
        }

相应的调用程序,只需将获取的当前使用的浏览器作为参数传递给encodDownFileName();函数获得编码好的文件名即可

 private void test3(HttpServletResponse response,HttpServletRequest request) throws IOException {

           .......此处代码如上一个

            //对下载的文件名进行编码
            String fname=encodDownFileName(filename, request.getHeader("user-agent")); //通过request获取当前使用的浏览器

            .........此处代码如上一个

        }

编码后:

3、生成随机图片(例:验证码的生成)

public class ResponseDemo4 extends HttpServlet {

     // 1.定义一个随机字典
    public static final char[] chars = { ‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘, ‘0‘, ‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘,‘F‘, ‘G‘, ‘H‘, ‘I‘, ‘J‘, ‘K‘, ‘L‘, ‘M‘, ‘N‘, ‘O‘, ‘P‘, ‘Q‘, ‘R‘, ‘S‘, ‘T‘, ‘U‘, ‘V‘, ‘W‘, ‘X‘, ‘Y‘, ‘Z‘ };

     //2 定义生成随机数
    private static Random random = new Random();

     //获取随机六位数
    public static String getRandomString(){

         //字符串缓冲 ,进行拼接
        StringBuffer sb = new StringBuffer();
        for(int i = 0;i <6;i++){

            //每次获取一个随机字符串
            sb.append(chars[random.nextInt(chars.length)]);
        }

        return sb.toString();
    }

     //获取一个颜色  分别用于前景色(文字的颜色)和背景色
    public static Color getRandomColor(){
        return new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255));
   }

    //获取随机颜色的反色
    public static Color getReverColor(Color c){
        return new Color(255-c.getRed(), 255-c.getGreen(), 255-c.getBlue());
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

         //设置输出的类型 

        //随机字符串
        String randomString = getRandomString();

        //随机颜色 背景色
        Color c =getRandomColor();

        //反色 用于前景色
        Color reverse =getReverColor(c);

        //创建一个彩色的图片  根据BufferedImage(长度,宽度,生成的类型)
        BufferedImage  bi =new BufferedImage(100, 30, BufferedImage.TYPE_INT_RGB);
        //获取绘图对象,画笔
        Graphics g = bi.getGraphics();
        //设置字体
        g.setFont(new Font(Font.SANS_SERIF,Font.BOLD,16));
        //设置字体的颜色
        g.setColor(c);
        //绘制背景
        g.fillRect(0, 0, 100, 30);
        //设置前景色
        g.setColor(reverse);
        //绘制随机数字
        g.drawString(randomString, 18, 20);

        //加噪点
        for(int i=0 ,n=random.nextInt(100);i<n;i++){
            g.drawRect(random.nextInt(100), random.nextInt(30), 1, 1);
        }

      //输出图片
        ImageIO.write(bi,"jpg",response.getOutputStream());
    }  

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

运行后:

4、控制浏览器定时刷新

有两种情况:

(1)在本页面刷新;

(2)刷新跳转到其他页面。

public class ResponseDemo5 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        test2(response);
    }

    //(1)在本页面刷新
     private void test1(HttpServletResponse response) throws IOException {

         response.setHeader("refresh", "3"); //每隔3秒刷新一次
         String data = new Random().nextInt(10000) + "";
         response.getWriter().write(data);
     }

     //(2)刷新到其他的网页
     private void test2(HttpServletResponse response) throws IOException{

         response.setHeader("refresh","3;url=‘‘/JavaServlet/Identity.html‘"); //url:需要跳转的网页地址

         //指定具体的编码集
         response.setContentType("text/html;charset=GB2312");
         response.getWriter().write("登陆成功,将在3秒之后跳转到首页 ,如果没有跳转,请点击<a href=‘/JavaServlet/Identity.html‘>首页</a>");
     }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doGet(request, response);
    }

}
时间: 2024-10-29 19:08:19

Servlet开发(二)Response对象常见应用的相关文章

javaweb学习之Servlet开发(二)

javaweb学习总结(六)--Servlet开发(二) 一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数. 例如: 1 <servlet> 2 <servlet-name>ServletConfigDemo1</servlet-name> 3 <servlet-class>gacl.servlet

javaweb学习总结(六)——Servlet开发(二)

转载:http://www.cnblogs.com/xdp-gacl/p/3763559.html 只为成功找方法,不为失败找借口! javaweb学习总结(六)——Servlet开发(二) 一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数. 例如: 1 <servlet> 2 <servlet-name>ServletC

Servlet开发(二)

首先声明:本文转载自:@孤傲苍狼 https://home.cnblogs.com/u/xdp-gacl/ javaweb学习总结(六)——Servlet开发(二) 一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数. 例如: 1 <servlet> 2 <servlet-name>ServletConfigDemo1<

javaweb学习总结(五) - - Servlet开发(二)

一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数. 例如: <servlet> <servlet-name>ServletDemo2</servlet-name> <servlet-class>com.tanlei.cn.ServletDemo2</servlet-class> <

重温Servlet学习笔记--response对象

在用户浏览网页时,服务器对于客户端浏览器做出的响应被封装成一个HttpServletResponse对象,要对浏览器操作只需要操作这个response对象即可.response的功能分类及介绍: 响应正文 response是响应对象.向客户端输出响应正文(响应体)可以使用response的响应流,response提供了两个响应流对象: PrintWriter printWriter = response.getWriter();  只能写字符流,如输出text信息 ServletOutputSt

python 视图 (FBV、CBV ) 、Request 和Response对象 、路由系统

一.FBV和CBV1.基于函数的view,就叫FBV(Function Based View) 示例: def add_book(request): pub_obj=models.Publisher.objects.all() #从数据库获取全部出版社对象 if request.method=='POST': add_name=request.POST.get('book_name') pub_id=request.POST.get('pub_id') models.Book.objects.c

JAVAWEB学习总结 SERVLET开发(二)

一.ServletConfig对象 1.1.配置servlet初始化参数 在servlet的配置文件中web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数. 例如: <servlet> <servlet-name>ServletConfigDemo1</servlet-name> <servlet-class>gacl.servlet.study.ServletConfigDemo1</serv

Servlet(1):request和response对象

1.Servlet的生命周期 /** * Servlet的生命周期: * 1.从第一次调用到服务器关闭. * 2.如果Servlet在web.xml中配置了load-on-startup,生命周期为从服务器启动到服务器关闭 * 注意: * init方法是对Servlet进行初始化的一个方法,会在Servlet第一次加载进行存储时执行 * destory方法是在servlet被销毁时执行,也就服务器关闭时. */ public class ServletLife extends HttpServl

javaweb学习总结二十五(response对象的用法一)

一:Reponse对象的概念 当客户端发送http请求时,服务器端会对每一次请求,创建request对象和response对象. response对象包括三个部分:响应头.响应状态码以及响应体 二:response对象案例分析 1:向客户端输出中文数据 1 package com.hlcui.servlet; 2 3 import java.io.IOException; 4 import java.io.OutputStream; 5 import java.io.PrintWriter; 6