7.5HttpServletRequest类
7.5.1HttpServletRequest 类有什么作用
每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过 HttpServletRequest 对象,获取到所有请求的信息。
7.5.2HttpServletRequest 类的常用方法
1、getRequestURI() 获取请求的资源路径;
2、getRequestURL() 获取请求的统一资源定位符(绝对路径);
3、getRemoteHost() 获取客户端的 ip 地址;
4、getHeader() 获取请求头;
5、getParameter() 获取请求的参数;
6、getParameterValues() 获取请求的参数(多个值的时候使用);
7、getMethod() 获取请求的方式 GET 或 POST;
8、setAttribute(key, value) 设置域数据;
9、getAttribute(key) 获取域数据;
10、getRequestDispatcher() 获取请求转发对象。
1. public class RequestAPIServlet extends HttpServlet {
2. @Override
3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
4. IOException {
5. // i.getRequestURI() 获取请求的资源路径
6. System.out.println("URI => " + req.getRequestURI());
7. // ii.getRequestURL() 获取请求的统一资源定位符(绝对路径)
8. System.out.println("URL => " + req.getRequestURL());
9. // iii.getRemoteHost() 获取客户端的 ip 地址
10. /**
11. * 在 IDEA 中,使用 localhost 访问时,得到的客户端 ip 地址是 ===>>> 127.0.0.1<br/>
12. * 在 IDEA 中,使用 127.0.0.1 访问时,得到的客户端 ip 地址是 ===>>> 127.0.0.1<br/>
13. * 在 IDEA 中,使用 真实 ip 访问时,得到的客户端 ip 地址是 ===>>> 真实的客户端 ip 地址<br/>
14. */
15. System.out.println("客户端 ip 地址 => " + req.getRemoteHost());
16. // iv.getHeader() 获取请求头
17. System.out.println("请求头 User-Agent ==>> " + req.getHeader("User-Agent"));
18. // vii.getMethod() 获取请求的方式 GET 或 POST
19. System.out.println( "请求的方式 ==>> " + req.getMethod() );
20. } 21. }
7.5.3获取请求参数
表单代码:
1. <body>
2. <form action="http://localhost:8080/07_servlet/parameterServlet" method="get">
3. 用户名:<input type="text" name="username"><br/>
4. 密码:<input type="password" name="password"><br/>
5. 兴趣爱好:<input type="checkbox" name="hobby" value="cpp">C++
6. <input type="checkbox" name="hobby" value="java">Java
7. <input type="checkbox" name="hobby" value="js">JavaScript<br/>
8. <input type="submit">
9. </form>
10. </body>
获取请求参数代码
1. public class ParameterServlet extends HttpServlet {
2. @Override
3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
4. IOException {
5. // 获取请求参数
6. String username = req.getParameter("username");
7. String password = req.getParameter("password");
8. String[] hobby = req.getParameterValues("hobby");
9. System.out.println("用户名:" + username);
10. System.out.println("密码:" + password);
11. System.out.println("兴趣爱好:" + Arrays.asList(hobby));
12. } 13. }
7.5.4get请求的中文乱码问题解决
1. // 获取请求参数
2. String username = req.getParameter("username");
3. //1 先以 iso8859-1 进行编码
4. //2 再以 utf-8 进行解码
5. username = new String(username.getBytes("iso-8859-1"), "UTF-8")
7.5.5post请求的中文乱码问题解决
1. @Override
2. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
3. IOException {
4. // 设置请求体的字符集为 UTF-8,从而解决 post 请求的中文乱码问题
5. req.setCharacterEncoding("UTF-8");
6. System.out.println("-------------doPost------------");
7. // 获取请求参数
8. String username = req.getParameter("username");
9. String password = req.getParameter("password");
10. String[] hobby = req.getParameterValues("hobby");
11. System.out.println("用户名:" + username);
12. System.out.println("密码:" + password);
13. System.out.println("兴趣爱好:" + Arrays.asList(hobby)); 14. }
7.5.6请求的转发
请求转发是指,服务器收到请求后,从一次资源跳转到另一个资源的操作叫请求转发。
Servlet1中的代码:
1. public class Servlet1 extends HttpServlet {
2. @Override
3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
4. IOException {
5. // 获取请求的参数(办事的材料)查看
6. String username = req.getParameter("username");
7. System.out.println("在 Servlet1(柜台 1)中查看参数(材料):" + username);
8. // 给材料 盖一个章,并传递到 Servlet2(柜台 2)去查看
9. req.setAttribute("key1","柜台 1 的章");
10. // 问路:Servlet2(柜台 2)怎么走
11. /**
12. * 请求转发必须要以斜杠打头,/ 斜杠表示地址为:http://ip:port/工程名/ , 映射到 IDEA 代码的 web 目录
13. <br/>
14. *
15. */
16. RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
17. // RequestDispatcher requestDispatcher = req.getRequestDispatcher("http://www.baidu.com");
18. // 走向 Sevlet2(柜台 2)
19. requestDispatcher.forward(req,resp);
20. } 21. }
Servlet2中的代码:
1. public class Servlet2 extends HttpServlet {
2. @Override
3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
4. IOException {
5. // 获取请求的参数(办事的材料)查看
6. String username = req.getParameter("username");
7. System.out.println("在 Servlet2(柜台 2)中查看参数(材料):" + username);
8. // 查看 柜台 1 是否有盖章
9. Object key1 = req.getAttribute("key1");
10. System.out.println("柜台 1 是否有章:" + key1);
11. // 处理自己的业务
12. System.out.println("Servlet2 处理自己的业务 ");
13. } 14. }
7.5.7base标签
1. <!DOCTYPE html>
2. <html lang="zh_CN">
3. <head>
4. <meta charset="UTF-8">
5. <title>Title</title>
6. <!--base 标签设置页面相对路径工作时参照的地址
7. href 属性就是参数的地址值
8. -->
9. <base href="http://localhost:8080/07_servlet/a/b/">
10. </head>
11. <body>
12. 这是 a 下的 b 下的 c.html 页面<br/>
13. <a href="../../index.html">跳回首页</a><br/>
14. </body>
15. </html>
7.5.8Web中的绝对路径和相对路径
绝对路径:http://ip:port/工程路径/资源路径
相对路径:
1、. 表示当前目录;
2、… 表示上一级目录;
3、资源名 表示当前目录下的资源。
注意:在实际开发中,路径都使用绝对路径,而不简单的使用相对路径,或者是使用base+相对路径。
7.5.9Web中/(斜杠)的不同含义
在Web中,/(斜杠)是一种绝对路径。
/(斜杠)如果被浏览器解析,得到的地址是:http://ip:port/;
/(斜杠)如果被服务器解析,得到的地址是:http://ip:port/工程路径;