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 }