servlet3.0新特性

在JavaEE6规范中添加了了Servlet3.0 规范,该规范中允许在定义 Servlet、Filter 与 Listener 三大组件时使用注解,而不用在web.xml 进行注册了。Servlet3.0 规范允许 Web 项目没有 web.xml 配置文件。
使用servlet3.0时需要jdk6+,tomcat7+

servlet注解

在3.0规范中使用@WebServlet()注解注册一个servlet,该注解中有多个属性,常用属性如下:

属性名类型说明
urlPatterns String[] 相当于url-pattern的值
value String[] 与 urlPatterns 意义相同,不能与 urlPatterns 属性同时使用
name String 相当于servlet-name的值
loadOnStartup int 相当于loadOnStartup,默认值为-1
initParams WebInitParam[] 相当于init-param标签。其类型为另一个注解 WebInitParam 数组

代码示例:

 1 package com.monkey1024.servlet;
 2 
 3 import java.io.IOException;
 4 import java.util.Enumeration;
 5 
 6 import javax.servlet.ServletConfig;
 7 import javax.servlet.ServletException;
 8 import javax.servlet.annotation.WebInitParam;
 9 import javax.servlet.annotation.WebServlet;
10 import javax.servlet.http.HttpServlet;
11 import javax.servlet.http.HttpServletRequest;
12 import javax.servlet.http.HttpServletResponse;
13 
14 /**
15  * servlet注解
16  */
17 @WebServlet(value={"/test","/abc/test"},
18             name="testServlet",
19             loadOnStartup=2,
20             initParams={
21                     @WebInitParam(name="teacher", value="monkey1024"),
22                     @WebInitParam(name="course", value="java")
23             })
24 public class TestServlet extends HttpServlet {
25     private static final long serialVersionUID = 1L;
26 
27     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
28         ServletConfig servletConfig = this.getServletConfig();
29         //获取servlet名称
30         String servletName = servletConfig.getServletName();
31         System.out.println("servlet名称:" + servletName);
32 
33         //获得初始化参数
34         Enumeration<String> params = servletConfig.getInitParameterNames();
35         while(params.hasMoreElements()){
36             String name = params.nextElement();
37             String value = servletConfig.getInitParameter(name);
38             System.out.println(name + ":" + value);
39         }
40     }
41 
42     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
43         doGet(request, response);
44     }
45 
46 }

filter注解

在3.0 规范中使用@WebFilter()注解来注册当前的 Filter 类。目前使用注解无法指定filter的执行顺序,其会默认根据filter的名字的字母顺序执行。该注解常用属性的类型与意义如下表所示:

属性名类型说明
urlPatterns String[] 相当于url-pattern的值
value String[] 与 urlPatterns 意义相同,不能与 urlPatterns 属性同时使用
filterName String 相当于filter-name的值
servletNames String[] 相当于filter-mapping的子标签servlet-name,用于指定要过滤的Servlet 名称
initParams WebInitParam[] 相当于init-param标签。其类型为另一个注解 WebInitParam 数组

代码示例:

 1 package com.monkey1024.filter;
 2 
 3 import java.io.IOException;
 4 import javax.servlet.Filter;
 5 import javax.servlet.FilterChain;
 6 import javax.servlet.FilterConfig;
 7 import javax.servlet.ServletException;
 8 import javax.servlet.ServletRequest;
 9 import javax.servlet.ServletResponse;
10 import javax.servlet.annotation.WebFilter;
11 
12 /**
13  * filter注解
14  */
15 @WebFilter(value={"/*"},
16            filterName="testFilter")
17 public class TestFilter implements Filter {
18 
19     public void destroy() {
20     }
21 
22     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
23         chain.doFilter(request, response);
24     }
25 
26     public void init(FilterConfig fConfig) throws ServletException {
27     }
28 
29 }

Listener注解

Servlet3.0 规范中使用@WebListener()注解来注册当前的 Listener 类。在 Web 工程中创建好 Listener 后,直接在类上添加@WebListener 注解即可完成 Listener 的注册。
该注解有一个属性 value,表示对该监听器的描述,使用不多。

