zoukankan      html  css  js  c++  java
  • JavaEE—— HttpServletResponse

     HttpServletResponse

    我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,

    一个为代表请求的request和代表响应response。

    service方法中的response的类型是ServletResponse,而doGet/doPost方法的response的类型是HttpServletResponseHttpServletResponse是ServletResponse的子接口,功能和方法更加强大。

    response的运行流程

    通过抓包工具抓取Http响应

    通过response设置响应行

    协议版本  404/500              

    设置响应行的状态码

    setStatus(int sc)

    通过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设置响应体

    响应体设置文本

    PrintWriter getWriter()

    获得字符流,通过字符流的write(String s)方法可以将字符串设置到response缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览器端。

    关于设置中文的乱码问题

    原因:response缓冲区的默认编码是iso8859-1,此码表中没有中文,可以通过response的setCharacterEncoding(String charset)设置response的编码

    通过response的setContentType(String type)方法指定页面解析时的编码是UTF-8

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

    上面的代码不仅可以指定浏览器解析页面时的编码,同时也内含setCharacterEncoding的功能,所以在实际开发中只要编写         response.setContentType("text/html;charset=UTF-8");就可以解决页面输出中文乱码问题。

    响应头设置字节

    ServletOutputStream  getOutputStream()

    获得字节流,通过该字节流的write(byte[] bytes)可以向response缓冲区中写入字节,

    在由Tomcat服务器将字节内容组成Http响应返回给浏览器。

     文件下载案例:

    代码演示:

     1 public class DownloadServlet extends HttpServlet {
     2 
     3     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     4         //获取要下载的文件名称
     5         String filename=request.getParameter("filename");
     6         //request解决中文乱码
     7         filename=new String(filename.getBytes("ISO-8859-1"),"utf-8");
     8         //获取请求头中的浏览器信息
     9         String agent=request.getHeader("User-Agent");
    10         //复制不同浏览器对文件名编码的代码
    11         String filenameEncoder="";
    12         if (agent.contains("MSIE")) {
    13                 // IE浏览器
    14                 filenameEncoder = URLEncoder.encode(filename, "utf-8");
    15                 filenameEncoder = filenameEncoder.replace("+", " ");
    16         } else if (agent.contains("Firefox")) {
    17                 // 火狐浏览器
    18         BASE64Encoder base64Encoder = new BASE64Encoder();
    19                 filenameEncoder= "=?utf-8?B?"
    20                         + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
    21         } else {
    22                 // 其它浏览器
    23                 filenameEncoder= URLEncoder.encode(filename, "utf-8");                
    24         }
    25     
    26         System.out.println(filename);//薛之谦.txt
    27         //要下载的文件的类型—客户端会通过文件的MIME类型去区分类型
    28         response.setContentType(getServletContext().getMimeType(filename));
    29         //告知客户端文件的打开方式(下载)
    30         response.setHeader("Content-Disposition", "attachment;filename="+filenameEncoder);
    31         //获取文件的绝对路径
    32         String path=getServletContext().getRealPath("download/"+filename);
    33         //获得该文件的输入流
    34         FileInputStream fis=new FileInputStream(path);
    35         //获取文件输出流
    36         ServletOutputStream sos=response.getOutputStream();
    37         //文件的复制
    38         int len=0;
    39         byte[] bytes=new byte[1024];
    40         while((len=fis.read(bytes))!=-1){
    41             sos.write(bytes,0,len);
    42         }
    43         fis.close();
    44     }
    45 
    46     public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    47         doGet(request, response);
    48     }
    49 }

    解决response中文乱码:

     1     //request解决中文乱码
     2         filename=new String(filename.getBytes("ISO-8859-1"),"utf-8");
     3         //复制不同浏览器对文件名编码的代码
     4         String filenameEncoder="";
     5         if (agent.contains("MSIE")) {
     6                 // IE浏览器
     7                 filenameEncoder = URLEncoder.encode(filename, "utf-8");
     8                 filenameEncoder = filenameEncoder.replace("+", " ");
     9         } else if (agent.contains("Firefox")) {
    10                 // 火狐浏览器
    11         BASE64Encoder base64Encoder = new BASE64Encoder();
    12                 filenameEncoder= "=?utf-8?B?"
    13                         + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
    14         } else {
    15                 // 其它浏览器
    16                 filenameEncoder= URLEncoder.encode(filename, "utf-8");                
    17         }
    18     

    response细节点:

    1. response获得的流不需要手动关闭,web容器(tomcat容器)会帮助我们关闭,
    2. getWriter和getOutputStream不能同时调用
    3. 重定向语句一般作为终结代码
  • 相关阅读:
    @字节跳动8年老Android面试官谈;Context都没弄明白凭什么拿高薪?
    @阿里面试官:Android面试这些原理都给我讲明白了,最低都是20k起步!
    @以后面试官再问你三次握手和四次挥手,直接把这一篇文章丢给他
    @备战2020年金三银四,看这一篇面试文章就够了(合适各级Java人员)
    字节跳动面试,第三面挂了,这原因我服了!
    太可惜了,四面字节跳动,我的offer竟被一道“算法题”给拦截了
    @java2019面试题北京
    @2019.07 Android 面试真题集锦
    2018 Java线程热门面试题,你知道多少?
    阿里大厂的148道核心面试题,(程序员必备学习方向)offer收割机 全会月薪50k不难
  • 原文地址:https://www.cnblogs.com/2734156755z/p/9608564.html
Copyright © 2011-2022 走看看