HttpServletRequest的介绍和方法以及代码实战

简介: HttpServletRequest的介绍和方法以及代码实战

HttpServletRequest

HttpServletRequest 介绍

1. HttpServletRequest 对象代表客户端的请求

2. 当客户端/浏览器通过 HTTP 协议访问服务器时,HTTP 请求头中的所有信息都封装在这个对象中

3. 通过这个对象的方法,可以获得客户端这些信息

4. HttpServletRequest 类图

HttpServletRequest 常用方法

1. getRequestURI() 获取请求的资源路径 http://localhost:8080/servlet/loginServlet

2. getRequestURL()获取请求的统一资源定位符(绝对路径

http://localhost:8080/servlet/loginServlet

3. getRemoteHost() 获取客户端的 主机, getRemoteAddr()

4. getHeader() 获取请求头

5. getParameter() 获取请求的参数

6. getParameterValues() 获取请求的参数(多个值的时候使用), 比如 checkbox, 返回的数组

7. getMethod() 获取请求的方式 GET 或 POST

8. setAttribute(key, value); 设置域数据

9. getAttribute(key); 获取域数据

10. getRequestDispatcher() 获取请求转发对象, 请求转发的核心对象

代码实战

1. 需求: 说明: 在一个表单提交数据给 Servlet , 然后在 Servlet 通过 HttpServletRequest对象获取相关数据应用实例

HTML部分

1. <!DOCTYPE html>
2. <html lang="en">
3. <head>
4. <meta charset="UTF-8">
5. <title>注册</title>
6. </head>
7. <body>
8. <h1>注册用户</h1>
9. <form action="http://localhost:8080/servlet/requestMethods"
10. method="post">
11.     u: <input type="text" name="username"/><br><br>
12.     p: <input type="password" name="pwd"/><br><br>
13.     选择你喜欢的老师:
14. <input type="checkbox" name="hobby" value="hsp">xx1
15. <input type="checkbox" name="hobby" value="lh">xx2
16. <input type="checkbox" name="hobby" value="spls">xx3<br/><br/>
17. <input type="submit" value="注册用户"/>
18. </form>
19. </body>
20. </html>

HttpServletRequest部分

1. public class HttpServletRequestMethods extends HttpServlet {
2. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
3. //这里我们使用request对象,获取表单提交的各种数据
4.         System.out.println("HttpServletRequestMethods doPost() 被调用..");
5. 
6. /***********************************
7.          *  获取和http请求头相关信息
8.          ***********************************/
9. 
10.         System.out.println("请求的资源路径URI= " + request.getRequestURI());
11. //http://主机/uri
12.         System.out.println("请求的统一资源定位符(绝对路径)URL= " + request.getRequestURL());
13.         System.out.println("请求的客户端ip 地址= " + request.getRemoteAddr());//本地就是127.0.01
14. 
15. // 获取http请求头的信息,可以指定其他,比如 User-Agent , Host等待 
16.         System.out.println("http请求头HOST= " + request.getHeader("Host"));
17. 
18. // 说明,如果我们希望得到请求的头的相关信息,可以使用request.getHeader("请求头字段")
19.         System.out.println("该请求的发起地址是= " + request.getHeader("Referer"));
20. 
21. // 请获取访问网站的浏览器是什么?
22. String userAgent = request.getHeader("User-Agent");
23.         System.out.println("User-Agent= " + userAgent);
24. // 取出FireFox, 取出最后
25.         String[] s = userAgent.split(" ");
26.         System.out.println("浏览器=" + s[s.length - 1].split("\\/")[0]);
27. 
28. //获取 Cookie
29. //  JSESSIONID=8CBBD23BDE01BAE6705E03C5C8916BD1
30. 
31. String cookie = request.getHeader("Cookie");
32. String JSESSIONID = cookie.split("=")[1];
33.         System.out.println("取出JSESSIONID= " + JSESSIONID);
34. 
35. 
36. // 主要是Get / Post
37. 
38.         System.out.println("http请求方式~= " + request.getMethod());
39. 
40. /***********************************
41.          *  获取和请求参数相关信息, 注意要求在返回数据前,获取参数
42.          ***********************************/
43. 
44. //解决接收参数的中文乱码问题, 提示,写在 getParameter前.
45.         request.setCharacterEncoding("utf-8");
46. //1. 获取表单的数据[单个数据]
47. //username=tom&pwd=&hobby=hsp&hobby=spls
48. String username = request.getParameter("username");
49. String pwd = request.getParameter("pwd");
50. 
51. 
52. //2. 获取表单一组数据
53.         String[] hobbies = request.getParameterValues("hobby");
54.         System.out.println("username= " + username);
55.         System.out.println("pwd= " + pwd);
56. //增强for循环的快捷键 iter->回车即可 , 能使用快捷键,就使用快捷键
57. for (String hobby : hobbies) {
58.             System.out.println("hobby=" + hobby);
59.         }
60. 
61. //推而广之, 如果是 单选 , 下拉框 等等
62. 
63. //返回接收到的信息, 给浏览器回显
64. //本质就是在http响应头,加上 Content-Type: text/html;charset=utf-8
65. //说 text/html 表示返回的数据类型,浏览器会根据这个类型来解析数据
66. // text/plain 表示返回的数据,请浏览器使用文本方式解析
67. // application/x-tar 表示返回的是文件,浏览器就会以下载文件的方式处理
68. 
69.         response.setContentType("text/html;charset=utf-8");
70. PrintWriter writer = response.getWriter();
71.         writer.print("<h1>提交的用户名= " + username + "</h1>");
72.         writer.flush();
73.         writer.close();
74. 
75.     }
76. 
77. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
78.         doPost(request, response);
79.     }
80. }

