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!!!!来源:https://www.icode9.com/content-4-808901.html

(0)

相关推荐