Servlet总结(3)--HttpServletResponse对象

一、HttpServletResponse对象
服务器收到客户端的请求时,创建好一个Servlet对象,同时,将客户端的请求封装到HttpServletRequest对象当中。而服务器响应给客户端的内容,被封装到HttpServletResponse对象当中。
为了书写方便,以下response代表的就是HttpServletResponse对象。
response主要就是用于将服务器的响应结果返回给客户端。
常用的方法有:
1、设置响应的编码格式setCharacterEncoding(“utf-8”);
告诉servlet,响应的数据按照utf-8的编码格式进行响应。

2、获取输出流,主要包括PrintWriter, 和OutputStream。
两者有什么区别?
1)PrintWriter表示字符流,OutputStream是字节流。
2)PrintWriter输出文本时,需要将字符串转换成某种字符集编码的字节数组,而使用PrintWriter不需要我们去做字符串到字节数组之间的转换,转换编码格式只需要通过设置响应头的形式设置(setContentType)。而OutoutStream是直接将字节流原封不动输出到客户端,不需要考虑编码格式的问题(二进制流)。
3)两种流在Servlet使用时是相互排斥的,如果使用期间需要更改,需要嗲用flush()方法,将缓冲区清除。
4)4. PrintWriter自动清空缓冲区的功能被使能时(构造函数中autoFlush置为true),仅当println()方法被调用时才自动清缓冲区,而不是像PrintStream一样遇到一个换行符就清缓冲。

3、设置响应头

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

告诉浏览器,响应内容根据什么格式进行显示。

一般来说,这三步顺序是这样的,尤其是1和2,在输出方法调用前(println() , write()等),一定要先设置好响应格式。

4、范例 往浏览器输出中文
使用PrntWriter输出

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

        //输出中文
        outputChineseByOutputStream(response);
    }

    /**
     * 将中文通过输出流输出到网页中
     * @param response
     * @throws IOException 
     */
    private void outputChineseByOutputStream(HttpServletResponse response) throws IOException {
        String data = "宝宝电力十足";

        /*OutputStream out = response.getOutputStream();

        response.setHeader("content-type" , "text/html;charset=UTF-8"); //设置文件头


         * 将中文转为字节数组,按照UTF-8格式进行编码

        byte[] dataBytesArr = data.getBytes("UTF-8");

        out.write(dataBytesArr);*/

        /*.
         * 第二种方式, 用PrintWriter流将中文输出
         * 1、  设置以什么编码方式输出到客户端上
         * 2、获取printWriter流
         * 3、设置客户端显示编码方式
         * 4、输出
         * 
         * *****务必注意,1和2顺序不能反!!!!!!!!!!!!!!!!
         * 
         * 
         * 如果是输出数字,必须将数字转化为字符串,然后将字节数组传出
         * 在开发过程中,如果希望服务器输出什么浏览器就能看到什么,那么在服务器端都要以字符串的形式进行输出。
         * 
         * 
         * 
         */
        response.setCharacterEncoding("utf-8");//1
        PrintWriter pw = response.getWriter();//2

        response.setContentType("text/html;charset=utf-8");//3
        // == 等同于    pw.write("<meta http-equiv='content-type' content='text/html;charset=utf-8'></meta>");
        pw.write(data);
    }

使用OutputStream输出

//设置响应格式
response.setCharacterEncoding("utf-8");
//获取outputStream
OutputStream op = response.getgetOutputStream();
//设置响应头
response.setContentType("text/html;charset=utf-8");
//输出中文
String data = "一行中文";
//获取字节数组,根据utf-8编码格式进行转码
byte[] byteArr = data.getBytes("utf-8");
//输出
op.write(byteArr);

总结:
1)输出字符串内容,使用PrintWriter更加方便,免去了获取字节数组这一步。
2)如果需要做到:服务器输出什么浏览器就能看到什么, 服务器只能以字符串形式输出,比如说数字,如果需要客户端显示服务器输出的数字,则在服务这边需要将数字转化为字符串进行输出。
3)输出文件,只能通过OutputStream输出,才能保证文件的完整性,如果通过PrintWriter进行输出,对于非字符类型的数据难以保证输出正确。
输出文件,需要调用setHeader告诉浏览器通过什么形式进行显示。

5、详解setHeader()
用于设置HTTP的包头,主要包括
(1)通用信息头
即能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data,Pragma
主要: Cache-Control , Connection , Data , Pragma , Trailer , Transfer-Encoding , Upgrade
(2)请求头
用于在请求消息中向服务器传递附加信息,主要包括客户机可以接受的数据类型,压缩方法,语言,以及客户计算机上保留的信息和发出该请求的超链接源地址等.
主要: Accept , Accept-Encoding , Accept-Language , Host ,

(3)响应头
用于在响应消息中向客户端传递附加信息,包括服务程序的名称,要求客户端进行认证的方式,请求的资源已移动到新地址等.
主要: Location , Server , WWW-Authenticate(认证头)

(4)实体头
用做实体内容的元信息,描述了实体内容的属性,包括实体信息的类型,长度,压缩方法,最后一次修改的时间和数据的有效期等.
主要: Content-Encoding , Content-Language , Content-Length , Content-Location , Content-Type

(4)扩展头
主要:Refresh, Content-Disposition

几种常用的头设置:
1)定时刷新页面

response.setHeader("refresh", "5");//设置refresh响应头控制浏览器每隔5秒钟刷新一次
response.setHeader("refresh","2;URL=otherPagename");//二秒跳到其它页面 

2)禁止缓存当前页面

response.setDateHeader("expries", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");

3)下载文件头

response.setHeader("Content-disposition","attachment;filename=2.jpg");

4)验证码图片头

response.setContentType("image/jpeg");//等同于response.setHeader("Content-Type", "image/jpeg");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值