代码示例:

 1 package com.monkey1024.listener;
 2 
 3 import javax.servlet.ServletRequestEvent;
 4 import javax.servlet.ServletRequestListener;
 5 import javax.servlet.annotation.WebListener;
 6 
 7 /**
 8  * Listener注解
 9  *
10  */
11 @WebListener
12 public class TestListener implements ServletRequestListener {
13 
14     public void requestDestroyed(ServletRequestEvent sre)  { 
15     }
16 
17     public void requestInitialized(ServletRequestEvent sre)  { 
18     }
19 
20 }

web.xml文件

在创建项目时注意选择servlet版本,创建时可以通过勾选生成web.xml文件,默认是不会生成的。
在生成的web.xml文件中的标签中有一个属性 metadata-complete,是布尔类型。其值为 true,表示可以完全使用 web.xml 中的注册信息,对 Servlet3.0 的注解将忽略。若值为 false,则表示可以使用注解, 但 web.xml 中的注册信息也起作用。若一个组件类(Servlet、Filter 或 Listener)既使用了注解,又在 web.xml 中进行了注册,则对于不同的组件,其效果是不同的:

    • 使用两种方式对于同一个 Servlet 进行注册,要求 web.xml 与注解中的 url-pattern 是不能重复的。否则,服务器无法启动。
    • 使用两种方式对于同一个 Filter 进行注册,无论 url-pattern 值是否相同,其效果都相当于一个 Filter。
    • 使用两种方式对于同一个 Listener 进行注册,其效果与使用一种方式注册完全相同。

servlet3.0新特性之文件上传

Servlet3.0 提供了专门的文件上传 API。 HttpServletRequest 的 getPart()方法可以完成单个文件上传,而 getParts()方法可以完成多个文件上传。注意,这两个方法是从 Servlet3.0 开始定义的。
getPart
方法:Part getPart(String name) throws IOException, ServletException
作用:获取 Multipart 请求中指定名称的"部分"。一般这里的参数是上传表单中的"file"表单项的 name 值。
getParts
方法:java.util.Collection getParts()throws IOException, ServletException
作用:获取 Multipart 请求中的所有"部分"。多文件上传时使用该方法。

Servlet3.0在javax.servlet.http包中新增了Part接口,该接口中常用的方法有:
write
方法:void write(String fileName) throws IOException
作用:将上传文件数据写入到指定的文件中。

另外在Servlet3.1中的Part接口里面新增了getSubmittedFileName方法用来获取上传的文件名

代码示例:

创建servlet时,需要在Servlet中添加一个@MultipartConfig注解,表示当前 Servlet 可以处理 Multipart 请求。

 1 package com.monkey1024.servlet;
 2 
 3 import java.io.File;
 4 import java.io.IOException;
 5 
 6 import javax.servlet.ServletException;
 7 import javax.servlet.annotation.MultipartConfig;
 8 import javax.servlet.annotation.WebServlet;
 9 import javax.servlet.http.HttpServlet;
10 import javax.servlet.http.HttpServletRequest;
11 import javax.servlet.http.HttpServletResponse;
12 import javax.servlet.http.Part;
13 
14 /**
15  * 处理上传的servlet
16  */
17 @WebServlet("/upload")
18 @MultipartConfig //表示当前servlet可以处理multipart请求
19 public class UploadServlet extends HttpServlet {
20     private static final long serialVersionUID = 1L;
21 
22     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
23         //获取服务器存放上传文件的路径
24         String path = this.getServletContext().getRealPath("/upload");
25         System.out.println(path);
26         //获取上传文件,photo是html表单中的name
27         Part part = request.getPart("photo");
28         //获取上传文件的名称,这是servlet3.1中加入的方法
29         String fileName = part.getSubmittedFileName();
30 
31         //将上传的文件写入到指定的服务器路径中
32         part.write(path + "/" + fileName);
33     }
34 
35     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
36         doGet(request, response);
37     }
38 
39 }

创建一个jsp文件

<form enctype="multipart/form-data" action="${pageContext.request.contextPath }/upload" method="post" >
    <input type="file" name="photo"/><br/>
    <input type="submit" value="上传"/><br/>
</form>

使用servlet3.1注解实现文件上传详细例子

简介

之前的使用servlet3.0实现文件上传的文章中有一些不太完善的地方,所以写这篇文章完善一下。

上传是文件名重复的问题

