什么是HttpRequest,他有什么用

每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到Request 对象中。然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过 HttpServletRequest 对象,获取到所有请求的信息。

HttpRequest常用API

i. getRequestURI() 获取请求的资源路径
ii. getRequestURL() 获取请求的统一资源定位符(绝对路径)
iii. getRemoteHost() 获取客户端的 ip 地址
iv. getHeader() 获取请求头
v. getParameter() 获取请求的参数
vi. getParameterValues() 获取请求的参数(多个值的时候使用)
vii. getMethod() 获取请求的方式 GET 或 POST
viii. setAttribute(key, value); 设置域数据
ix. getAttribute(key); 获取域数据
x. getRequestDispatcher() 获取请求转发对象

java代码:

  1. @Override
  2. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  3. System.out.println("URI:"+request.getRequestURI());
  4. System.out.println("URL:"+request.getRequestURL());
  5. System.out.println("客户端 ip 地址 => " + request.getRemoteHost());
  6. System.out.println( "请求的方式 ==>> " + request.getMethod() );
  7. System.out.println("请求头 User-Agent ==>> " + request.getHeader("User-Agent"));
  8. }

运行结果:
image.png

获取请求的参数

Servlet文件:

  1. import javax.servlet.*;
  2. import javax.servlet.http.*;
  3. import java.io.IOException;
  4. import java.util.Arrays;
  5. public class Servlet03 extends HttpServlet {
  6. @Override
  7. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  8. }
  9. @Override
  10. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  11. // 获取请求参数
  12. String username = request.getParameter("username");
  13. String password = request.getParameter("password");
  14. String[] hobby = request.getParameterValues("hobby");
  15. System.out.println("用户名:" + username);
  16. System.out.println("密码:" + password);
  17. System.out.println("兴趣爱好:" + Arrays.asList(hobby));
  18. }
  19. }

html文件:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <form action="http://localhost:8080/Servlet03" method="post">
  9. 用户名:<input type="text" name="username"><br/>
  10. 密码:<input type="password" name="password"><br/>
  11. 兴趣爱好:<input type="checkbox" name="hobby" value="cpp">C++
  12. <input type="checkbox" name="hobby" value="java">Java
  13. <input type="checkbox" name="hobby" value="js">JavaScript<br/>
  14. <input type="submit">
  15. </form>
  16. </body>
  17. </html>

运行过程:
image.png
运行结果:
image.png

中文乱码问题

doGet 请求的中文乱码解决:

  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");

doPOST 请求的中文乱码解决:

  1. @Override
  2. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {
  3. // 设置请求体的字符集为 UTF-8,从而解决 post 请求的中文乱码问题
  4. req.setCharacterEncoding("UTF-8");
  5. }