每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的HTTP协议信息解析好封装到Request对象中,然后传递到service,doGet,doPost方法中。我们可以通过HttpServletRequest对象,获取到所有请求的信息。
getRequestURI(); 获取请求的资源路径 getRequestURL(); 获取请求的统一资源定位符(绝对路径) getRemoteHost(); 获取客户端的ip地址 getHeader(); 获取请求头 getParameter(); 获取请求的参数 getParameterValues(); 获取请求的参数(多个值的时候使用) getMethod(); 获取请求的方式 setAttribute(); 设置域数据 getAttribute(); 获取域数据 getRequestDispatcher(); 获取请求转发对象
- public class RequestAPIServlet extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- // getRequestURI(); 获取请求的资源路径
- System.out.println("URI => " + req.getRequestURI());
- // getRequestURL(); 获取请求的统一资源定位符(绝对路径)
- System.out.println("URL => " + req.getRequestURL());
- // getRemoteHost(); 获取客户端的ip地址
- System.out.println("客户端ip地址:" + req.getRemoteHost());
- /*在IDEA中,使用localhost访问时,得到的客户端ip地址为 127.0.0.1
- * 如果使用真实的ip地址如 http://192.168.184.1:8088/web04_servlet/request
- * 得到的客户端ip地址为真实ip地址*/
- // getHeader(); 获取请求头
- System.out.println("请求头User-Agent:"+req.getHeader("User-Agent"));
- /*Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36*/
- // getMethod(); 获取请求的方式
- System.out.println("请求的方式:" + req.getMethod());
- }
运行结果:
- URI => /web04_servlet/request
- URL => http://192.168.184.1:8088/web04_servlet/request
- 客户端ip地址:192.168.184.1
- 请求头User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36
获取请求参数:
- public class ParameterServlet extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- //获取请求参数
- String username = req.getParameter("username");
- String password = req.getParameter("password");
- String[] hobby = req.getParameterValues("hobby");
- System.out.println("用户名:" + username);
- System.out.println("密码:" + password);
- System.out.println("兴趣爱好:" + Arrays.asList(hobby));
- }
- }
运行结果:
- 用户名:12345
- 密码:wee
- 兴趣爱好:[cpp, java, js]
【post请求中文乱码问题】:
在doPost()方法中修改编码集, 注意要在获取请求参数之前调用才有效!
req.setCharacterEncoding("UTF-8");
请求转发是指服务器收到请求后,从一个资源跳转到另一个资源的操作叫请求转发。
- public class Servlet1 extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- //一个业务需要先在servlet1中执行 再去servlet2
- //查看参数
- String username = req.getParameter("username");
- System.out.println("在servlet1中查看参数:" + username);
-
- //使用域数据 给材料盖一个章 并传递到servlet2去查看
- req.setAttribute("key","Servlet1 over");
-
- //问路 servlet2的路
- /*请求转发 必须要以斜杠打头, 斜杠表示地址为http://ip:port/工程名, 映射到idea代码的web目录*/
- RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
-
- //走向 servlet2
- requestDispatcher.forward(req, resp);
- }
- }
- public class Servlet2 extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- //查看参数
- String username = req.getParameter("username");
- System.out.println("在servlet2中查看参数:" + username);
-
- //查看servlet1是否盖章over key一定要相同!
- Object key = req.getAttribute("key");
- System.out.println("servlet1是否结束:" + key);
-
- //处理自己的业务
- System.out.println("servlet2 处理了自己的业务");
- }
- }
【请求转发的特点】
1、浏览器地址栏没有变化
2、他们是一次请求
3、他们共享Request域中的数据
4、请求转发可以进入到WEB-INF目录下
5、不可以访问工程以外的资源,只能在自己的工程中跳转
base标签可以设置当前页面中所有相对路径工作时,参照哪个路径来进行跳转。否则会默认以当前浏览器地址栏中的地址为参考。
- html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Titletitle>
-
- <base href="http://localhost:8088/web04_servlet/a/b/">
- head>
- <body>
- 这是a下的b下的c.html页面<br/>
- <a href="../../index.html">跳回首页a><br/>
-
- body>
- html>
web中, / 斜杠是一种绝对路径
/ 斜杠如果被浏览器解析,得到的地址是 http://ip:port/
/ 斜杠如果被服务器解析,得到的地址是 http://ip:port/工程路径
如:
servletContext.getRealPath("/");
request.getRequestDispatcher("/");
特殊情况:response.sendRediect("/") 请求重定向,把斜杠发送给浏览器解析,得到 http://ip:port/