下面代码是之前servlet3.0实现文件上传的文章中的上传方式:

 1 package com.monkey1024.servlet;
 2 
 3 import javax.servlet.ServletException;
 4 import javax.servlet.annotation.MultipartConfig;
 5 import javax.servlet.annotation.WebServlet;
 6 import javax.servlet.http.HttpServlet;
 7 import javax.servlet.http.HttpServletRequest;
 8 import javax.servlet.http.HttpServletResponse;
 9 import javax.servlet.http.Part;
10 import java.io.IOException;
11 
12 /**
13  * 处理上传的servlet
14  */
15 @WebServlet("/upload")
16 @MultipartConfig //表示当前servlet可以处理multipart请求
17 public class UploadServlet01 extends HttpServlet {
18     private static final long serialVersionUID = 1L;
19 
20     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
21         //获取服务器存放上传文件的路径
22         //String path = this.getServletContext().getContextPath();
23         String path = this.getServletContext().getRealPath("/upload");
24         System.out.println(path);
25         //获取上传文件,photo是html表单中的name
26         Part part = request.getPart("photo");
27         //获取上传文件的名称,这是servlet3.1中加入的方法
28         String fileName = part.getSubmittedFileName();
29         System.out.println(path + "/" + fileName);
30         //将上传的文件写入到指定的服务器路径中
31         part.write(path + "/" + fileName);
32 
33     }
34 
35     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
36         doGet(request, response);
37     }
38 
39 }

上面代码中有可能会出现多个用户上传的文件名重复的情况,此时之前在服务器中存储的文件会被后上传的同名文件替换掉,为了解决这个问题,可以将文件名修改一下,建议使用UUID的方式重命名。
uuid是Universally Unique Identifier的缩写,中文是通用统一识别码,uuid具有唯一性,uuid的生成跟系统的时间、mac地址、时间序列、随机数有关,所以通常所生成的uuid是不会重复的,两个相同的uuid出现的概率非常低(比陨石撞击地球的概率还要低)。

    //获取上传文件的名称,这是servlet3.1中加入的方法
    String fileName = part.getSubmittedFileName();

    //在文件名中添加uuid
    fileName = UUID.randomUUID() + "_" + fileName;

通过上面的代码就可以确保用户上传文件名的唯一性了。

创建目录便于管理

如果用户上传的文件都放到一个文件夹下的话,随着时间的积累,该文件夹就会变的非常臃肿,不利于管理。因此,这里考虑将用户上传的文件放到不同的文件夹中,我们来按照年、月、日创建多级子目录的方式。比如用户在2018年1月25日上传了一个文件monkey.jpg,那就让该文件放到这样的文件夹目录中:/2018/1/25/monkey.jpg

//获取当前系统时间的年月日
LocalDate now = LocalDate.now();
int year = now.getYear();
int month = now.getMonthValue();
int day = now.getDayOfMonth();
String path = this.getServletContext().getRealPath("/upload");
//在upload下分别创建年、月、日三级子目录
path = path + "/" + year + "/" + month + "/" +day;
//创建父目录
File parentDir = new File(path);
//如果父目录不存在,则创建
if(!parentDir.exists()){
    parentDir.mkdirs();
}

修改后的代码:

 1 package com.monkey1024.servlet;
 2 
 3 import java.io.File;
 4 import java.io.IOException;
 5 import java.time.LocalDate;
 6 import java.util.UUID;
 7 
 8 import javax.servlet.ServletException;
 9 import javax.servlet.annotation.MultipartConfig;
