HttpServletResponse

service方法中的response的类型是ServletResponse,而doGet/doPost方法的response的类型是HttpServletResponse,

HttpServletResponse是ServletResponse的子接口,功能和方法更加强大

response的运行流程

因为response代表响应,所以我们可以通过该对象分别设置Http响应的响应行,响 应头和响应体

常用操作:

通过response设置响应行

设置响应行的状态码

response.setStatus(302);

通过response设置响应头

①addHeader(String name, String value) 

②addIntHeader(String name, int value) 

③addDateHeader(String name, long date) 

④setHeader(String name, String value) 

⑤setDateHeader(String name, long date) 

⑥setIntHeader(String name, int value)

 

其中,add表示添加,而set表示设置

重定向需要:

1.状态码:302

2.响应头:location 代表重定向地址

//重定向
//设置状态吗
response.setStatus(302);
//设置响应头Location
response.setHeader("Location", "Servlet04");

但是实际开发中不会写这么麻烦,有相应的方法

response.sendRedirect("Servlet04");

 延伸:

setHeader()的多种用法

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

②二秒跳到其它页面 response.setHeader("refresh","2;URL=otherPagename");(常用)

③没有缓存:
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");

④通知浏览器数据採用的压缩格式:response.setHeader("Content-Encoding","压缩后的数据"); 

⑤快速浏览器压缩数据的长度:response.setHeader("Content-Length",压缩后的数据.length+"");

⑥快速浏览器图片或视频:response.setHeader("Content-type","这个參数在tomcat里conf下的web.xml里面找");

⑦快速浏览器已下载的形式:response.setHeader("Content-disposition","attachment;filename=2.jpg");

举例:

实现页面跳转

方法一:

response.setHeader("refresh", "5;url=https://www.baidu.com/");

5秒钟后跳转到百度

方法二:

js实现页面跳转

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="jquery-3.2.1.min.js"></script>
<script type="text/javascript">
    var time=5;
    var second=null;
    $(function(){
        aaa();
    })
    function aaa(){
        var timer=setInterval(function(){
            second=$(".second");
            time--;
            second.html(time);
            if(time==0){
                clearInterval(timer);
                location.href="https://www.baidu.com/";
            }
        },1000);
    }
</script>
</head>
<body>
    恭喜你注册成功!
    <span style="color:red" class="second">5</span>秒后跳转,如不跳转请点击
    <a herf="https://www.baidu.com/">这里</a>
</body>
</html>

通过response设置响应体

响应体设置文本

PrintWriter getWriter()

获得字符流,通过字符流的write(String s)方法可以将字符串设置到response缓冲区中,

随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览器端。

中文乱码的解决:

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

详情请见:https://www.cnblogs.com/Ace-suiyuan008/p/9603317.html

 

响应头设置字节

 

ServletOutputStream  getOutputStream()

 

获得字节流,通过该字节流的write(byte[] bytes)可以向response缓冲区中写入字 节,在由Tomcat服务器将字节内容组成Http响应返回给浏览器。

 

传输照片实例:

public class PictureServlet extends HttpServlet {
    //传输照片
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //明确数据源
        String path=getServletContext().getRealPath("WallpaperStudio10-42653.jpg");
        //获得输入流
        FileInputStream fis=new FileInputStream(path);
        //明确目的地
        ServletOutputStream sos=response.getOutputStream();
        //开始复制
        int len=0;
        byte[] bytes=new byte[1024];
        while((len=fis.read(bytes))!=-1){
            sos.write(bytes,0,len);
        }
        //释放资源
        fis.close();
    }

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

案例:文件下载

文件下载的实质就是文件拷贝,将文件从服务器端拷贝到浏览器端。

所以文件下载需 要IO技术将服务器端的文件使用InputStream读取到,在使用 ServletOutputStream写到response缓冲区中

页面:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h1>使用服务器端的编码方式实现文件下载</h1>
    <a href="/WEB004/DownLoadServlet?filename=WallpaperStudio10-42653.jpg">图片</a>
    <a href="/WEB004/DownLoadServlet?filename=FSCapture.rar">压缩包</a>
    <a href="/WEB004/DownLoadServlet?filename=你好.txt">文档</a>
    <a href="/WEB004/DownLoadServlet?filename=MPEG0039.AVI">视频</a>
</body>
</html>

Servlet:

public class DownLoadServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取要下载的文件名称
        String filename=request.getParameter("filename");
        //request解决中文乱码(要先把中文乱码解决在解决不同浏览器的编码问题)
        filename=new String(filename.getBytes("ISO8859-1"),"UTF-8");
        //获取请求头中的浏览器信息
        String agent=request.getHeader("User-Agent");
        //复制不同浏览器对文件名编码的代码
        String filenameEncoder="";
        if (agent.contains("MSIE")) {
                // IE浏览器
                filenameEncoder = URLEncoder.encode(filename, "utf-8");
                filenameEncoder = filenameEncoder.replace("+", " ");
        } else if (agent.contains("Firefox")) {
                // 火狐浏览器
        BASE64Encoder base64Encoder = new BASE64Encoder();
                filenameEncoder= "=?utf-8?B?"
                        + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
        } else {
                // 其它浏览器
                filenameEncoder= URLEncoder.encode(filename, "utf-8");                
        }
        //要下载的文件类型--客户端会根据文件的MIME类型区分
        response.setContentType(getServletContext().getMimeType(filename));
        //告知客户端文件的打开方式(下载)
        response.setHeader("Content-Disposition", "attachment;filename="+filenameEncoder);
        //获取文件绝对路径
        String path=getServletContext().getRealPath("DownLoad/"+filename);
        //获得该文件的输入流
        FileInputStream fis=new FileInputStream(path);
        BufferedInputStream bis=new BufferedInputStream(fis);
        //获得文件输出流
        ServletOutputStream sos=response.getOutputStream();
        BufferedOutputStream bos=new BufferedOutputStream(sos);
        //复制文件
        int len=0;
        byte[] bytes=new byte[1024];
        while((len=bis.read(bytes))!=-1){
            bos.write(bytes,0,len);
        }
        //释放资源
        fis.close();
    }

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

注意:

图片从服务器端传输到浏览器,但浏览器直接解析图片显示在页面上, 而不是提供下载,我们需要设置两个响应头,告知浏览器文件的类型和文件的打开方式。

1)告知浏览器文件的类型:

response.setContentType(文件的MIME类型);

2)告示浏览器文件的打开方式是下载:

response.setHeader("Content-Disposition","attachment;filename=文件名称");

 

response细节点:

①response获得的流不需要手动关闭,web容器(tomcat容器)会帮助我们关闭,

②getWriter和getOutputStream不能同时调用

 

重定向语句一般作为终结代码

 

 

posted on 2018-09-10 14:50  落雨无晴  阅读(335)  评论(0编辑  收藏  举报