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);
设置响应头
方法名 |
作用 |
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());
方法名 |
作用 |
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());
重定向
- 什么是重定向:到服务器当中去找
Servlet1
Servlet1
当中没有这个资源,告诉你去找 Servlet2
- 再去发送一个请求到
Servlet2
重定向的状态码
重定向的特点
- 要访问两次服务器
- 第一次访问是人为的去访问
- 第二次是自动的访问
- 浏览器地址栏会发生变化
设置重定向
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的方式来写
方法名 |
作用 |
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) |
一次性写指定个数的字符 |
getWrite()
和 getOutputSteam
不能同时调用