JavaWeb Request简单理解

tech2022-11-01  162

目录

Request对象获取请求行

Request对象获取请求头

Request获取请求参数

Request对象接收表单请求参数的中文乱码处理

Request域对象

请求转发

请求转发和重定向区别


Request对象: 负责获取客户端的请求数据 request对象是从客户端向服务器发出请求,包括⽤户提交的信息以及客户端的⼀些信息。客户端可通过 HTML 表单或在⽹⻚地址后⾯提供参数的⽅法提交数据,然后服务器通过 request对象的相关⽅法来获取这些数据。 查看Servlet中的service⽅法得知, Servlet中使⽤的ServletRequest接⼝, ⽽我们使⽤的是ServletRequest的⼦接⼝HttpServletRequest, 它继承⾃ServletRequest, 是与HTTP协议相关的Request请求对象 我们使⽤的⼦接⼝HttpServletRequest, 此接⼝对象由Tomcat引擎提供 可以实现客户端向服务器发出请求, 请求内容包括: 请求⾏,请求头,请求体

Request对象获取请求行

API

⽅法 返回值 描述 getMethod() String 获取提交的⽅式 (GET,POST) getRequestURI() String 获取请求的参数 , 请求服务器路径( / 开始 ) getRequestURL() StringBuffer 获取请求的参数 , 请求服务器路径(http 开始) getQueryString() String 获取请求⾏ 问号后⾯的参数 (GET) getContextPath() String 获取 WEB 应⽤名称

代码演示

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //request对象⽅法 getMethod()获取客户端的请求⽅式 String method = request.getMethod(); System.out.println(method); //⽅法 String getRequestURI() 获取请求服务器路径 //⽅法 StringBuffer getRequestURL() 获取请求服务器路径 String URI = request.getRequestURI(); StringBuffer URL = request.getRequestURL(); System.out.println("URI=="+URI);// /web03/line System.out.println("URL=="+URL);// http://localhost:8080/web03/line //⽅法 String getQueryString()获取请求⾏,?后⾯的所有参数 String query = request.getQueryString(); System.out.println(query);//user=tom&pass=123 //获取WEB应⽤名称 String getContextPath() String path = request.getContextPath(); System.out.println(path);// /web03 //获取WEB应⽤名称, 结合重定向使⽤ //response.sendRedirect(request.getContextPath()+"/ddd"); }

Request对象获取请求头

请求头数据格式键值对 , k:v 指导性信息 , 指导服务器 ⽅法 返回值 描述 getHeader(String name) String   获得⼀个key对应⼀个value的请求头 getHeaderNames() Enumeration 获取所有的请求头的键 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /* * Enumeration getHeaderNames() 获取所有的请求头的键 * 返回值Enumeration接⼝ (向量枚举) * 集合:1.0-1.1 Enumeration 集合1.2 迭代器 *Iterator迭代器接⼝: hasNext() next() * Enumeration接⼝: hasMoreElement() nextElement() */ Enumeration<String> enums = request.getHeaderNames(); while (enums.hasMoreElements()){ key = enums.nextElement(); String value = request.getHeader(key); System.out.println(key+"=="+value); } }

Request获取请求参数

