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>
请求转发
为什么需要请求转发
- 目前我们学习的都是一次请求,对应一个 Servlet, 如图
2. 但是在实际开发中,往往业务比较复杂,需要在一次请求中,使用到多个 Servlet 完成
一个任务(Servlet 链, 流水作业) 如图
请求转发说明
1. 实现请求转发:请求转发指一个 web 资源收到客户端请求后,通知服务器去调用另外一个 web 资源进行处理
2. HttpServletRequest 对象(也叫 Request 对象)提供了一个 getRequestDispatcher 方法,该方法返回一个 RequestDispatcher 对象,调用这个对象的 forward 方法可以实现请求转发
3. request 对象同时也是一个域对象,开发人员通过 request 对象在实现转发时,把数据通过 request 对象带给其它 web 资源处理
- setAttribute方法
- getAttribute方法
- removeAttribute方法
- 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 ,如果你刷新页面,会再次发出请求(并且会 带数据), 所以在支付页面情况下,不要使用请求转发,否则会造成重复支付