10 import javax.servlet.annotation.WebServlet;
11 import javax.servlet.http.HttpServlet;
12 import javax.servlet.http.HttpServletRequest;
13 import javax.servlet.http.HttpServletResponse;
14 import javax.servlet.http.Part;
15 
16 /**
17  * 处理上传的servlet
18  */
19 @WebServlet("/upload")
20 @MultipartConfig //表示当前servlet可以处理multipart请求
21 public class UploadServlet extends HttpServlet {
22     private static final long serialVersionUID = 1L;
23 
24     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
25         //获取服务器存放上传文件的路径
26         String path = this.getServletContext().getRealPath("/upload");
27         System.out.println(path);
28         //获取上传文件,photo是html表单中的name
29         Part part = request.getPart("photo");
30         //获取上传文件的名称,这是servlet3.1中加入的方法
31         String fileName = part.getSubmittedFileName();
32 
33         //在文件名中添加uuid
34         fileName = UUID.randomUUID() + "_" + fileName;
35 
36       //获取当前系统时间的年月日
37         LocalDate now = LocalDate.now();
38         int year = now.getYear();
39         int month = now.getMonthValue();
40         int day = now.getDayOfMonth();
41 
42         //在upload下分别创建年、月、日三级子目录
43         path = path + File.separator + year + File.separator + month + File.separator +day;
44         //创建父目录
45         File parentDir = new File(path);
46         //如果父目录不存在,则创建
47         if(!parentDir.exists()){
48             parentDir.mkdirs();
49         }
50 
51         //将上传的文件写入到指定的服务器路径中
52         part.write(path + File.separator + fileName);
53     }
54 
55     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
56         doGet(request, response);
57     }
58 
59 
60 }

设置上传文件的大小

在@MultipartConfig注解中有两个属性:
maxFileSize:表示上传一个文件的最大值,单位是byte
maxRequestSize:表示一次请求中上传文件的最大值,一次可能上传多个文件,这些文件大小的之和。单位是byte

如果上传的文件超出了设置的最大值时,系统会在

Part part = request.getPart("photo");

抛出一个IllegalStateException的异常,我们可以通过捕获该异常从而向用户提示友好信息。

 1 package com.monkey1024.servlet;
 2 
 3 import java.io.File;
 4 import java.io.IOException;
 5 import java.io.PrintWriter;
 6 import java.time.LocalDate;
 7 import java.util.UUID;
 8 
 9 import javax.servlet.ServletException;
10 import javax.servlet.annotation.MultipartConfig;
11 import javax.servlet.annotation.WebServlet;
12 import javax.servlet.http.HttpServlet;
13 import javax.servlet.http.HttpServletRequest;
14 import javax.servlet.http.HttpServletResponse;
15 import javax.servlet.http.Part;
16 
17 /**
18  * 处理上传的servlet
19  */
20 @WebServlet("/upload")
21 @MultipartConfig(maxFileSize = 1024*5) // 表示当前servlet可以处理multipart请求
22 public class UploadServlet extends HttpServlet {
23     private static final long serialVersionUID = 1L;
24 
25     private static MultipartConfig config = UploadServlet.class.getAnnotation(MultipartConfig.class);
26 
27     protected void doGet(HttpServletRequest request, HttpServletResponse response)
28             throws ServletException, IOException {
29         request.setCharacterEncoding("utf-8");
30         response.setContentType("text/html;charset=utf-8");
31         PrintWriter out = response.getWriter();
32         // 获取服务器存放上传文件的路径
33         String path = this.getServletContext().getRealPath("/upload");
34         System.out.println(path);
35         // 获取上传文件,photo是html表单中的name
36         Part part;
37         try{
38             part = request.getPart("photo");
39         }catch(IllegalStateException e){
40             //上传的单个文件超出maxFileSize或者上传的总的数据量超出maxRequestSize时会抛出此异常
41             e.printStackTrace();
42             out.write("文件上传失败,请上传小于5kb的文件");
43             return;
44         }
45         // 获取上传文件的名称,这是servlet3.1中加入的方法
46         String fileName = part.getSubmittedFileName();
47 
48         // 在文件名中添加uuid
49         fileName = UUID.randomUUID() + "_" + fileName;
50 
51         // 获取当前系统时间的年月日
52         LocalDate now = LocalDate.now();
53         int year = now.getYear();
54         int month = now.getMonthValue();
55         int day = now.getDayOfMonth();
56 
57         // 在upload下分别创建年、月、日三级子目录
58         // path = path + "/" + year + "/" + month + "/" +day;
59         path = path + File.separator + year + File.separator + month + File.separator + day;
60         // 创建父目录
61         File parentDir = new File(path);
62         // 如果父目录不存在,则创建
63         if (!parentDir.exists()) {
64             parentDir.mkdirs();
65         }
66         System.out.println(path);
67         // 将上传的文件写入到指定的服务器路径中
68         part.write(path + File.separator + fileName);
69         out.write("文件上传成功!");
70     }
71 
72     protected void doPost(HttpServletRequest request, HttpServletResponse response)
73             throws ServletException, IOException {
74         doGet(request, response);
75     }
76 
77 }

