response-学习笔记
一、ServletContext
1. 什么是ServletContext
-
ServletContext:Servlet上下文。是整个web项目封装成的对象:当Tomcat启动时,会把web项目信息封装成一个ServletContext对象。
-
如何获取ServletContext:
在(HttpServlet方式的)Servlet里使用方法
ServletContext context = this.getServletContext();
2. ServletContext的作用
2.1 是一个域对象(面试题)
-
域对象:由Servlet规范提供的,能够存储数据的对象,在域对象里的数据,在其作用范围内可以共享
-
域对象有:ServletContext, request, session, PageContext
-
域对象存取数据的方法:
-
setAttribute(String name, Object value)
:存数据 -
getAttribute(String name)
:取数据 -
removeAttribute(String name)
:删数据
-
-
ServletContext的作用范围:
-
何时创建:服务器启动时
-
何时销毁:服务器关闭时
-
作用范围:整个web项目
-
2.2 可以获取项目里任意资源
-
读取src里的资源文件:
InputStream is = 类加载器.getResourceAsStream("资源文件在src里的路径");
-
读取web里的资源文件:
InputStream is = servletContext.getResourceAsStream("资源文件在web里的路径"); String realPath = servletContext.getRealPath("资源文件在web里的路径");
二、HTTP协议
1. HTTP协议简介
-
HTTP:HyperText Transfer Protocol,超文本传输协议
-
HTTP协议:是客户端和服务端数据交互时,数据的格式规范
-
HTTP协议分为:
-
HTTP请求:客户端发给服务端的数据
-
HTTP响应:服务端返回给客户端的数据
-
-
没有请求,就没有响应;有请求才有响应
2. 抓包工具
-
用来抓取HTTP请求和HTTP响应数据的工具。只能看,不能拦截,不能修改
-
HttpWatch,浏览器自带的F12->Network(网络)
3. HTTP响应
响应行
-
本次响应的基本信息
-
格式:协议版本 响应状态码 [响应状态描述]
-
比如:
HTTP/1.1 200
-
常见的响应状态码:
-
200:一切正常
-
302:重定向,让浏览器跳转到其它地址
-
304:让浏览器取本地缓存
-
404:找不到资源
-
500:服务器内部错误
-
响应头
-
本次响应的附加信息
-
格式:一行一个键值对,一个键值对是一个响应头,一次响应可以有多个响应头
-
比如:
Content-Length: 12
响应体
-
本次响应的正文内容,是会显示到浏览器页面上的内容
-
格式:没有固定格式。请求什么,就响应什么
三、response操作响应
1. response简介
-
response:用于操作HTTP响应的一个对象,是HttpServletResponse的实例对象。
2. response原理
3. response操作响应
3.1 操作响应行
-
设置响应状态码:
//通常用于设置 非错误码 response.setStatus(int code); //通常用于设置 错误码 response.sendError(int code); response.sendError(int code, String errorMsg);
3.2 操作响应头
-
设置响应头
response.setHeader(String name, String value)
-
==重定向功能的实现==
让浏览器立即跳转到指定的地址
response.sendRedirect("/项目路径/资源路径");
3.3 操作响应体
3.3.1 通过字符型设置响应体
//解决中文响应体乱码。一定要写在获取writer对象之前,否则无效 response.setContentType("text/html;charset=utf-8"); PrintWriter writer = response.getWriter(); writer.print("想要发送到浏览器页面上显示的内容");
3.3.2 通过字节型设置响应体
//获取输出流 ServletOutputStream os = response.getOutputStream();
3.4 文件下载功能
@WebServlet(urlPatterns="/download", name="DownloadServlet") public class DownloadServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.接收参数:filename String filename = request.getParameter("filename"); /** * 增加代码:让浏览器弹出下载框,而不是显示响应体里的内容 */ response.setHeader("Content-Disposition","attachment;filename=" + DownloadUtils.encodeFilename(request, filename)); //2.获取文件的输入流 ServletContext context = this.getServletContext(); InputStream inputStream = context.getResourceAsStream("WEB-INF/files/" + filename); //3 获取输出流 ServletOutputStream outputStream = response.getOutputStream(); //4.把数据写到输出流里 int len = -1; byte[] buffer = new byte[1024 * 8]; while ((len = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, len); } //5.关闭流 inputStream.close(); outputStream.close(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } }
内容回顾
-
能够说出ServletContext域对象:
-
何时创建:服务器启动时
-
何时销毁:服务器关闭时
-
作用范围:整个web项目
-
-
能够读取web项目里任意资源文件
-
读取src里的资源:
类加载器.getResourceAsStream("文件在src里的路径");
-
==读取web里的资源==:
servletContext.getResourceAsStream("文件在web里的路径");
-
-
理解response的原理
-
response操作响应:
-
操作响应行:
response.setStatus(int code)
-
操作响应头:
response.setHeader(String name, String value)
-
==让浏览器重定向跳转==:
response.sendRedirect("/项目路径/资源路径")
-
操作响应体:
-
==字符型:==
response.setContentType("text/html;charset=utf-8"); response.getWriter().print("页面上显示的内容");
-
字节型
ServletOutputStream os = response.getOutputStream();
-
-