在开始之前,先解决中文乱码的问题。在Tomcat 8
以上已经解决了GET
方法中文乱码问题,但是POST
方式的乱码没有解决,我们只需要在代码中加一行:
request.setCharacterEncoding("utf-8");
就可以了
进入正题,下表展示了获取请求参数通用方式的常用方法:
方法 | 说明 |
---|---|
⭐️String getParameter(String name) |
根据参数名称获取参数值 |
⭐️String[] getParameterValues(String name) |
根据参数名称获取参数值的数组 |
⭐️Enumeration |
获取所有请求参数的名称 |
⭐️Map |
获取所有参数的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>
接下来演示这四个方法:
如下图所示:
现在用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
的方式只获取了第一个复选框的值,显然是不符合我们要求的
为了解决上面的那个问题,引入了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);
}
}
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);
}
}
复选框全选,实现效果:
这个方法的好处是,不需要知道参数名称,就可以直接枚举出所有的参数名称和参数值,如果参数太多,用上面的通过参数名称获取值代码会变得很多很冗余;但是它有一个致命的缺点就是:它只能获取复选框选中的第一个值…………………………
请继续往下看第四个方法:
第四种方法完美解决了上面的问题,它返回Map
,所以只需要遍历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);
}
}