多文件上传

用户在客户端有时需要进行多文件上传,此时可以通过下面方法获取Part对象的集合:

Collection<Part> parts = request.getParts();

然后遍历该集合分别处理part对象即可:

 1 package com.monkey1024.servlet;
 2 
 3 import java.io.File;
 4 import java.io.IOException;
 5 import java.io.PrintWriter;
 6 import java.time.LocalDate;
 7 import java.util.Collection;
 8 import java.util.UUID;
 9 
10 import javax.servlet.ServletException;
11 import javax.servlet.annotation.MultipartConfig;
12 import javax.servlet.annotation.WebServlet;
13 import javax.servlet.http.HttpServlet;
14 import javax.servlet.http.HttpServletRequest;
15 import javax.servlet.http.HttpServletResponse;
16 import javax.servlet.http.Part;
17 
18 /**
19  * 处理上传的servlet
20  */
21 @WebServlet("/upload")
22 @MultipartConfig(maxRequestSize = 1024*5) // 表示当前servlet可以处理multipart请求
23 public class UploadServlet extends HttpServlet {
24     private static final long serialVersionUID = 1L;
25 
26     private static MultipartConfig config = UploadServlet.class.getAnnotation(MultipartConfig.class);
27 
28     protected void doGet(HttpServletRequest request, HttpServletResponse response)
29             throws ServletException, IOException {
30         request.setCharacterEncoding("utf-8");
31         response.setContentType("text/html;charset=utf-8");
32         PrintWriter out = response.getWriter();
33         // 获取服务器存放上传文件的路径
34         String path = this.getServletContext().getRealPath("/upload");
35         System.out.println(path);
36         // 一次上传多个文件
37         Collection<Part> parts;
38         try {
39             parts = request.getParts();
40         } catch (IllegalStateException e) {
41             // 上传的单个文件超出maxFileSize或者上传的总的数据量超出maxRequestSize时会抛出此异常
42             e.printStackTrace();
43             out.write("文件上传失败,请上传小于5kb的文件");
44             return;
45         }
46 
47         // 获取当前系统时间的年月日
48         LocalDate now = LocalDate.now();
49         int year = now.getYear();
50         int month = now.getMonthValue();
51         int day = now.getDayOfMonth();
52 
53         // 在upload下分别创建年、月、日三级子目录
54         // path = path + "/" + year + "/" + month + "/" +day;
55         path = path + File.separator + year + File.separator + month + File.separator + day;
56         // 创建父目录
57         File parentDir = new File(path);
58         // 如果父目录不存在,则创建
59         if (!parentDir.exists()) {
60             parentDir.mkdirs();
61         }
62 
63         for (Part part : parts) {
64             // 获取上传文件的名称,这是servlet3.1中加入的方法
65             String fileName = part.getSubmittedFileName();
66             if("".equals(fileName)) {
67                 //如果文件名为"",说明这个文件是空,无需进行上传处理
68                 continue;
69             }
70             // 在文件名中添加uuid
71             fileName = UUID.randomUUID() + "_" + fileName;
72             System.out.println(path);
73             // 将上传的文件写入到指定的服务器路径中
74             part.write(path + File.separator + fileName);
75         }
76 
77         out.write("文件上传成功!");
78     }
79 
80     protected void doPost(HttpServletRequest request, HttpServletResponse response)
81             throws ServletException, IOException {
82         doGet(request, response);
83     }
84 
85 }

bootstrap-fileupload组件

如果希望实现一些更炫的前端效果,可以借助使用bootstrap-fileupload,该组件基于bootstrap实现,使用前需要引入bootstrap相关文件,里面的文档和demo都非常丰富,感兴趣的同学可以自行查看。
在线文档:http://plugins.krajee.com/file-input
在线demo:http://plugins.krajee.com/file-input/demo

反射的应用案例-将表单数据填充到javabean中

反射的应用案例

在之前的servlet里面我们接收表单提交参数都是使用

request.getParameter()

当表单参数较多的话,需要调用多次上面的方法才能获取到表单提交的数据,这样子代码就显得不太整洁了,这里我们来使用反射编写一个自动将表单数据填充到javabean的工具类。

