javaWeb学习笔记-HttpServletResponse对象(一)

一、HttpServletResponse对象简介

HttpServletResponse和HttpServletRequest对象是在请求时创建的,并且每次请求都会创建新的HttpServletResponse和HttpServletRequest对象。
HttpServletResponse对象是服务器响应信息的封装,HttpServletRequest对象是客户端请求信息的封装。
HttpServletResponse是服务器响应信息的封装,响应常用的状态码有200:表示响应并处理完成
这里写图片描述
302:表示请求重定向
这里写图片描述
404:表示客户端请求有误
这里写图片描述
500:表示服务器端出现错误
这里写图片描述
具体的方法可以查看API,这里不多介绍。

二、HttpServletResponse的应用

1、常见的乱码问题
注意:乱码问题的产生通常是字符串的编码格式和页面的编码格式不同。

package test.response;

import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestResponse1 extends HttpServlet {

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

        /*
         * 我的java页面使用的gbk编码,网页的默认编码格式也是gbk。
         * 演示使用的IE浏览器,使用谷歌的话可能会有问题。
         * 另外,由于IE的原因,下面错误演示的结果可能和我的结果不同,但是正确演示的结果是相同的
         */

        // 测试下面的方法
        // 具体测试过程可以参考程序下面的分析
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

    public void test5_3(HttpServletResponse response) throws IOException {
        String str = "zhong国 "; // 不能有敏感字,所以换成拼音了
        //指定服务器的编码格式
        response.setCharacterEncoding("gb2312"); 

        response.getWriter().write(str); 
    }

    public void test5_2(HttpServletResponse response) throws IOException {
        String str = "zhong国 "; // 不能有敏感字,所以换成拼音了
        // 修改网页的编码
        response.setContentType("text/html;charset=ISO-8859");  
        response.getWriter().write(str); 
    }


    public void test5_1(HttpServletResponse response) throws IOException {

        String str = "zhong国 "; // 不能有敏感字,所以换成拼音了  
        response.getWriter().write(str);    

    }

    public void test4(HttpServletResponse response) throws IOException {

        /*
         * 直接写数字1,并没有显示
         * 但是改成1+""字符串的写法就会显示
         * 因为直接写1的话,会读取gbk码表中1对应的内容,并不是按照字符串的格式来编码
         */

        response.getOutputStream().write(1);    
//      response.getOutputStream().write((1+"").getBytes());    
    }

    public void test3(HttpServletResponse response) throws IOException {

        /*
         * 设置网页的编码格式,不止有response.setHeader("content-type", "text/html;charset=UTF-8")方法
         * 还可以使用meta 标签模拟响应头
         * 使用IE,谷歌的话可能不行
         */

        String str = "zhong国"; // 不能有敏感字,所以换成拼音了

        // 使用meta标签
        response.getOutputStream().write("<meta http-equiv='Content-Type' content='text/html;charset=utf-8'>".getBytes());
        response.getOutputStream().write(str.getBytes("UTF-8"));
    }

    public void test2(HttpServletResponse response) throws IOException, UnsupportedEncodingException {
        String str = "zhong国";  // 不能有敏感字,所以换成拼音了
        // 指定编码格式
        response.setHeader("content-type", "text/html,charset=utf-8"); 
        // 这里的text/html和charset=utf-8之间该是 ;符号,可是写成了 , 符号,就会有想不到的错误

        response.getOutputStream().write(str.getBytes("UTF-8"));
    }

    public void test1_2(HttpServletResponse response) throws IOException, UnsupportedEncodingException {
        String str = "zhong国"; // 不能有关键字,说以换成拼音了

        OutputStream out = response.getOutputStream();

        // 设置响应头,指定浏览器的解码格式
        response.setHeader("content-type", "text/html;charset=UTF-8");
        out.write(str.getBytes("UTF-8")); // 指定了字符串的编码格式
        // 因为字符串的编码格式和浏览器的编码格式相同,所以不会乱码
    }

    public void test1_1(HttpServletResponse response) throws IOException, UnsupportedEncodingException {
        String str = "zhong国"; // 不能有关键字,说以换成拼音了

        OutputStream out = response.getOutputStream();
        out.write(str.getBytes());  // 一种正常显示,不写编码格式以浏览器的默认格式显示。
        // 因为我的java页面使用的gbk编码,网页的默认编码格式也是gbk,所以不会乱码
    }

}

