request&reponse
Request对象
Request理解
- request是由tomcat创建的,request对象是来获取请求信息主要是用于获取请求行、请求头、请求体中的数据
Request对象的体系
- ServletRequest 接口 继承
- HttpServletRequest子接口 实现
- org.apache.catalina.connector.RequestFacade 实现类
Request作用
-
接收客户端的请求,获取请求中的信息。除了可以获取请求中携带的数据之外,还可以获取比如主机地址、端口、请求方式、项目名称等一系列信息。
-
请求分类:请求行、请求头、请求体
-
获取请求行数据
-
请求行中,可以通过request对象的相应方法获取到比如协议名、服务名、端口号、项目名称、请求方式、参数列表等信息。
-
示例
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * @author: ChengLong * @version: 11.0.2 * @datetime: 2021/8/17 9:12 */ /* * 请求行数据获取 * * */ @WebServlet("/rd1") public class Request_Demo01 extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String scheme = req.getScheme(); System.out.println("协议:"+scheme); System.out.println("服务名称:"+req.getServerName()); System.out.println("端口号:"+req.getServerPort()); System.out.println("项目名称:"+req.getContextPath()); //必须掌握 System.out.println("请求方式:"+req.getMethod()); //必须掌握 System.out.println("获取查询参数:"+req.getQueryString()); System.out.println("不包含协议和端口:"+req.getRequestURI()); System.out.println("包含协议和端口:"+req.getRequestURL()); //必须掌握 } }
-
-
获取请求头数据
-
请求头是当前对用户发送的数据的描述信息。
-
请求头信息在请求的时候不需要程序员手动添加,是浏览器发送的时候已经处理好的。
-
如果想查看请求头信息,也可以在Servlet中requeqt通过getHeader方法获取。
-
获取请求头数据的方法
方法名 描述 String getHeader(String name) 根据请求头的名称获取请求头信息 Enumeration getHeaderNames() 返回此请求包含的所有头名称的枚举 -
示例
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Enumeration; /** * @author: ChengLong * @version: 11.0.2 * @datetime: 2021/8/17 9:31 */ /* * 请求头数据获取 * request.getHeader("name") 根据请求头的key获取请求头的value * request.getHeaderNames() 获取所有请求头的key * */ @WebServlet("/rd3") public class Request_Demo03 extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 根据请求头的key获取请求头的value System.out.println("主机地址"+req.getHeader("Host")); //获取所有请求头的key Enumeration<String> names = req.getHeaderNames(); while (names.hasMoreElements()){ String key = names.nextElement(); //System.out.println("所有请求头的key"+key); String value = req.getHeader(key); System.out.println(key+":"+value); } } }
-
-
获取请求正文(体)数据
-
获取请求参数(必会)
-
只有post请求方式,才有请求体,在请求头中封装了post请求参数
方法名 描述 String getParameter(String name) 根据参数名获取参数值 String[] getParameterValues(String name) 根据参数名获取参数值(可以是多个值) Enumeration getPatameterNames() 获取所有的参数名 Map<String,String[]> getParameterMap() 获取所有参数的map集合 -
示例
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Arrays; import java.util.Enumeration; import java.util.Map; import java.util.Set; /** * @author: ChengLong * @version: 11.0.2 * @datetime: 2021/8/17 9:50 */ /* get:请求参数包含中文不会出现乱码 原因:tomcat8版本以上自动将get请求乱码自动解码 post:请求体中如果包含中文会出现乱码 原因:编码和解码的方式不一致。页面编码是utf-8类型,而request默认解码类型iso-8859-1 req.setCharacterEncoding("utf-8") 在接收前写 * 请求体的数据获取 * req.getParameter(key) 根据一个键获取一个值 * req.getParameterValues(key) 根据请求体中一个键获取多个值 * req.getParameterMap() 将请求体中所有的数据收到map中 * */ @WebServlet("/rd4") public class Request_Demo04 extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); String username = req.getParameter("username"); String password = req.getParameter("password"); String sex = req.getParameter("sex"); String[] hobbies = req.getParameterValues("hobby"); String work = req.getParameter("work"); String grjj = req.getParameter("grjj"); System.out.println(username); System.out.println(password); System.out.println(sex); System.out.println(Arrays.toString(hobbies)); System.out.println(work); System.out.println(grjj); Map<String, String[]> map = req.getParameterMap(); Set<Map.Entry<String, String[]>> entries = map.entrySet(); for (Map.Entry<String, String[]> entry : entries) { System.out.println(entry.getKey()+":"+Arrays.toString(entry.getValue())); } //获取所有的key Enumeration<String> parameterNames = req.getParameterNames(); while (parameterNames.hasMoreElements()){ System.out.println(parameterNames.nextElement()); } } }
-
-
中文乱码
- get:请求参数如果包含中文不会出现乱码
在tomcat8版本以上自动将get请求乱码默认解码 - post:请求体中如果包含中文会出现乱码
编码和解码方式不同造成,页面的编码是utf-8类型,而request默认解码类型iso-8859-1
解决:request.setCharacterEncoding("utf-8") 这行代码一定要放在接收参数之前设置
- get:请求参数如果包含中文不会出现乱码
-
-
获取ServletContext对象
-
示例
import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * @author: ChengLong * @version: 11.0.2 * @datetime: 2021/8/17 15:33 */ /*获取方式一 * req.getServletContext(); * 获取方式二 * getServletContext(); * *域对象 setAttribute(string,object) 存数据 getAttribute(string) 根据键取值 removeAttribute(string) 根据key移除值 * * */ @WebServlet("/scd1") public class ServletContextDemo01 extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 获取方式一 ServletContext con = req.getServletContext(); System.out.println(con); // 获取方式二 ServletContext servletContext = getServletContext(); con.setAttribute("msg","这个对象是真简单啊"); System.out.println(servletContext); } }
-
-
域对象:共享数据
-
域对象:可以实现不同组件之间的数据共享、实现servlet与servlet之间数据共享、servlet与jsp页面直接数据共享
-
request请求域对象:一次请求有效
-
session会话对象:一次会话有效(浏览器不关闭默认情况下30分钟后session中存放的数据也会消失)
-
ServletContext应用域对象:每一个web应用都有一个唯一ServletContext对象、服务器不关闭数据不小数
-
常用方法
方法名 描述 void setAttribute(String name,Object obj) 向作用域中存储数据 Object getAttribute(String name) 从作用域中获取数据 void removeAttribute(String name) 从作用域中移除数据
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * @author: ChengLong * @version: 11.0.2 * @datetime: 2021/8/17 10:37 */ /* * request域对象 * 一次请求有效 * setAttribute(str,object) 向域对象中添加值 * getAttribute(str) 根据域对象的key获取域对象值 * removeAttribute(str) 根据key移除域对象的值 * */ @WebServlet("/rd6") public class Request_Demo06 extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //存值 req.setAttribute("msg","这个域对象非常的简单"); //取值 String msg = (String) req.getAttribute("msg"); System.out.println(msg); //移除值 req.removeAttribute(msg); } } -
-
请求转发
-
理解
- 一种在服务器内部资源跳转的方式。浏览器请求ServletA资源时,ServletA资源不足或者没有资源,ServletA请求其他的资源然后响应给浏览器,这个过程叫转发;
-
特点
-
一次请求一次响应
- 请求转发地址栏不用加项目名
- 请求转发不能访问外网
- 浏览器地址栏不会发生变化
- 可以共享request域中的数据
-
Reponse对象
Response理解
- response是由tomcat创建的
- response对象是来设置响应信息
Response对象的体系
- ServletResponse 接口 继承
- HttpServletResponse子接口 实现
- org.apache.catalina.connector.ResponseFacade 实现类
Response作用
-
针对页面发送的请求做出数据响应,向页面输出信息,包括文本、图片、视频等。
-
响应分类:响应行、响应头、响应体。
-
设置响应行
-
响应行中包含的信息:可以通过开发者模式F12-Network查看
-
响应行包含协议和状态码
-
状态码
-
1xx -信息,服务器收到请求,需要请求者继续执行操作
-
2xx -成功,操作被成功接收并处理
-
3xx -重定向,需要进一步的操作以完成请求
-
4xx -客户端错误,请求包含语法错误或无法完成请求
-
5xx -服务器错误,服务器在处理请求的过程中发生了错误
-
常见状态码
-
200 响应成功
-
404 表示请求资源找不到
- 浏览器访问路径错误
- tomcat服务未开启,项目没有部署到tomcat服务器中
- 你要访问的页面资源在WEB-INF文件夹中,无法访问
-
401 未授权
-
302 资源重定向
-
500 表示服务器端代码出错,可以通过控制台查看异常消息
-
response.sendError(sc, msg)来设置状态信息,但一般不会手动设置,仅用来做测试。
-
-
-
设置响应头
- 响应头:服务器通知浏览器的一些信息
- 在浏览器中打开network工具时,每一次的请求响应数据,都可以被捕捉到,而在内容中Response Headers 中的内容就是当前这一次请求响应的响应头信息。
- response.setHeader(String name, String value):一个关键字对应一个值,如果设置了多个值,则会覆盖。
- response.addHeader(String name, String value);一个关键字可以对应多个值
- 在实际开发中,同一个响应头信息只会对应一个值,所以在使用时一般没什么区别
- refresh:完成定时跳转
- Content-Type: 响应内容的MIME类型 (text/html;charset=utf-8) image/jpg
- Content-Length: 响应体的长度(在UTF-8的编码格式下,一个汉字对应3个字节)
- Date: 发送响应的开始时间
- Content-Disposition:告诉浏览器以下载方式打开数据(做文件下载时使用)
-
设置响应体
-
响应的数据就是响应体。响应对象response在返回数据、响应数据的时候,会将一些HTML、text、流数据等信息通过响应主体返回给页面,而响应体绝大多数都是文本类型
-
响应数据需要通过流来进行数据传输,而response自带的流有两个
- response.getWriter().write()
response.getWriter().print() - response.getOutputStream
- 注意:这两个流不能同时存在。
- response.getWriter().write()
-
-
重定向
-
理解
- 重定向是客户端行为,当客户端浏览器向AServlet发送一个请求,经过处理后向客户端做出响应,这个响应就是向服务器再次发送新的请求,去请求BServlet,而这个新请求的地址将为浏览器做出第二次响应,此时浏览器地址栏会发生改变,由于一次请求/响应结束后,request对象会自动销毁,所以两次请求的request对象并非同一个,所以两次请求域中的数据信息不会共享。由此可见,重定向是做了两次请求和响应。
-
实现
-
特点
- 多次请求多次响应
- 可以访问外网
- 浏览器地址栏会发生变化
- 不可以携带request域对象中数据
- 重定向路径必须加项目名
-
-
ServletContext对象
-
ServletContext理解
- ServletContext是servlet中最大的域对象成为应用域
- 当tomcat服务器启动的时候、tomcat会为部署在webapps中每一个web应用创建一个ServletContext对象来表示当前项目上下文环境。(每一个项目都有一个唯一的ServletContext对象),它作为最大的共享域、里面包含的数据直到服务器关闭对象销毁数据才丢失
- 域对象:实现不同组件的数据共享、servlet与servlet数据共享、servlet与页面jsp直接的数据共享
- setAttibute(string,object) 存数据
- getAttibute(key) 根据键取值
- removeAttibute(key) 根据key移除值
-
ServletContext的获取
- request.getServletContext(); 推荐
- getServletContext();
-
ServletContext的作用
-
获取MIME类型
- MIME类型:在互联网中通信过程中定义一种文件数据类型
-
格式:
大类型/小类型 如 text/html image/jpg video/mp4- 获取方法:
String getMimeType(String file)
import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * @author: ChengLong * @version: 11.0.2 * @datetime: 2021/8/17 21:28 */ /* 判断文件类型 context.getMimeType(文件名) */ @WebServlet("/scd3") public class ServletContextDemo03 extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context = getServletContext(); String a1 = "a.jpg"; String type = context.getMimeType(a1); System.out.println(type); String b1 = "a2.mp4"; String type1 = context.getMimeType(b1); System.out.println(type1); } }-
域对象:共享数据
- ServletContext是一个全局作用域对象,在整个Web应用内所有用户所有请求的数据(周期长)。
- request作用域仅限于一次请求范围内可以实现信息的共享,一次请求结束,request对象消失,内部的值也随之消失,周期短,但效率高,不会占用过多的内存资源;而ServletContext是一个全局作用域对象,整个web项目的所有组件(Servlet、jsp)共享信息,周期长,可用来保存所有web组件之间需要共享的信息。它在tomcat服务器启动时创建,关闭时销毁。
-
获取文件的真实路径
-
getRealPath("web下的资源路径");
import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * @author: ChengLong * @version: 11.0.2 * @datetime: 2021/8/17 15:33 */ /*ServletContext 获取任意路径的资源在服务器中真实路径 src下a.txt文件 * * */ @WebServlet("/scd4") public class ServletContextDemo04 extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext servletContext = getServletContext(); //获取src目录下文件在服务器中真实路径 String path = servletContext.getRealPath("/WEB-INF/classes/a.txt"); System.out.println(path); // D:\Intellij_IDEA\apache-tomcat-8.5.69\webapps\WEB-INF\classes\a.txt //获取html目录下在服务器中真实路径 String path1 = servletContext.getRealPath("/html/b.txt"); System.out.println(path1); //D:\Intellij_IDEA\apache-tomcat-8.5.69\webapps\html\b.txt //获取根路径下文件在服务器中真实路径 String path2 = servletContext.getRealPath("c.txt"); System.out.println(path2); // D:\Intellij_IDEA\apache-tomcat-8.5.69\webapps\c.txt /* D:\Intellij_IDEA\apache-tomcat-8.5.69\webapps\WEB-INF\classes\a.txt D:\Intellij_IDEA\apache-tomcat-8.5.69\webapps\html\b.txt D:\Intellij_IDEA\apache-tomcat-8.5.69\webapps\c.txt */ } }
-
- 获取方法:
-

浙公网安备 33010602011771号