Request原理
- Servlet中哪个对象代表请求消息数据?
- Request对象.
- Servlet中哪个对象代表响应消息数据?
- Response对象.
- Tomcat接收到请求之后都做了什么事情?
- 根据请求的路劲先去找资源(Servlet) 如果有对应的Servlet的话(默认情况下)创建Serlvet对象.
- Tomcat会创建Request对象以及Response对象 -> 将请求的参数内容封装到Request对象中.
- 将Request对象和Response对象传入到service方法中并且调用service方法.
- 开发者根据逻辑使用Request对象并且将响应信息封装到Response对象中.
- Tomcat根据Response对象中的响应数据封装响应消息发送给浏览器.
Request继承体系
- request的体系是什么?
- ServletRequest(接口(实现Servlet接口的话,service方法中就传递是这个对象.))
- HttpServletRequest(接口)
- Tomcat提供了一个实现类对象 RequestFacade(实现了HttpServletRequest实现类)
Request获取请求行数据代码演示
-
Request对象都有哪些获取请求行数据的方法?
-
package com.itheima.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; @WebServlet("/r1") public class Request1Servlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { /*1.获取请求的方式*/ String method = req.getMethod(); System.out.println("请求的方式是:" + method); /*2.获取Servlet的路径*/ String servletPath = req.getServletPath(); System.out.println("Servlet的路径是:" + servletPath); /*3.获取虚拟路径(*) 如果虚拟路径为/的话,那么虚拟路径是没有的.*/ String contextPath = req.getContextPath(); System.out.println("虚拟路径是:" + contextPath); /*4.获取Get提交的请求参数*/ String queryString = req.getQueryString(); System.out.println("请求的参数是:" + queryString); /*5.获取请求的URI(*)*/ String requestURI = req.getRequestURI(); System.out.println("请求的URI是:" + requestURI); StringBuffer requestURL = req.getRequestURL(); System.out.println("请求的URL是:" + requestURL.toString()); /*6.获取协议以及版本信息*/ String protocol = req.getProtocol(); System.out.println("协议以及版本信息是:" + protocol); /*7.获取客户机地址*/ String remoteAddr = req.getRemoteAddr(); System.out.println("客户端的Ip地址是:" + remoteAddr); } }
Request获取请求头数据
- Request对象如何获取请求头数据?
- getHeader(String headerName) -> 传入的头的键的名称返回的键对应的值,如果没有对应的键,则返回null.
- getHeader(“USER-AGENT”); getHeader(“REFERER”);
- getHeaderNames() -> 返回一个Enumeration理解为一个迭代器,这个中封装了所有请求的键的值.
Request获取请求体数据
- Request对象如何获取请求体数据?
- 获取流对象 -> req.getReader(); 返回一个缓冲字符输入流用于读取请求体中的数据.
- 如果用户上传文件/图片 -> 我们需要使用到字节流来读取用户上传的数据.
Request获取请求参数通用方式演示
- Request有哪些获取参数的通用方式?
- getParameter(String name) -> String value
- 一般用于精准获取单个请求参数(key=value)
- getParameterValues(String name) -> String[] value
- 一般用于获取复选框(也可以用于获取单个元素[那么返回的数组中只有一个值])
- getParameterNames() -> Enumeration
- 获取所有的请求参数的键(只获取键 不获取值)
- getParameterMap() -> 返回Map<String,String[]> 一般和BeanUtils结合使用.
- 将请求参数中的键封装为Map的键,将键对应的值封装为Map的值(String[])
- getParameter(String name) -> String value
- 获取参数的通用方式有什么特点?
- 不管是GET提交还是POST提交,都可以使用通用参数的获取方式进行获取,所以说继承了HttpServlet之后,doGet中可以直接调用doPost方法(反之亦可),写一份代码就可以了.
Request获取请求参数中文乱码问题处理
-
如何会出现请求参数乱码的问题?
- 当在使用POST提交方式进行中文数据的提交的时候会出现解析为乱码的情况.
- TOMCAT8解决了GET提交乱码的问题.
-
如何解决请求参数乱码的问题?
-
将流的编码设置为与页面相同即可.
-
/*在获取参数之前,将流的编码设置为UTF-8解决POST提交中文乱码的问题*/ req.setCharacterEncoding("UTF-8");
-
Request请求转发
- 什么是转发?
- 转发是服务器内部资源跳转的一种方式(在很多的面试/笔试过程中,会使用转发和重定向进行对比.)
- 可以用于解耦.
- 转发是服务器内部资源跳转的一种方式(在很多的面试/笔试过程中,会使用转发和重定向进行对比.)
- 如何进行转发?
- 获取转发对象 -> request.getRequestDispatcher(String path[Servlet路径]);
- 执行转发 -> RequestDispatcher的对象forward(request,response);
- 转发的特点是什么?
- 转发的时候地址栏不会发生改变.
- 转发的时候只是发送了1次请求.
- 转发的时候只能转发到服务器内部,不可以转发到外部资源.
- 转发的速度很快(因为服务器内部转发)
Request共享数据(域对象)
- 什么是域对象?
- 一个有作用范围的可以存放共享数据的容器.
- 和域对象相关的有哪些方法?
- 存储数据 setAttribute(String name,Object o);
- 获取数据 getAttribute(String name) -> 返回的是一个Object对象 如果需要使用方法的话,需要强制类型转换.
- 删除数据 removeAttribute(String name); -> 没有返回值.
Request获取ServletContext
- 如何获取ServletContext对象?
- request.getServletContext();