JavaWeb基础--HttpServletResponse

来源:互联网 发布:网络诈骗的危害性 编辑:程序博客网 时间:2024/06/10 05:35

一.HttpServletResponse是什么?

1.HttpServletResponse对象服务器的响应。这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。

2.它也会在重写的doGet和doPost方法中出现:

protected void doGet(HttpServletRequest req, HttpServletResponse resp)

  

二.作用是什么?

可以修改响应信息;

  

三.request与response

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

2.request和response对象即然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象就行了。

  

四.核心API

1.响应行:

response.setStatus() 设置状态码

  

2.响应头:

response.setHeader("name","value") 设置响应头

  

3.实体内容:

(PrintWriter)response.getWriter().writer(); 发送字符实体内容

(OutputStream)response.getOutputStream().writer() 发送字节实体内容

  

4.重定向:

response.sendRedirect();

  

五.response细节

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

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

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

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

  

六.基于HttpServletResponse的示例:

1.常用API使用方法

/**

* 设置响应信息

*/

public class ResponseDemo1extends HttpServlet {

    /**

     * 1)tomcat服务器把请求信息封装到HttpServletRequest对象,且把响应信息封装到HttpServletResponse

     * 2)tomcat服务器调用doGet方法,传入request,和response对象

     */

    public void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        /**

         * 3)通过response对象改变响应信息

         */

        /**

         * 3.1 响应行

         */

        //response.setStatus(404);//修改状态码

        //response.sendError(404); // 发送404的状态码+404的错误页面  

        /**

         * 3.2 响应头

         */

        response.setHeader("server", "JBoss");

        /**

         * 3.3 实体内容(浏览器直接能够看到的内容就是实体内容)

         */

        //response.getWriter().write("01.hello world"); //字符内容。

        response.getOutputStream().write("02.hello world".getBytes());//字节内容

       }

    /**

     * 4)tomcat服务器把response对象的内容转换成响应格式内容,再发送给浏览器解析。

     */

}

2.请求重定向

新建一个动态web项目——day04,该项目的结构图如下:

设置Location响应头,实现请求重定向

        @WebServlet("/ServletDemo1")

public class ServletDemo1extends HttpServlet {

        // 用location和302实现请求重定向

        protected voiddoGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {

                response.setStatus(302);

                response.setHeader("location", "/day04/1.html");

        }

        protected voiddoPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {

                doGet(request, response);

        }

  

        }

当在浏览器中使用URL地址http://localhost:8080/day04/ServletDemo1访问ServletDemo1时,就可以看到服务器作出响应后发送到浏览器的状态码和响应头信息,如下图所示:

服务器返回一个302状态码告诉浏览器,你要的资源我没有,但是我通过Location响应头告诉你哪里有,而浏览器解析响应头Location后知道要跳转到/day04/1.html页面,所以就会自动跳转到1.html,如下图所示:

  

3.定时刷新

public class ResponseDemo3extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        /**

         * 定时刷新

         * 原理:浏览器认识refresh头,得到refresh头之后重新请求当前资源

         */

        //response.setHeader("refresh", "1"); //每隔1秒刷新次页面

        /**

         * 隔n秒之后跳转另外的资源

         */

        response.setHeader("refresh", "3;url=/day09/adv.html");//隔3秒之后跳转到adv.html

    }

}

4.设置Content-Encoding响应头,告诉浏览器数据的压缩格式

(1)压缩数据的好处:

  1. 假设数据有1M,浏览器为了显示这个资源,要从服务器上下载1M的数据,才能打开整个页面,打开速度就慢,你如果一压缩,可能1M的数据只有300K,对浏览器而言,只需要接收300K的数据就可打开整个页面,所以压缩会提供整个页面的访问性能。
  2. 为了省钱,因为大型的网站,比如新浪、搜狐这样的门户网站,电信对它们的收费是按照出口流量收费的,出去了多少数据,电信找它们收多少钱,为了省钱,数据在发出去的时候一定要压缩,不压缩就亏大发了。

(2)怎么实现数据的压缩?需要使用GZIPOutputStream流来压缩数据。

