Response

Response响应过程

  • 在发送一个请求时,会找到 tomcat 引擎
  • 引擎会找到对应的 web 应用
  • 并且会创建 request 对象和 response 对象
  • 找到应用后,会执行应用的 web.xml 再去根据 url-patten 的内容创建 Servlet 对象
  • 并且会调用 Servlet 对象的 Service 方法,并且把创建的 request 对象和 response 对象传入到方法当中
  • 拿到 response 对象后,自己可以往响应当中写入一些自己给客户端的内容
  • 通过 response.getwrite().wirte("写的内容") 的方式进行写入
  • 写的内容,是存到一个 response 缓冲区当中
  • 当方法执行结束之后,tomcat 就会从 response 缓冲区当中取出存储的数据
  • 取出你存储的数据同时,它自己还会自动的往里面添加一些服务器相关的信息进去
  • 所以响应给浏览器时,可以看到除了自己写的内容,还会有一些服务器相关的信息

流程图

学习Response

  • 学习如何通过 response 设置响应行,响应头,响应体即可

设置响应行

response.setStatus(200);

设置响应头

  • add 代表添加新的内容
方法名 作用
addHeader(String name,String value) 添加字符串请求头
addIntHeader(String name,int value) 添加数字请求头
addDateHeader(String name,date) 添加日期请求头
response.addHeader("name", "BNTang");
response.addIntHeader("age", 23);
response.addDateHeader("birthDay",new Date().getTime());

  • set 代表设置,更改已经存在的内容
方法名 作用
setHeader(String name,String value) 设置字符串请求头
setIntHeader(String name,int value) 设置数字请求头
setDateHeader(String name,Date value) 设置日期请求头
response.setHeader("name", "BNTang");
response.setIntHeader("age", 23);
response.setDateHeader("birthDay",new Date().getTime());

  • 添加两个相同的 name

重定向

  • 什么是重定向:到服务器当中去找 Servlet1
  • Servlet1 当中没有这个资源,告诉你去找 Servlet2
  • 再去发送一个请求到 Servlet2

重定向的状态码

  • 重定向的状态码是:302

重定向的特点

  • 要访问两次服务器
  • 第一次访问是人为的去访问
  • 第二次是自动的访问
  • 浏览器地址栏会发生变化

设置重定向

  • 设置响应码
response.setStatus(302);
  • 设置响应头
response.setHeader("location", "/bntang/servlet2");

封装的重写向

  • 每次都要设置状态码,和 location 比较麻烦
  • 内部提供了一个封装好了的一个方法
response.sendRedirect("/bntang/servlet2");

定时刷新重定向

response.setHeader("refresh", "5;url=https://www.cnblogs.com/BNTang/");
  • 5:代表 5秒
  • url 的值为 5秒后要去跳转的地址

设置响应体

通过write的方式来写

  • 格式如下:
response.getwrite().wirte(“要写的内容”)
  • 默认情况下写的中文内容会乱码
  • 把写的内容存到缓存区中使用的是 ISO8859-1 的编码的方式进行存储的
  • ISO8859-1 不支持中文,所以会乱码
  • 在存之前可以设置存放的编码,如下:
response.setCharacterEncoding("UTF-8");

  • 告知浏览器使用的是 utf-8 编码的方式,如下:
response.setHeader("Content-Type", "text/html;charset=UTF-8");

  • 设置写出的内容如下:
response.getWriter().write("小灰灰");

  • 上面的代码只需要写第二句就行,tomcat 看到设置了为 utf-8 的编码
  • 它在存数据的时候也会使用 utf-8 的编码
  • 使用封装的写法,如下:
response.setContentType("text/html;charset=UTF-8");

  • 测试的方式就行自己启动服务器在浏览器当中请求 Servlet 即可验证

通过OutPutStream的方式来写

FileInputSteam

方法名 作用
read 读取一个字节
read(byte[] b) 一次读取多个字节,并存放到数组 b 中
  • read:读取一个字节,读取的结果是一个 int 类型的 assic 码
  • 读取到文件结尾的时候,返回的是一个 -1,读取方式如下:
FileInputStream fileInputStream = new FileInputStream("BNTang.txt");
System.out.println(fileInputStream.read());

  • read(byte[] b):上面是一次一滴一滴给你,这种是一次装一桶水再给你,返回的是读取了几个字节
byte[] bytes = new byte[10];
int count = fileInputStream.read(bytes);
System.out.println(Arrays.toString(bytes));

  • 读取全部的数据,代码如下:
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    FileInputStream fileInputStream = new FileInputStream("BNTang.txt");
    byte[] bytes = new byte[5];

    int len = 0;
    while ((len = fileInputStream.read(bytes)) > 0) {
        System.out.println(new String(bytes, 0, len));
    }

    fileInputStream.close();
}

  • 之前读的代码也记得需要关闭流,释放资源

FileOutputSteam

  • 一下的方法是进行写出用的我这里就不演示了,同上
方法名 作用
write() 一次性写一个字符
write(buffer) 一次性写多个字符
write(buffer,0,len) 一次性写指定个数的字符
  • response 注意点
  • getWrite()getOutputSteam 不能同时调用
posted @ 2020-10-23 19:25  BNTang  阅读(397)  评论(0编辑  收藏  举报