zoukankan      html  css  js  c++  java
  • Servlet | Request 对象获取请求参数的通用方式

    -1、解决中文乱码问题

    在开始之前,先解决中文乱码的问题。在Tomcat 8以上已经解决了GET方法中文乱码问题,但是POST方式的乱码没有解决,我们只需要在代码中加一行:

    request.setCharacterEncoding("utf-8");
    
    • 1

    就可以了


    0、概述

    进入正题,下表展示了获取请求参数通用方式的常用方法:

    方法说明
    ⭐️String getParameter(String name) 根据参数名称获取参数值
    ⭐️String[] getParameterValues(String name) 根据参数名称获取参数值的数组
    ⭐️Enumeration<String> getParameterNames() 获取所有请求参数的名称
    ⭐️Map<String,String[]> getParameterMap() 获取所有参数的Map集合

    在演示这四个方法之前,新建一个Servlet,再新建一个表单,让他映射到刚刚创建的Servlet

    <form action="requestDemo4" method="post">
        <input type="text" name="username" placeholder="用户名">
        <br>
        <input type="password" name="password" placeholder="密码">
        <br>
        <input type="checkbox" name="hobby" value="游戏">游戏
        <input type="checkbox" name="hobby" value="学习">学习
        <br>
        <input type="submit" value="提交">
    </form>
    

    接下来演示这四个方法:


    1、getParameter 根据参数名称获取参数值

    如下图所示:

    在这里插入图片描述
    其中红色框子是参数名称,蓝色框子我们输入的是值

    现在用getParameter来获取一下所有用户输入的值,代码如下:

    @WebServlet("/requestDemo4")
    public class RequestDemo4 extends HttpServlet {
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            //0、解决中文乱码问题
            request.setCharacterEncoding("utf-8");
            
            System.out.println("1、根据参数名称获取参数值:");
            //1、根据参数名称获取参数值
            String username = request.getParameter("username");
            System.out.println("username : " + username);
            String password = request.getParameter("password");
            System.out.println("password : " + password);
            String hobby1 = request.getParameter("hobby");
            System.out.println("hobby : " + hobby1);
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    }
    

    填写表单,复选框全选:

    在这里插入图片描述
    点击提交之后,运行结果如下:

    在这里插入图片描述
    可以发现,我们两个复选框的都选中了,但是用getParameter的方式只获取了第一个复选框的值,显然是不符合我们要求的


    2、getParameterValues 根据参数名称获取参数值的数组

    为了解决上面的那个问题,引入了getParameterValues这个方法,这个方法返回的是参数值数组

    根据上面的案例,只编写针对复选框的代码:

    @WebServlet("/requestDemo4")
    public class RequestDemo4 extends HttpServlet {
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            //0、解决中文乱码问题
            request.setCharacterEncoding("utf-8");
    
            System.out.println("2、根据参数名称获取参数值的数组:");
            //2、根据参数名称获取参数值的数组
            String[] hobbies = request.getParameterValues("hobby");
            for (String hobby : hobbies) {
                System.out.println("hobby : " + hobby);
            }
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    }
    

    得到的结果是:
    在这里插入图片描述
    成功解决!


    3、getParameterNames 获取所有请求参数的名称

    getParameterNames方法返回的是Enumeration类型,下面实现一下:

    @WebServlet("/requestDemo4")
    public class RequestDemo4 extends HttpServlet {
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            //0、解决中文乱码问题
            request.setCharacterEncoding("utf-8");
    
            //3、获取所有请求参数的名称
            System.out.println("3、获取所有请求参数的名称");
            Enumeration<String> parameterNames = request.getParameterNames();
            while(parameterNames.hasMoreElements()){
                String name = parameterNames.nextElement();
                String value = request.getParameter(name);
                System.out.println(name + " : " + value);
            }
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    }
    

    复选框全选,实现效果:
    在这里插入图片描述
    这个方法的好处是,不需要知道参数名称,就可以直接枚举出所有的参数名称和参数值,如果参数太多,用上面的通过参数名称获取值代码会变得很多很冗余;但是它有一个致命的缺点就是:它只能获取复选框选中的第一个值…………………………

    请继续往下看第四个方法:


    4、getParameterMap 获取所有参数的Map集合

    第四种方法完美解决了上面的问题,它返回Map<String,String[]>,所以只需要遍历Map就好了,实现一下:

    @WebServlet("/requestDemo4")
    public class RequestDemo4 extends HttpServlet {
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            //0、解决中文乱码问题
            request.setCharacterEncoding("utf-8");
    
            System.out.println("-----------------------------------------------------");
            //4、获取所有参数的Map集合
            System.out.println("4、获取所有参数的Map集合");
            Map<String, String[]> parameterMap = request.getParameterMap();
            Set<String> keySet = parameterMap.keySet();
            for(String name : keySet){
                String[] strings = parameterMap.get(name);
                System.out.print(name + ": ");
                for (String value : strings){
                    System.out.print(value + " ");
                }
                System.out.println();
            }
    
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    }
    

    复选框全选,结果如下:
    在这里插入图片描述
    Bingo!!!!

  • 相关阅读:
    Spark2.3(三十六):根据appName验证某个app是否在运行
    Spark2.3(三十五)Spark Structured Streaming源代码剖析(从CSDN和Github中看到别人分析的源代码的文章值得收藏)
    Spark:实现行转列
    Spark2.3(三十四):Spark Structured Streaming之withWaterMark和windows窗口是否可以实现最近一小时统计
    Spark2.2(三十三):Spark Streaming和Spark Structured Streaming更新broadcast总结(一)
    Centos7:Failed to start LSB: Bring up/down networking
    CDH:cdh5环境搭建
    CDH:cdh5环境mkdir: Permission denied: user=root, access=WRITE, inode="/user":hdfs:hadoop:drwxr-xr-x
    Spark2.2+ES6.4.2(三十二):ES API之index的create/update/delete/open/close(创建index时设置setting,并创建index后根据avro模板动态设置index的mapping)
    Spark2.2+ES6.4.2(三十一):Spark下生成测试数据,并在Spark环境下使用BulkProcessor将测试数据入库到ES
  • 原文地址:https://www.cnblogs.com/ryyy/p/14228127.html
Copyright © 2011-2022 走看看