package com.jdk.annotation.demo; public class Person { private String name; private int age; //入学日期 @ReqAnnotation(isDateType=true) private String entranceDate; //数学分数 private double mathScore; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getEntranceDate() { return entranceDate; } public void setEntranceDate(String entranceDate) { this.entranceDate = entranceDate; } public double getMathScore() { return mathScore; } public void setMathScore(double mathScore) { this.mathScore = mathScore; } }
package com.jdk.annotation.demo; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface ReqAnnotation { //传入参数的名称 String name() default ""; //是否为dateString类型 boolean isDateType() default false; //时间格式 String dateFormat() default "yyyy-MM-dd HH:mm:ss"; }
package com.jdk.annotation.demo; import java.lang.reflect.Field; import javax.servlet.http.HttpServletRequest; //request转换成bean工具类 public class ConvertHelper { //将request中的值转换成bean对象 @SuppressWarnings("unchecked") public static <T> T convertRequestToBean(HttpServletRequest request, Class<T> clazz) throws InstantiationException, IllegalAccessException{ Object object = clazz.newInstance(); //获取目标类所有的字段 Field [] fields = clazz.getDeclaredFields(); for (Field field : fields) { //取消语言的检查,能够访问非公有的属性 field.setAccessible(true); String reqName = field.getName(); ReqAnnotation reqAnnotation = field.getAnnotation(ReqAnnotation.class); //判断这个字段是否添加了注解 boolean isDate = false; String dateFormat = ""; if (reqAnnotation != null) { if (StringHelper.isNotEmpty(reqAnnotation.name())) { /** * 这步操作是避免,当页面的变量名称与bean中的变量名称不一致的时候, * 在bean字段上的用@RequestAnnotation(name=页面变量名称) */ reqName = reqAnnotation.name(); } if (StringHelper.isNotEmpty(reqAnnotation.dateFormat())) { /** * 当日期的格式转换成非"yyyy-MM-dd HH:mm:ss"格式时, * 只需要在日期字段上添加@RequestAnnotation(dateFormat=需要的格式) */ dateFormat = reqAnnotation.dateFormat(); } //如果bean中的这个字段注释为isDateType=true,在数据填充是将进行时间格式化做铺垫 isDate = reqAnnotation.isDateType(); } //获取字段的类型 Class<?> clazzType = field.getType(); String dateValue = request.getParameter(reqName); if (StringHelper.isNotEmpty(dateValue)) { if (clazzType == String.class) { if (isDate) { /* * 当字段中使用@RequestAnnotation(isDateType=true) */ field.set(object, ConvertTypeHelper.getDate(dateValue, dateFormat)); } else { field.set(object, dateValue); } } else if (clazzType == Integer.class) { field.set(object, ConvertTypeHelper.getInteger(dateValue)); } else if (clazzType == int.class) { field.set(object, ConvertTypeHelper.getInt(dateValue)); } else if (clazzType == double.class) { field.set(object, ConvertTypeHelper.getDouble(dateValue)); } else if (clazzType == Double.class) { field.set(object, ConvertTypeHelper.getDDoubleWapper(dateValue)); } else if (clazzType == long.class) { field.set(object, ConvertTypeHelper.getLong(dateValue)); } else if (clazzType == Long.class) { field.set(object, ConvertTypeHelper.getLongWapper(dateValue)); } else if (clazzType == float.class) { field.set(object, ConvertTypeHelper.getFloat(dateValue)); } else if (clazzType == Float.class) { field.set(object, ConvertTypeHelper.getFloatWapper(dateValue)); } } } return (T)object; } }
package com.jdk.annotation.demo; public class StringHelper { public static boolean isNotEmpty(String str) { boolean bool = false; if (str != null && str.trim().length() > 0) { bool = true; } return bool; } }
package com.jdk.annotation.demo; import java.text.ParseException; import java.text.SimpleDateFormat; /** * * 字段类型转换工具类 * */ public class ConvertTypeHelper { public static String getDate(String date, String dateFormat) { SimpleDateFormat format = new SimpleDateFormat(dateFormat); String retDate = null; try { retDate = format.format(format.parse(date)); } catch (ParseException e) { e.printStackTrace(); } return retDate; } public static Integer getInteger(String str) { return Integer.valueOf(str); } public static int getInt(String str) { return Integer.parseInt(str); } public static long getLong(String str) { return Long.parseLong(str); } public static Long getLongWapper(String str) { return Long.valueOf(str); } public static double getDouble(String str) { return Double.parseDouble(str); } public static Double getDDoubleWapper(String str) { return Double.valueOf(str); } public static float getFloat(String str) { return Float.parseFloat(str); } public static float getFloatWapper(String str) { return Float.valueOf(str); } }
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>将requst转换为bean demo</title> <style type="text/css"> tr { width: 100px; } </style> </head> <body> <form action="../annoServlet" method="post"> <table> <tr> <td>姓名</td> <td><input type="text" name="name"/></td> </tr> <tr> <td>年龄</td> <td><input type="text" name="age"/></td> </tr> <tr> <td>入学日期</td> <td><input type="text" name="entranceDate"/></td> </tr> <tr> <td>数学分数</td> <td><input type="text" name="mathScore"/></td> </tr> <tr> <td>提交</td> <td><input type="submit"/></td> </tr> </table> </form> </body> </html>
package com.jdk.annotation.demo; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class annoServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { Person person = ConvertHelper.convertRequestToBean(request, Person.class); System.out.println("name:"+person.getName()+"\r\n age:"+person.getAge()+"\r\n entranceDate:"+ person.getEntranceDate()+"\r\n mathScore:"+person.getMathScore()); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } }
前段输入和后端打印结果
1、当如果后端的接受日期格式要换成yyyy-MM-dd时,只需要在person类中在entranceDate字段上加上dateFormat="yyyy-MM-dd",并不需要在手动去转换
//入学日期 @ReqAnnotation(isDateType=true, dateFormat="yyyy-MM-dd") private String entranceDate;
2.当jsp中的名称与bean的名称不一致(比如jsp中personName表示人的名称,而person类中name字段表示人的名称),前段的personName值是不能赋给person中name上
但是这里可以通过在person类中name字段上添加@ReqAnnotation(name="personName"),这样就能成功将前段输入personName值赋值给person中name字段上
@ReqAnnotation(name="personName") private String name;
评论