zoukankan      html  css  js  c++  java
  • HttpServletResponse

    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不能同时调用

     

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

     

  • 相关阅读:
    “猫癣”集团借IE7新漏洞再掀风浪 狼人:
    研究人员在黑帽安全大会演示SSL攻击 狼人:
    猫癣病毒“躲猫猫” 移师广东东莞月入百万 狼人:
    Adobe两款软件存在缺陷 黑客可控制用户PC 狼人:
    安全观点:遭遇数据泄露破坏 损失的不只是金钱 狼人:
    McAfee报告称七成手机制造商认为手机安全至关重要 狼人:
    微软表示本月将发布五个Windows 7更新 狼人:
    Gmail电子邮件曝全球性故障 谷歌向用户道歉 狼人:
    Google Talk被黑客利用 发动钓鱼攻击 狼人:
    谷歌GMail邮件服务出现故障 部分服务已恢复 狼人:
  • 原文地址:https://www.cnblogs.com/Ace-suiyuan008/p/9617618.html
Copyright © 2011-2022 走看看