⽅法 返回值 描述 getParameter(表单中的name ) String 获得提交的参数(⼀个 name对应⼀个value getParameterValues(表单中的 name ) String[] 获得提交的参数(⼀个 name对应多个value getParameterMap() Map<String,String[]> 获得提交的参数,将提交的参数名称和 对应值存⼊到⼀个 Map 集合中 <body> <form action="/param" method="post"> ⽤户名:<input type="text" name="username"><br/> 密 码:<input type="password" name="password"><br/> 爱 好:<input type="checkbox" name="hobby" value="Basketball">篮球 <input type="checkbox" name="hobby" value="football">⾜球 <input type="checkbox" name="hobby" value="pingpang">乒乒球 <br/> <input type="submit"> </form> </body> @WebServlet(urlPatterns = "/param") public class ParamServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获得提交的参数(⼀个name对应⼀个value) String username = request.getParameter("username"); String password = request.getParameter("password"); System.out.println(username +" == " +password); //获得提交的参数(⼀个name对应多个value) String[] hobbies = request.getParameterValues("hobby"); System.out.println("hobbies = " + Arrays.toString(hobbies)); //获得提交的参数,将提交的参数名称和对应值存⼊到⼀个Map集合中 Map<String, String[]> map = request.getParameterMap(); for(String key : map.keySet()){ String[] values = map.get(key); System.out.println(key + " == " + Arrays.toString(values)); } }

Request对象接收表单请求参数的中文乱码处理

POST ⽅式接收中⽂ 产⽣乱码的原因: post⽅式提交的数据是在请求体中,request对象接收到数据之后,放⼊request的缓冲区中。缓冲区就有编码(默认ISO-8859-1:不⽀持中⽂). 解决⽅案: request的缓冲区的编码修改了即可 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //将request的缓冲区的编码修改 request.setCharacterEncoding("utf-8"); //获取请求参数 String user = request.getParameter("user"); System.out.println("user = " + user); } GET ⽅式接收中⽂ Tomcat8.5 版本之后 , Tomcat ⾃动处理了 get请求的中⽂乱码问题,在 Tomcat8.5 之前的版本中 , get 请求的中⽂乱码需要⾃⾏处理 产⽣乱码原因: get⽅式提交的数据在请求⾏的url后⾯,在地址栏上其实就已经进⾏了⼀次URL的编码了。 解决⽅案 : 将存⼊到request缓冲区中的值以ISO-8859-1的⽅式获取到,以UTF-8的⽅式进⾏解码。 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /* get⽅式提交的数据在 请求⾏中 Tomcat8.5之后, Tomcat⾃动处理了get请求的中⽂乱码问题, 但在之前的Tomcat版本 中,get请求的中⽂乱码需要⾃⾏处理 ⽼版本Tomcat中⽂乱码的解决:将存⼊到request缓冲区中的值以ISO-8859-1的⽅式获取 到,以UTF-8的⽅式进⾏解码。 */ String user = request.getParameter("username"); //将存⼊到request缓冲区中的值以ISO-8859-1的⽅式获取到 byte[] bytes = user.getBytes("iso-8859-1"); //以UTF-8的⽅式进⾏解码 String value = new String(bytes, "utf-8"); System.out.println("user = " + user); }

Request域对象

Request 作为域对象的 API Request 作为域对象作⽤范围 Request 对象其实就是从客户端浏览器向服务器发送的⼀次请求信息的封装。那么实质上向 Request中所保存的数据有效期也是 ⼀次请求范围。 ⼀次请求范围:从客户端浏览器向服务器发送⼀次请求,服务器针对这次请求对浏览器作出响应。当服 务器作出响应之后,请求对象就销毁了,保存在其中的数据就⽆效了。   API ⽅法 返回值 描述 setAttribute(String name, Object obj) void Request 域中保存数据 getAttribute(String name) Object Request 域中获取数据 removeAttribute(String name) void Request 域中移除数据

代码演示:

servlet1

@WebServlet(urlPatterns = "/my1") public class MyServlet1 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //向request域对象中 存值 request.setAttribute("code","java"); //从request域对象中 取值 Object value = request.getAttribute("code"); System.out.println("MyServlet1 value = " + value); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } servlet2 @WebServlet(urlPatterns = "/my2") public class MyServlet2 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //从request域对象中 取值 Object value = request.getAttribute("code"); System.out.println("MyServlet2 value = " + value); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }

请求转发

请求转发的写法

通过ServletRequest对象获得RequestDispatcher对象

方法返回值描述 getRequestDispatcher(String path) RequestDispatcher 获得 RequestDispatcher 对象

再根据RequestDispatcher中的⽅法进⾏请求转发

⽅法 返回值 描述 forward(ServletRequest request, ServletResponse response) void 进⾏请求转发 转发的实现步骤 request对象⽅法获取转发器 RequestDispatcher getRequestDispatcher("转发地址")返回值就是转发器 使⽤转发器对象的⽅法 forward 代码实现 servlet1 @WebServlet(urlPatterns = "/my1") public class MyServlet1 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //向request域对象中 存值 request.setAttribute("code","java"); //从request域对象中 取值 Object value = request.getAttribute("code"); System.out.println("MyServlet1 value = " + value); //进⾏请求转发 request.getRequestDispatcher("/my2").forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } servlet2 @WebServlet(urlPatterns = "/my2") public class MyServlet2 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //从request域对象中 取值 Object value = request.getAttribute("code"); System.out.println("MyServlet2 value = " + value); //响应回浏览器 response.setContentType("text/html;charset=utf-8"); response.getWriter().print("我是MyServlet2 ⻚⾯数据"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }

请求转发和重定向区别

区别总结 请求转发是⼀次请求⼀次响应,⽽重定向是两次请求两次响应。 请求转发地址栏不会变化的,重定向地址栏发⽣变化。 请求转发路径不带⼯程名,重定向需要带⼯程名路径。 请求转发只能在本⽹站内部,重定向可以定向到任何⽹站。 代码演示 MyServlet1 @WebServlet(urlPatterns = "/my1") public class MyServlet1 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //向request域对象中 存值 request.setAttribute("code'","java"); //从request域对象中 取值 Object value = request.getAttribute("code"); System.out.println("MyServlet1 value = " + value); //进⾏请求转发 //request.getRequestDispatcher("/my2").forward(request, response); //进⾏重定向 response.sendRedirect("/my2"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }

MyServlet2

@WebServlet(urlPatterns = "/my2") public class MyServlet2 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //从request域对象中 取值 Object value = request.getAttribute("code"); System.out.println("MyServlet2 value = " + value); //响应回浏览器 response.setContentType("text/html;charset=utf-8"); response.getWriter().print("我是MyServlet2 ⻚⾯数据"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } 注意: 如果需要使⽤request进⾏值传递,需要通过请求转发完成。 如果⻚⾯需要跳转到其他⽹站上必须使⽤重定向, 不能使⽤request进⾏值传递。
最新回复(0)