• Servlet | HttpServletRequest接口、通过request接口获取请求参数


    目录

    一:HttpServletRequest接口

    二:通过request接口获取请求参数


    一:HttpServletRequest接口

    (1)HttpServletRequest是一个接口,全限定名称:javax.servlet.http.HttpServletRequest

             HttpServletRequest接口是Servlet规范中的一员。

    (2)HttpServletRequest接口的父接口:ServletRequest

    public interface HttpServletRequest extends ServletRequest {}

    (3)HttpServletRequest接口的实现类谁写的? HttpServletRequest对象是谁给创建的?

             ①org.apache.catalina.connector.RequestFacade 实现了 HttpServletRequest接口

             ②Tomcat服务器(WEB服务器、WEB容器)创建了HttpServletRequest接口,只需要面向接口编程,关心HttpServletRequest接口中有哪些方法,这些方法可以完成什么功能

    public class RequestFacade implements HttpServletRequest {}

    (4)HttpServletRequest对象中都有什么信息?都包装了什么信息?

            ①HttpServletRequest对象是Tomcat服务器负责创建的,这个对象中封装了HTTP的请求协议。

            ②用户发送请求的时候,遵循了HTTP协议,发送的是HTTP的请求协议,Tomcat服务器将HTTP协议中的信息以及数据全部解析出来,然后Tomcat服务器把这些信息封装到HttpServletRequest对象当中,传给javaweb程序员。

            ③javaweb程序员面向HttpServletRequest接口编程,调用方法就可获取到请求的信息。

     (5)request和response对象的生命周期?

            request对象和response对象,一个是请求对象,一个是响应对象;这两个对象只在当前请求中有效;一次请求对应一个request。

    二:通过request接口获取请求参数

    怎么获取前端浏览器用户提交的数据(和获取用户提交的数据有关系的四个方法)?通过HttpServletRequest requst接口:

    Map   getParameterMap()            获取Map
    Enumeration   getParameterNames()       获取Map集合中所有的key
    String[] getParameterValues(String name)             根据key获取Map集合的value(一般遇到复选框才会使用)
    String getParameter(String name)      获取value一维数组当中的第一个元素,实际上大部分数组里就一个元素(常用方法)

    (1)在学习这四个方法之前我们先思考一下:如果是自己,前端的form表单提交了数据之后,准备采用什么样的数据结构去存储这些数据呢?不妨写一个简单的例子测试一下:

    ①RequestTestServlet类继承HttpServlet,重写doPost方法

    1. package com.bjpowernode.javaweb;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.http.HttpServlet;
    4. import javax.servlet.http.HttpServletRequest;
    5. import javax.servlet.http.HttpServletResponse;
    6. import java.io.IOException;
    7. import java.io.PrintWriter;
    8. public class RequestTestServlet extends HttpServlet {
    9. @Override
    10. protected void doPost(HttpServletRequest requst, HttpServletResponse response) throws ServletException, IOException {
    11. // 先啥都不做,先把程序跑起来
    12. }
    13. }

    ②在web.xml中进行注册

    1. "1.0" encoding="UTF-8"?>
    2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    5. version="4.0">
    6. <servlet>
    7. <servlet-name>requestTestservlet-name>
    8. <servlet-class>com.bjpowernode.javaweb.RequestTestServletservlet-class>
    9. servlet>
    10. <servlet-mapping>
    11. <servlet-name>requestTestservlet-name>
    12. <url-pattern>/testRequesturl-pattern>
    13. servlet-mapping>
    14. web-app>

    ③创建一个register.html,编写表单的注册

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>user registertitle>
    6. head>
    7. <body>
    8. <h1>user registerh1>
    9. <form action="/servlet08/testRequest" method="post">
    10. username:<input type="text" name="username"><br>
    11. password:<input type="password" name="userpwd"><br>
    12. interest:
    13. smoke<input type="checkbox" name="aihao" value="s">
    14. drink<input type="checkbox" name="aihao" value="d">
    15. tangtou<input type="checkbox" name="aihao" value="tt">
    16. <br>
    17. <input type="submit" value="register">
    18. form>
    19. body>
    20. html>

    ④启动Tomcat服务器,进行数据的提交,前端提交的数据格式为:

    1. username=root&userpwd=123&aihao=s&aihao=d&aihao=tt
    2. key&value&key&value&key&value 的形式

    ⑤根据提交数据的格式很容易想到使用Map集合来存储,对于存储的类型如果key存储String
        、value存储String;会发现一个致命的问题:对于复选框的内容,key重复的时候value覆盖;所以最终选择key存储String、value存储String[]

    1. Map
    2. key value
    3. -------------------------------
    4. username {"abc"}
    5. userpwd {"111"}
    6. aihao {"s","d","tt"}

    (2)注意:前端表单提交数据的时候,假设提交了120这样的 “数字”,其实是以字符串 "120" 的方式提交的,所以服务器端获取到的一定是一个字符串的"120",而不是一个数字。(前端永远提交的是字符串,后端获取的也永远是字符串

    (3)四个方法详解

    ①Map   getParameterMap()  获取整个Map集合

    (1)调用getParameterMap()方法拿到整个集合,里面存储的都是name和value。

    (2)拿到这个集合后调用keySet()方法,获取所有的key,返回的是一个set集合;然后使用迭代器进行遍历;然后在调用get(key)方法,获取所以有的value。

    (3)获取的value实际上是一个String[]数组,需要再次进行遍历打印。

    1. package com.bjpowernode.javaweb;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.http.HttpServlet;
    4. import javax.servlet.http.HttpServletRequest;
    5. import javax.servlet.http.HttpServletResponse;
    6. import java.io.IOException;
    7. import java.io.PrintWriter;
    8. import java.util.Enumeration;
    9. import java.util.Iterator;
    10. import java.util.Map;
    11. import java.util.Set;
    12. public class RequestTestServlet extends HttpServlet {
    13. @Override
    14. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    15. response.setContentType("text/html;charset=utf-8");
    16. PrintWriter out = response.getWriter();
    17. // 调用getParameterMap()  获取整个Map集合
    18. Map parameterMap = request.getParameterMap();
    19. // 遍历Map集合(获取Map集合中所有的key)
    20. Set keys = parameterMap.keySet();
    21. // 通过迭代器进行遍历
    22. Iterator it = keys.iterator();
    23. while(it.hasNext()){
    24. // 拿到每一个key
    25. String key = it.next();
    26. // System.out.println(key);
    27. // 通过key获取value
    28. String[] values = parameterMap.get(key);
    29. // System.out.println(key+"="+values);
    30. /*
    31. username=[Ljava.lang.String;@6cc12425
    32. userpwd=[Ljava.lang.String;@6206c7cd
    33. aihao=[Ljava.lang.String;@66394f55
    34. // 从输出格式可以看出:value是一个数组
    35. */
    36. System.out.print(key+"=");
    37. // 对数组values进一步遍历
    38. for (String value :values){
    39. System.out.print(value+",");
    40. }
    41. System.out.println();
    42. /*username=root,
    43. userpwd=123,
    44. aihao=s,d,tt,
    45. */
    46. }
    47. }
    48. }


    ②Enumeration   getParameterNames()       获取Map集合中所有的key

    (1)调用getParameterNames() 获取所有的key,返回的是一个Enumeration集合

    1. package com.bjpowernode.javaweb;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.http.HttpServlet;
    4. import javax.servlet.http.HttpServletRequest;
    5. import javax.servlet.http.HttpServletResponse;
    6. import java.io.IOException;
    7. import java.io.PrintWriter;
    8. import java.util.Enumeration;
    9. import java.util.Iterator;
    10. import java.util.Map;
    11. import java.util.Set;
    12. public class RequestTestServlet extends HttpServlet {
    13. @Override
    14. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    15. response.setContentType("text/html;charset=utf-8");
    16. PrintWriter out = response.getWriter();
    17. Enumeration keys = request.getParameterNames();
    18. while(keys.hasMoreElements()){
    19. // 拿到每一个key
    20. String key = keys.nextElement();
    21. System.out.println(key);
    22. }
    23. /*
    24. username
    25. userpwd
    26. aihao
    27. */
    28. }
    29. }


    ③String[] getParameterValues(String name)  根据key获取Map集合的value(一般遇到复选框才会使用)

    (1)调用getParameterValues(String name)方法获取到values;得到的values一般是一个String数组进行存储,所以这个方法主要用于复选框才使用

    单独使用,拿到三个一维数组,进行遍历

    1. String[] usernames = request.getParameterValues("username");
    2. String[] userpwds = request.getParameterValues("userpwd");
    3. String[] interests = request.getParameterValues("interest");
    4. // 遍历一维数组
    5. for(String username : usernames){
    6. System.out.println(username);
    7. }
    8. for(String userpwd : userpwds){
    9. System.out.println(userpwd);
    10. }
    11. for(String interest : interests){
    12. System.out.println(interest);
    13. }

    方法联合使用,getParameterNames()负责获取key,getParameterValues负责获取value

    1. package com.bjpowernode.javaweb;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.http.HttpServlet;
    4. import javax.servlet.http.HttpServletRequest;
    5. import javax.servlet.http.HttpServletResponse;
    6. import java.io.IOException;
    7. import java.io.PrintWriter;
    8. import java.util.Enumeration;
    9. import java.util.Iterator;
    10. import java.util.Map;
    11. import java.util.Set;
    12. public class RequestTestServlet extends HttpServlet {
    13. @Override
    14. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    15. response.setContentType("text/html;charset=utf-8");
    16. PrintWriter out = response.getWriter();
    17. Enumeration keys = request.getParameterNames();
    18. while(keys.hasMoreElements()){
    19. // 拿到每一个key
    20. String key = keys.nextElement();
    21. System.out.print(key+"=");
    22. // 通过getParameterValues(key)拿到所有的value这个一维数组
    23. String[] values = request.getParameterValues(key);
    24. // 遍历这个一维数组
    25. for (String value :values){
    26. System.out.print(value+",");
    27. }
    28. System.out.println();
    29. }
    30. /*
    31. sername=root,
    32. userpwd=123,
    33. aihao=s,d,tt,
    34. */
    35. }
    36. }


    ④String getParameter(String name)   获取value一维数组当中的第一个元素,实际上大部分数组里就一个元素(常用方法)

    (1)对于复选框value有多个,getParameterValues(String name)方法,获得一个String数组;而getParameter()方法只能取第一个元素,返回的是String类型的数据。

    1. package com.bjpowernode.javaweb;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.http.HttpServlet;
    4. import javax.servlet.http.HttpServletRequest;
    5. import javax.servlet.http.HttpServletResponse;
    6. import java.io.IOException;
    7. import java.io.PrintWriter;
    8. import java.util.Enumeration;
    9. import java.util.Iterator;
    10. import java.util.Map;
    11. import java.util.Set;
    12. @Override
    13. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    14. response.setContentType("text/html;charset=utf-8");
    15. PrintWriter out = response.getWriter();
    16. // 直接通过name获取value这个一维数组的第一个元素
    17. // 这个方法使用最多,因为这个一维数组中一般只有一个元素。
    18. Enumeration keys = request.getParameterNames();
    19. while(keys.hasMoreElements()){
    20. // 拿到每一个key
    21. String key = keys.nextElement();
    22. // System.out.print(key+"=");
    23. // 通过key直接取出value第一个元素
    24. String value = request.getParameter(key);
    25. System.out.println(key+"="+value);
    26. }
    27. /*
    28. username=root
    29. userpwd=123
    30. aihao=s 只能取出第一个元素
    31. */
    32. }
    33. }

    所以对于复选框的value还是调用getParameterValues()方法,

    对于单选框的就调用getParameter()方法

    1. package com.bjpowernode.javaweb;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.http.HttpServlet;
    4. import javax.servlet.http.HttpServletRequest;
    5. import javax.servlet.http.HttpServletResponse;
    6. import java.io.IOException;
    7. import java.io.PrintWriter;
    8. import java.util.Enumeration;
    9. import java.util.Iterator;
    10. import java.util.Map;
    11. import java.util.Set;
    12. @Override
    13. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    14. response.setContentType("text/html;charset=utf-8");
    15. PrintWriter out = response.getWriter();
    16. // 对于单选框直接调用getParameter(String key)获取value
    17. String username = request.getParameter("username");
    18. String userpwd = request.getParameter("userpwd");
    19. System.out.println(username);
    20. System.out.println(userpwd);
    21. // 对于复选框,调用getParameterValues()方法
    22. String[] aihaos = request.getParameterValues("aihao");
    23. for (String aihao:aihaos){
    24. System.out.print(aihao+",");
    25. }
    26. System.out.println();
    27. /*
    28. root
    29. 123
    30. s,d,tt,
    31. */
    32. }
    33. }
  • 相关阅读:
    CameraServiceProxy启动-Android12
    Vue3.3 的新功能的一些体验
    校园食堂明厨亮灶智能视频监控
    Linux 中的make/makefile
    前端学习网站
    使用信号记录保存信号数据
    Docker容器搭建Hadoop集群(hadoop-3.1.3)
    LeetCode --- 1275. Find Winner on a Tic Tac Toe Game 解题报告
    【ubuntu安装halcon】
    面试突击72:输入URL之后会执行什么流程?
  • 原文地址:https://blog.csdn.net/m0_61933976/article/details/127735723