执行分析过程
test1_1和test1_2方法是两种不会出现乱码的写法,test1_1方法没有修改页面的编码,所以执行的结果为:
这里写图片描述

而test1_2方法修改了页面的编码,所以执行后页面的编码也会修改:
这里写图片描述

test2方法演示了一种编码失误造成的错误,错误的结果可能会因人而异,下面是我的错误结果:
这里写图片描述

test3方法提供了另外一种修改页面编码的方式,使用meta标签,运行结果:
这里写图片描述

test4方法演示了直接写数字不显示的错误和解决方法,当直接写数字时,我的运行结果是什么都不显示:
这里写图片描述

你的结果可能和我的不一样,不过没有关系,只要使用字符串的写法就能显示正确的结果,只要这个结果相同就行:
这里写图片描述

test5方式是使用getWriter方法直接书写字符串,我们先运行test5_1,结果出现了乱码:
这里写图片描述
这是为什么呢?查看API文档知道当我们没有指定getWriter方法时,这个方法的默认编码是ISO-8859。这也就导致了服务器端和网页两端的编码格式不一样,所以就显示了乱码。那么我们有两种方式解决问题,1、修改网页的编码格式,2、指定getWriter方法的编码格式。
    我们先试试修改网页编码的方法,运行test5_1方法,服务器抛出异常:
这里写图片描述
    方法1不行,我们再试试指定getWriter方法的编码格式,运行test5_2方法。果然没有乱码了。
这里写图片描述

2、实现文件的下载
先准备好要下载的文件:
这里写图片描述
servlet代码:

package test.response;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/TestResponse2")
public class TestResponse2 extends HttpServlet {

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

        // 具体的执行过程参考下面的分析。
        // 这里的测试使用的IE浏览器        
    }

    public void test2(HttpServletResponse response)
            throws MalformedURLException, UnsupportedEncodingException, FileNotFoundException, IOException {
        // 含有中文的文件

        String path = this.getServletContext().
                getResource("/download/海龟布偶3.jpg").getPath();

        String name = path.substring(path.lastIndexOf("/")+1);

        // 如果文件名是中文名字,那么就得进行url编码
        // 乱码的只是名字,对名字进行编码设置    使用URLEncoder
        response.setHeader("content-disposition", 
                "attachment; filename="+URLEncoder.encode(name, "UTF-8"));
//      response.setHeader("content-disposition", 
//              "attachment; filename="+name);

        // 文件读写
        InputStream in = null;
        OutputStream out = null;
        try {

            in = new FileInputStream(path);
            out = response.getOutputStream();

            byte[] buf = new byte[1024];
            int len = 0;
            while((len = in.read())>0){
                out.write(buf, 0, len);
            }

        } finally {
            if(in != null){
                in.close();
            }
            if(out != null){
                out.close();
            }
        }
    }

    public void test1(HttpServletResponse response) throws MalformedURLException {

        // 英文名文件

        // 先获取文件的路径
        String path = this.getServletContext().getResource("/download/Meizu_big02.jpg").getPath();

        // 截取文件名字并输出
        String name = path.substring(path.lastIndexOf("/")+1);
        System.out.println(name); 

        // 设置为下载
        response.setHeader("content-disposition", "attachment; filename="+name);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

执行分析:
先下载一个文件名是英文的文件,先执行test1方法,在下载的时候文件名正常显示。
这里写图片描述

英文名字没有问题,那么试试中文名,运行test2方法,下载的时候文件名乱码了:
这里写图片描述

因为执行文件名乱码了,所以我们要使用URLEncoder.encode方法对文件名进行编码,然后再次运行,就没有乱码了。
这里写图片描述

更多的response应用请查看:http://blog.csdn.net/q_sea__/article/details/79376991

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值