• Request通用方式获取请求参数 [JavaWeb][Servlet]


    Request通用方式获取请求参数

    前面我们讲Request获取请求参数时如果是GET方式我们是通过getQueryString()方法获取, 如果是POST方式我们是通过getReader()方法,而我们对于继承HttpServlet抽象类的时候其实很多的GET和POST请求之下的操作都是通用的, 所以往往我们继承HttpServlet抽象类实现的Servlet类在实现的doGet()方法和doPost()方法中绝大多数代码都是相同的, 而不同的只是对于获取请求参数的方法不同 —> 使用了不同的方法获取post请求和get请求的请求参数

    • 所以这样就导致了我们实现的doGet()方法和doPost()方法中代码重复过多, 所以我们就编写了了一种通用的获取get和post请求方式的请求参数的方法, 那么我们对应get和post方式的请求的相关逻辑处理就直接调用这个通用的方法即可, 就可以达到我们的doGet()方法中要做的事和doPost()方法中要做的逻辑处理是完全一样的, 这样我们就可以直接在doPost()方法中调用已经编写好的doGet()方法即可

    那么Request是如何通用的获取请求参数的?

    Request调用的获取请求参数的通用方式中其实底层也是先判断请求方式是GET还是POST, 如果是GET请求方式, 那么我们就调用getQueryString()方法,以字符串的方式获取到了请求参数, 如果是POST请求方式, 那么调用getReader()方法( 如果请求参数中有图片等非文本内容,那么我们就要调用getInputStream()方法 ),获取到对应的字符缓冲流, 然后调用BufferedReader类中的readLine()方法,以字符串的形式获取请求参数

    • 然后以字符串的方式获取到请求参数之后,我们就拿到了一个完整的字符串,这个字符串的内容就是我们的请求参数( eg: username=zhangsan&hobby=1&hobby=2 )

      • 然后我们以&为分隔符先将字符串分割,分割为一个个的请求参数名=请求参数值的键值对形式,然后我们再通过=为分隔符对每个字符串再进行一个分割,分割了之后我们将分割后的两个值以键值对的形式存储到了一个Map集合中去, 但是我们的Map的键时不可重复的,所以如果有多个键值对的键相同但是值不同的时候, 这个时候我们向这个Map集合中通过put()方法添加这个键重复的数据的时候,那么实际上是执行了一个修改的操作,例如上面的hobby有两个值: 1和2, 最终Map中hobby只会有一个值,不满足我们的要求

        • 那么我们如何避免这样的问题的出现?(也就是如何将键重复的数据的值不修改,而是也保存下来?)

          • 我们将Map集合的值设置为一个字符串数组类型的, 这个时候当我们添加的键相同的时候我们执行的操作是将对应的值存储到重复值对应的字符串数组中

            • 所以也就是我们的存储请求数据的Map集合的泛型为Map<String,String[]>

            • 最终存储下来就要是如下图的效果( 以username=zhangsan&hobby=1&hobby=2作为请求参数为例 )

              [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VYokceGI-1655913409612)(E:\非凡英才\JavaWeb开发\Servlet\图解\Map存储请求参数.png)]

    用伪代码演示Request通用方式获取请求参数的实现

    //获取请求方式
    String method = this.getMethod();
    
    //判断
    if("GET".equals(method)){
        //GET方式获取请求参数
        params = this.getQueryString();
    }else if("POST".equeals(method)){
        //POST方式获取请求参数
        BufferedReader reader = this.getReader();
        params = reader.readLine();
    }
    //后续的对获取到的字符串形式的请求参数的分割解析操作
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    Request通用方式获取请求参数的方法:

    1. Map<String,String[]> getParameterMap()

      • 获取所有参数构成的Map<String,String[]>集合
    2. String [] getParameterValues(String name)

      • 根据名称获取参数值构成的String类型的数组
        • 如果一次请求中有多个请求参数的键是相同的时候, 这个时候我们不能确定一共有多少个对应键的请求参数, 那么我们就要使用getParameterValues(String name)方法来获取, 就可以获取到一次请求中的所有的请求参数中键为对应name值的值
          • 比如我们如果是提交复选框数据的时候, 这个时候表单中多选框的name属性值肯定是相同的, 所以提交数据的时候的键就是相同的, 那么这个时候如果我们使用getParameter(String name)方法获取的时候一次只能获取一个为指定键的请求参数值, 并且由于我们是不能确定一共是有多少个重复的键的, 所以使用这个getParameter(String name)方法我们就不能通用的方式获取到所有的键名为name的请求参数值, 这个时候我们就要通过getParameterValues()方法, 使用这个方法就能以String []的形式获取到同名的所有的请求参数值
    3. String getParameter(String name)

      • 根据名称获取参数值(单个值)
      • 调用此方法获取参数指的时候要确保这个指定请求参数名的请求参数值只有一个
  • 相关阅读:
    数组对象去重
    阿里云机器学习PAI开源中文NLP算法框架EasyNLP,助力NLP大模型落地
    代码随想录算法训练营第二十五天|216.组合总和III,17. 电话号码的字母组合
    测试人生 | 从小团队的业务到独角兽的测开,涨薪超过60%,90后小哥哥凤凰涅槃了
    【机器学习知识点】【1】二维与三维空间梯度下降微分求解及可视化展示
    第三周 青海之行——练练构图,培养你的摄影眼
    Design Experience
    开发一个npm包
    中文标题相似度检测
    Node学习十四 —— 使用node创建HTTP请求
  • 原文地址:https://blog.csdn.net/m0_57001006/article/details/125418852