创建一个User的javabean

 1 package com.monkey1024.bean;
 2 
 3 public class User {
 4 
 5     private String name;
 6 
 7     private int age;
 8 
 9 
10     public String getName() {
11         return name;
12     }
13 
14     public void setName(String name) {
15         this.name = name;
16     }
17 
18     public int getAge() {
19         return age;
20     }
21 
22     public void setAge(int age) {
23         this.age = age;
24     }
25 
26 }

然后编写一个jsp用来提交表单:

<form action="${pageContext.request.contextPath}/addUser" method="post">
    姓名:<input type="text" name="name"><br>
    年龄:<input type="text" name="age"><br>
    <input type="submit" value="提交">
</form>

之后创建一个BeanUtil的工具类,在这个工具类中,我们使用反射获取javabean中的方法,然后根据表单中的name属性找到与之对应的方法,将表单数据填充到javabean中相应的属性上,这里需要保证表单中的name属性和javabean中的属性名一致:

 1 package com.monkey1024.util;
 2 
 3 import java.lang.reflect.InvocationTargetException;
 4 import java.lang.reflect.Method;
 5 
 6 public class BeanUtil {
 7 
 8     public static void initBean(Object obj, String name, String value) throws InvocationTargetException, IllegalAccessException {
 9         //把字段名称转化为方法名称 例如:name 转化为setName
10         String methodName = "set" + name.toUpperCase().charAt(0) + name.substring(1);
11         //拿到类中所有的方法,不包含父类的方法
12         Method[] methods = obj.getClass().getDeclaredMethods();
13         for (Method method : methods) {
14 
15             //获得方法名称
16             String objMethodName = method.getName();
17 
18             //如果转化过的setName和类中的任意一个方法匹配上了,就调用该方法把value以参数的形式传递给该方法
19             if (methodName.equals(objMethodName)) {
20 
21                 //方法对象中如果是String 类型就要把 value转化为String 对象,如果是int 类型就要把 value转化为 Integer对象
22                 //拿到方法对象中的参数类型数组从而判断当前参数的类型
23                 Class[] paramTypes = method.getParameterTypes();
24 
25                 //拿到第一个参数的类型以字符串的形式返回
26                 String paramType = paramTypes[0].getSimpleName();
27 
28                 if ("int".equals(paramType)) {
29                     //相当于 obj.setName(param);
30                     method.invoke(obj, Integer.parseInt(value.toString()));
31                 } else if ("String".equals(paramType)) {
32                     method.invoke(obj, value.toString());
33                 } else if ("long".equals(paramType)) {
34                     method.invoke(obj, Long.parseLong(value.toString()));
35                 }
36 
37             }
38         }
39     }
40 }

在servlet中调用上面的BeanUtil工具类就可以实现自动将表单数据填充到javabean了。

 1 package com.monkey1024.servlet;
 2 
 3 import com.monkey1024.bean.User;
 4 import com.monkey1024.util.BeanUtil;
 5 
 6 import javax.servlet.ServletException;
 7 import javax.servlet.annotation.WebServlet;
 8 import javax.servlet.http.HttpServlet;
 9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11 import java.io.IOException;
12 import java.io.PrintWriter;
13 import java.lang.reflect.InvocationTargetException;
14 import java.lang.reflect.Method;
15 import java.util.Enumeration;
16 import java.util.Map;
17 
18 @WebServlet("/addUser")
19 public class UserServlet extends HttpServlet {
20     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
21 
22         //获取请求中所有的参数
23         Map<String, String[]> parameterMap = request.getParameterMap();
24         try {
25             //创建要将数据填充的javabean对象
26             User user = new User();
27             //遍历parameterMap获取请求参数
28             for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
29                 //这里不考虑其他情况,只选择String数组0位置上的元素传入
30                 BeanUtil.initBean(user, entry.getKey(), entry.getValue()[0]);
31             }
32 
33             System.out.println(user.getName());
34             System.out.println(user.getAge());
35 
36         } catch (InvocationTargetException e) {
37             e.printStackTrace();
38         } catch (IllegalAccessException e) {
39             e.printStackTrace();
40         }
41 
42 
43     }
44 
45 
46     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
47         doPost(request, response);
48     }
49 }
 
原文地址:https://www.cnblogs.com/samuraihuang/p/10813116.html