web.xml配置

1. <servlet>
2. <servlet-name>HttpServletRequestMethods</servlet-name>
3. <servlet-class>com.servlet.request.HttpServletRequestMethods</servlet-class>
4. </servlet>
5. 
6. <servlet-mapping>
7. <servlet-name>HttpServletRequestMethods</servlet-name>
8. <url-pattern>/requestMethods</url-pattern>
9. </servlet-mapping>

请求转发

为什么需要请求转发

  1. 目前我们学习的都是一次请求,对应一个 Servlet, 如图

2. 但是在实际开发中,往往业务比较复杂,需要在一次请求中,使用到多个 Servlet 完成

一个任务(Servlet 链, 流水作业) 如图

请求转发说明

1. 实现请求转发:请求转发指一个 web 资源收到客户端请求后,通知服务器去调用另外一个 web 资源进行处理

2. HttpServletRequest 对象(也叫 Request 对象)提供了一个 getRequestDispatcher 方法,该方法返回一个 RequestDispatcher 对象,调用这个对象的 forward 方法可以实现请求转发

3. request 对象同时也是一个域对象,开发人员通过 request 对象在实现转发时,把数据通过 request 对象带给其它 web 资源处理

  1. setAttribute方法
  2. getAttribute方法
  3. removeAttribute方法
  4. getAttributeNames方法

请求转发原理示意图

代码实战

HTML部分

1. <!DOCTYPE html>
2. <html lang="en">
3. <head>
4. <meta charset="UTF-8">
5. <title>登录</title>
6. </head>
7. <body>
8. <form action="http://localhost:8080/servlet/computerServlet" method="post">
9.     u: <input type="text" name="username"><br>
10. <input type="submit" value="登录">
11. </form>
12. </body>
13. </html>

CheckServlet部分

1. public class CheckServlet extends HttpServlet {
2. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
3.         System.out.println("CheckServlet 被调用..");
4. 
5. //根据用户名来确定该用户是什么身份
6. String username = request.getParameter("username");
7. //注意:如果是同一个request对象(请求转发),那么可以在不同的servlet中,是getParameter
8. if ("tom".equals(username)) {
9. //分配
10.             request.setAttribute("role", "管理员");
11.         } else {
12.             request.setAttribute("role", "普通用户");
13.         }
14. 
15. //获取分发器
16. //解读  1. /manageServlet写的是 要转发的servlet的url
17. //        2. / 会被解析成 /servlet
18. //        3. forward(request, response) 表示把当前servlet的request对象和response对象,传递给下一个servlet使用
19. 
20. RequestDispatcher requestDispatcher =
21.                 request.getRequestDispatcher("/manageServlet");
22. 
23.         requestDispatcher.forward(request, response);
24. 
25. 
26.     }
27. 
28. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
29.         doPost(request, response);
30.     }
31. }