@WebServlet("/ServletDemo1")

public class ServletDemo1extends HttpServlet {

  

        // 压缩数据输出

        protected voiddoGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {

                String data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"+

"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"+

"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"+

"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"+

"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";

                System.out.println("原始数据大小:"+data.getBytes().length);

  

                ByteArrayOutputStream bout =new ByteArrayOutputStream();

                GZIPOutputStream gout =new GZIPOutputStream(bout);

                gout.write(data.getBytes());

                /*

* GZIPOutputStream:包装流,一般都会有一个缓冲,

* 如果调用其write()方法在写数据时,

* 如果数据量没有把包装流的缓冲写满,它是不会往底层流写的。

*/

                gout.close(); // 一定要有

  

                // 得到压缩后的数据

                byte[] gzip = bout.toByteArray();

                System.out.println("压缩后的数据大小:"+gzip.length);

  

                /*

* 将压缩数据发送给浏览器

*/

                // 通知浏览器数据采用压缩格式

                response.setHeader("Content-Encoding", "gzip");

                // 告诉浏览器回送的压缩数据的长度

                response.setHeader("Content-Length", gzip.length+"");

                response.getOutputStream().write(gzip);

        }

        protected voiddoPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {

                doGet(request,response);

}

}

(3)服务器发给浏览器的响应信息如下:

此时Eclipse控制台打印如下信息:

5.content-Type作用:引出-->:ContentType,乱码问题:中文乱码问题

public class ResponseDemo4extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        //设置响应实体内容编码

        //response.setCharacterEncoding("utf-8");

         

        /**

         * 1. 服务器发送给浏览器的数据类型和内容编码

* 浏览器会根据此方法,来解析传递来的参数

         */

        //response.setHeader("content-type", "text/html");

        response.setContentType("text/html;charset=utf-8");//和上面代码等价。推荐使用此方法

//setContentType的不同参数

        //response.setContentType("text/xml");

        //response.setContentType("image/jpg");

  

        //发送字符串

        //response.getWriter().write("<html><head><title>this is tilte</title></head><body>中国</body></html>");

//发送字节数组,并设置转码

        response.getOutputStream().write("<html><head><title>this is tilte</title></head><body>中国</body></html>".getBytes("utf-8"));

  

    }

}

6.设置content-type响应头,控制浏览器以图片方式处理数据

//1.示例代码

@WebServlet("/ServletDemo1")

public class ServletDemo1extends HttpServlet {

//浏览器下载一张图片的基本代码,以后的下载都是在此基础上进行的封装

          protected voiddoGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {

                response.setHeader("Content-Type", "image/jpeg");

                // 读取位于项目根目录下的Krystal.jpg这张图片,返回一个输入流

                InputStreamin = this.getServletContext().getResourceAsStream("/Krystal.jpg");

                int len = 0;

                byte[] buffer =new byte[1024];

  

                OutputStream out = response.getOutputStream();

                while((len=in.read(buffer)) != -1) {

                        out.write(buffer, 0, len);

                }

        }

        protected voiddoPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {

                doGet(request, response);

        }

}

//2.提示:Content-Type头字段对应的值可通过tomcat服务器下conf/web.xml文件查找。

服务器发给浏览器的响应信息如下:

ServletDemo1的运行结果如下图所示:

在浏览器中显示出了图片。

7.设置content-disposition响应头,让浏览器下载文件

@WebServlet("/ServletDemo1")

public class ServletDemo1extends HttpServlet {

  

        // 定时刷新

        protected voiddoGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {

                response.setHeader("Content-Disposition", "attachment;filename=Krystal.jpg");

  

                InputStream in = this.getServletContext().getResourceAsStream("/Krystal(4).jpg");

                int len = 0;

                byte[] buffer =new byte[1024];

  

                OutputStream out = response.getOutputStream();

                while((len=in.read(buffer)) != -1) {

                        out.write(buffer, 0, len);

                }

        }

        protected voiddoPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {

                doGet(request, response);

        }

  

}

在浏览器中访问ServletDemo1就会弹出文件下载框,如下图所示:

可保存到桌面上。

 

原创粉丝点击