Response响应

Response

IT那个小笔记

  1. response响应过程
  2. 设置响应信息
  3. 小练习

response响应过程

在去发送一个请求时,先会找到主机服务器再找到对应的Service,找到Servoce对应的引擎

引擎会找到对应的web应用,并且会创建request对象和response对象

找到应用后, 会执行应用的web.xml再去根据url-patten的内容创建Servlet对象

并且会调用Servlet对象的service方法,并且把创建的request对象和response对象传入到方法当中

拿到response对象后, 自己可以往响应当中写入一些自己给客户端的内容

通过response.getwrite().wirte("写的内容")方法进行写入,写的内容,是存到一个response缓冲区当中

当方法执行结束之后, tomcat就会从response缓冲区当中取出数据,取出你的数据同时,它自己还会自动的往里面添加一些服务器相关的信息进去

所以响应给浏览器时, 可以看到除了自己写的内容, 还会有一些服务器相关的信息

设置响应信息

设置响应行

  • 响应行显示协议版本和状态码通过setStatus(int i)进行设置
response.setStatus(230);

设置相应头

  • add代表添加新的内容
    • addHeader(String name,String value)
    • addIntHeader(String name,int value)
    • addDateHeader(String name,date)
Date date  = new Date();
response.addHeader("head1", "hhhh");
response.addIntHeader("head2", 111);
response.addDateHeader("head3", date.getTime());
  • set代表设置,已经存在的内容
    • setHeader(String name,String value)
    • setIntHeader(String name,int value)
    • setDateHeader(String name,Date value)
Date date  = new Date();
response.addHeader("head1", "hhhh");
response.addIntHeader("head2", 111);
response.addDateHeader("head3", date.getTime());

response.setHeader("head1","gggg");
response.setIntHeader("head2",222);

response.addHeader("head1", "jjjj");

重定向

  • 什么是重定向
    • 到服务器当中去找servlet1
    • servlet1当中没有这个资源,告诉你去找servlet2
    • 再去发送一个请求到servlet2
  • 特点
    • 要访问两次服务器(一次人为访问,一次重定向)
    • 浏览器地址栏地址切换到另外一个地址
  • 设置重定向
    • 状态码设为302:response.setState(302);
    • 设置重定向地址:response.setHeader("location","地址");
    • 定时重定向:response.setHeader("refresh","5;url=地址")

还可以通过sendRedirect("地址")方法来设置重定向地址

给响应头location设置值的过程就被封装在这个方法中

比原先也就少写一个词

response.sendRedirect("地址")

设置响应体

 /* 通过write方法来设置响应体 */
 response.getWriter().write("哈哈哈哈");

但是结果出现乱码

这是因为把写的内容存到缓存区中使用的是ISO8859

ISO8859不支持中文,所以会乱码

/* 在存之前设置可以设置含中文的编码 */
response.setCharacterEncoding("UTF-8");

/* 并且还要让浏览器的显示编码也设为同样的编码 */
response.setHeader("Content-Type", "text/html;charset=UTF-8");

实际上可以只写第二条,当设置浏览器使用的编码后,服务器内部的处理(写的内容存到缓冲区的过程)也就会使用这个编码

和上面设置重定向地址就是给location设值一样,它也有一个封装方法来给Content-Type设置值

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

上面是写一条字符串,如果是写一个文本文件

 response.setHeader("Content-Type", "text/html;charset=UTF-8");
     FileInputStream in = new FileInputStream(this.getServletContext().getRealPath("file.txt"));
     InputStreamReader reader = new InputStreamReader(in);
     char[] buffer = new char[10];
     int len = 0;
     while((len = reader.read(buffer))>0) {
        response.getWriter().write(buffer,0,len);   
     }
     
/* 
 将输入字节流转成字符流
 避免汉字按字节读出现不完整
 read方法一次读10个放入数组
 将每次的数组写出
 若没有内容可读即len = -1
 则出循环
*/

小练习:下载文件

需求:将服务器中的文件下载到电脑当中

如果直接用<a>标签或者<form>表单去访问文件,浏览器能解析的文件就会直接打开。视频文件会直接播放,图片或文本直接打开而不是下载