ManageServlet 部分

1. public class ManageServlet extends HttpServlet {
2. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
3.         System.out.println("ManageServlet 被调用..");
4. 
5. String username = request.getParameter("username");
6. String role = (String) request.getAttribute("role");
7. 
8. //输出信息
9.         response.setContentType("text/html;charset=utf-8");
10. PrintWriter writer = response.getWriter();
11.         writer.print("用户名: " + username + "<br/>");
12.         writer.print("角色 : " + role);
13.         writer.flush();
14.         writer.close();
15.     }
16. 
17. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
18.         doPost(request, response);
19.     }
20. }

xml部分

1. <servlet>
2. <servlet-name>CheckServlet</servlet-name>
3. <servlet-class>com.servlet.request.CheckServlet</servlet-class>
4. </servlet>
5. <servlet-mapping>
6. <servlet-name>CheckServlet</servlet-name>
7. <url-pattern>/checkServlet</url-pattern>
8. </servlet-mapping>
9. <servlet>
10. <servlet-name>ManageServlet</servlet-name>
11. <servlet-class>com.servlet.request.ManageServlet</servlet-class>
12. </servlet>
13. 
14. <servlet-mapping>
15. <servlet-name>ManageServlet</servlet-name>
16. <url-pattern>/manageServlet</url-pattern>
17. </servlet-mapping>

请求转发注意事项和细节

1. 浏览器地址不会变化(地址会保留在第 1 个 servlet 的 url)

2. 在同一次 HTTP 请求中,进行多次转发,仍然是一次 HTTP 请求

3. 在同一次 HTTP 请求中,进行多次转发,多个 Servlet 可以共享 request 域/对象的数据(因为始终是同一个 request 对象)

4. 可以转发到 WEB-INF 目录下(后面做项目使用)

5. 不能访问当前 WEB 工程外的资

6. 因为浏览器地址栏会停止在第一个 servlet ,如果你刷新页面,会再次发出请求(并且会 带数据), 所以在支付页面情况下,不要使用请求转发,否则会造成重复支付


目录
相关文章
|
6月前
HttpServletRequest类
HttpServletRequest类
42 0
|
6月前
|
Web App开发 XML Java
Servlet执行流程&生命周期&方法介绍&体系结构、Request和Response的功能详解(1)
Servlet执行流程&生命周期&方法介绍&体系结构、Request和Response的功能详解
111 2
|
6月前
|
存储 Java 应用服务中间件
Servlet执行流程&生命周期&方法介绍&体系结构、Request和Response的功能详解(2)
Servlet执行流程&生命周期&方法介绍&体系结构、Request和Response的功能详解
67 2
|
算法 应用服务中间件
Tomcat源码分析之 doGet方法(一)
Tomcat源码分析之 doGet方法(一)
103 0
|
设计模式 应用服务中间件 容器
Tomcat源码分析之 doGet方法(三)
Tomcat源码分析之 doGet方法(三)
60 0
|
算法 安全 应用服务中间件
Tomcat源码分析之 doGet方法(四)
Tomcat源码分析之 doGet方法(四)
49 0
|
应用服务中间件 索引
Tomcat源码分析之 doGet方法(二)
Tomcat源码分析之 doGet方法(二)
81 0
|
Java 应用服务中间件 容器
2022年Servlect课时六——:案例 servlet的常用对象
2022年Servlect课时六——:案例 servlet的常用对象
108 0
2022年Servlect课时六——:案例 servlet的常用对象
|
应用服务中间件
HttpServletRequest 类
HttpServletRequest 类
HttpServletRequest 类
Servlet—HttpServletRequest与HttpServletResponse对象常用方法
Servlet—HttpServletRequest与HttpServletResponse对象常用方法
Servlet—HttpServletRequest与HttpServletResponse对象常用方法