zoukankan      html  css  js  c++  java
  • 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 }
     
  • 相关阅读:
    Kotlin基本语法笔记3之定义类、继承及创建实例
    Kotlin基本语法笔记2之类型检测及自动类型转换、循环
    Kotlin基本语法笔记之函数、变量的定义及null检测
    C++笔记之外部类访问内部类的私有成员
    正则表达式之不区分大小写的匹配
    springMVC之helloworld
    数组学习
    反射reflect
    JSP学习
    自己做的菜
  • 原文地址:https://www.cnblogs.com/samuraihuang/p/10813116.html
Copyright © 2011-2022 走看看