因此需要一些步骤,即需要写java代码也就是用Servlet

1.通过发送一个Servlet请求,把文件名发送给服务器 2.接收到文件名参数,获取文件的绝对地址 3.通过流的形式来去写到浏览器 4.并且要告诉文件是什么类型 (浏览器是以MIME的类型来识别类型) 5.再设置响应的类型 6.设置响应头,让浏览器不是解析而是以附件形式保存下来

public class DownLoad extends HttpServlet {

  @Override
  protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   /* 获取链接传入的参数 */
      String name = request.getParameter("filename");
   
   /* 通过名字获取它是什么文件格式 */  
      String mimeType = this.getServletContext().getMimeType(name);
   /* 获取后把这个格式设置上去,否则下载的文件没有格式 */
      response.setContentType(mimeType);
   
   /* 对参数处理的编码默认是ISO8859-1
      因此如果是中文,name会得到乱码
      将其再之前的编码转回二进制流
      再转成字符串用含中文的编码方式
    */   
      byte[] b = name.getBytes("ISO8859-1");
      name = new String(b,"UTF-8");
      
      /* 浏览器去读取文件名是中文的话也会出现问题
         但不同的浏览器编码不同
         先获取客服端信息,看是什么浏览器
       */
      String agent = request.getHeader("User-Agent");
      // 定义一个变量记录编码之后的名字
      String filenameEncoder = "";
      if (agent.contains("MSIE")) {
        // IE编码
        filenameEncoder = URLEncoder.encode(name, "utf-8");
        filenameEncoder = filenameEncoder.replace("+", " ");
      } else if (agent.contains("Firefox")) {
        // 火狐编码
        BASE64Encoder base64Encoder = new BASE64Encoder();
        filenameEncoder = "=?utf-8?B?" + base64Encoder.encode(name.getBytes("utf-8")) + "?=";
      } else {
        // 浏览器编码
        filenameEncoder = URLEncoder.encode(name, "utf-8");
      }
      
      // 设置以附件形式下载,并且下载的文件名是上面处理后的
      response.setHeader("content-disposition", "attachment;filename="+filenameEncoder);
      
      String path = this.getServletContext().getRealPath(name);
      InputStream in = new FileInputStream(path);
      ServletOutputStream out = response.getOutputStream();
      
      byte[] buffer = new byte[1024];   
      int len = 0;     
      while((len = in.read(buffer))>0) {
        out.write(buffer, 0, len);
      }
      
      in.close();
  }

}

注意:最好用7版本的tomcat,新的一些版本8,9根本无法传入中文参数。更别谈后面对中文参数的处理了

本文分享自微信公众号 - IT那个小笔记(qq1839646816),作者:木瓜煲鸡脚

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-08-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SQL基础操作

    =(等于)、!=(不等于)、<>(不等于)、<(小于)、<=(小于等于)、>(大于)、>=(大于等于);

    木瓜煲鸡脚
  • Action访问

    发送请求后就会找到相应的Action类,访问执行execute方法(默认),通过method属性可配置访问的方法

    木瓜煲鸡脚
  • JDBC——基本使用

    JDBC代表Java数据库连接(Java Database Connectivity),它是用于Java编程语言和数据库之间的数据库无关连接的标准Java AP...

    木瓜煲鸡脚
  • 返回用户指定页面的web服务器

    skylark
  • 面向对象封装的web服务器

    skylark
  • Laravel 如何优雅的实现输出结构统一的功能?

    一般的项目需求都会要求统一的输出结构,特别是对于api应用而言。因此,如果有beforeResponse的功能,则可以在数据输出之前对response进行统一格...

    写PHP的老王
  • 爬爬更健康

    爬取淘宝商品的信息,数据主要用于分析市场趋势,从而制定一系列营销方案。实现功能如下:

    公众号---志学Python
  • IOS Alamofire使用get获取数据

    用户5760343
  • IOS Alamofire使用Post获取数据

    用户5760343
  • servlet设置缓存时间以及文件的下载

    缓存时间的设置: 1 public void doGet(HttpServletRequest request, HttpServletResponse res...

    欠扁的小篮子

扫码关注云+社区

领取腾讯云代金券