response响应过程
在去发送一个请求时, 会找到tomcat引擎,引擎会找到对应的web应用,并且会创建request对象和response对象,找到应用后, 会执行应用的web.xml再去根据url-patten的内容创建Servlet对象,并且会调用Servlet对象的service方法,并且把创建的request对象和response对象传入到方法当中,拿到response对象后, 自己可以往响应当中写入一些自己给客户端的内容,通过response.getwrite().wirte(“写的内容”)方法进行写入,写的内容,是存到一个response缓冲区当中,当方法执行结束之后, tomcat就会从response缓冲区当中取出数据,取出你的数据同时,它自己还会自动的往里面添加一些服务器相关的信息进去,所以响应给浏览器时, 可以看到除了自己写的内容, 还会有一些服务器相关的信息。
设置响应行
response.setState(Int code);
设置响应头
- add
add代表添加新的内容
addHeader(String name,String value);
addIntHeader(String name,int value);
addDateHeader(String name,date);
- set
set代表设置,已经存在的内容
setHeader(String name,String value);
setIntHeader(String name,int value);
setDateHeader(String name,Date value);
重定向
-
什么是重定向
到服务器当中去找servlet1,servlet1当中没有这个资源,告诉你去找servlet2,再去发送一个请求到servlet2. -
状态码
302 -
特点
1.要访问两次服务器,第一次访问是人为的去访问,第二次是自动的访问。
2.浏览器地址栏已经发生变化。 -
设置重定向
1.设置响应码
response.setStatus(302);
2.设置响应头
response.setHeader("location","/Hello");
- 封装的重写向
每次都要写状态码,和location比较麻烦,就给封装了一个方法。
response.sendRedirect("/Hello");
- 定时刷新重定向,在HTTP协议中,定义了一个Refresh头字段,可以通知浏览器在指定的时间内自动刷新并跳转到其它页面。
response.setHeader("refresh","5;url=http://www.baidu.com")
自动刷新
response.setHeader("refresh","3");
设置响应体
- 通过write方法来写
response.getwrite().wirte(“要写的内容”),默认情况下写的中文内容会乱码。
把写的内容存到缓存区中使用的是ISO8859,ISO8859不支持中文,所以会乱码。
在存之前设置可以设置存放的编码,浏览器一般默认编码格式为GB2312,告知浏览器使用的是utf-8编码
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Type", "text/html;charset=UTF-8");
使用封装写法
response.setContentType("text/html;charset=UTF-8");
tomcat看到设置了为utf-8的编码,它在存在的时候也会使用utf-8的编码。
例子:
@WebServlet("/Servlet2")
public class Servlet2 extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.write("浏览器");
}
}
- 通过OutPutStream来写
write():一次性写一个字符
write(buffer):一个性写多个字符
write(buffer,0,len):一次性写指定个数的字符
@WebServlet( "/Servlet5")
public class Servlet5 extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getOutputStream().write("output".getBytes());
}
}
response响应图片在浏览器
@WebServlet( "/Servlet5")
public class Servlet5 extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
String realPath = servletContext.getRealPath("/img/1.jpg");
FileInputStream inputStream = new FileInputStream(realPath);
ServletOutputStream outputStream = response.getOutputStream();
byte[] b = new byte[1024];
int len ;
while ((len = inputStream.read(b))>0){
outputStream.write(b,0,len);
}
}
}
浏览器结果:
response注意点:
getWrite()和getOutputSteam不能同时调用
FileInputSteam
1.read方法读取一个字节
@WebServlet("/Servlet3")
public class Servlet3 extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String realPath = this.getServletContext().getRealPath("/a.txt");
//1.把指定的文件转成二进制
FileInputStream inputStream = new FileInputStream(realPath);
//2.读取一个字节,读取的结果是一个int类型的assic码读到文件的结尾返回的是一个-1
System.out.println(inputStream.read());
System.out.println(inputStream.read());
System.out.println(inputStream.read());
System.out.println(inputStream.read());
}
}
2.read(byte[] b)
一次读取多个字节,并存放到数组b中
@WebServlet("/Servlet4")
public class Servlet4 extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
byte[] b = new byte[1024];
String path = this.getServletContext().getRealPath("/a.txt");
FileInputStream inputStream = new FileInputStream(path);
int len;
while ((len = inputStream.read(b))>0){
System.out.println(new String(b, 0, len));
}
}
}
控制台打印结果: