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;
相关推荐
- Java配置:通过实现`Configuration`接口或使用`@Configuration`注解的类来定义Bean。例如: ```java @Configuration public class AppConfig { @Bean public ExampleBean exampleBean() { return new ...
- class:用于指定Bean所对应的完整类名,Spring通过反射来创建该类的实例。 3. Bean的作用域: - singleton:默认的作用域,表示容器中只有一个Bean实例。 - prototype:每次请求都创建一个新的Bean实例。 - ...
描述中提到的 "支持注解方式" 是指Spring 3 MVC通过注解实现了控制器、数据绑定、模型映射等功能的自动化处理,大大提高了开发效率和代码的可读性。这包括但不限于以下几个核心注解: 1. **@Controller**:这个注解...
* Spring Bean 的作用范围有:singleton(默认)、prototype、request、session、globalSession。 * Singleton:Spring IOC 中默认只存在一个 Bean 实例。 * Prototype:每次调用 Bean 时都会创建一个对象,相当于 `...
7. **Bean的作用域**:Spring中的Bean可以有多种作用域,包括单例(Singleton)、原型(Prototype)、会话(Session)和请求(Request)。选择合适的作用域有助于管理Bean的生命周期。 8. **AOP(面向切面编程)**...
实例化Bean可以通过反射机制完成,即利用`Class.forName()`加载类并调用`newInstance()`方法创建对象。 2. **依赖注入**: 依赖注入是Spring的核心特性,它允许我们在不修改代码的情况下改变对象之间的关联关系。...
4. **Bean的作用域**:Bean可以有多种作用域,如单例(Singleton)、原型(Prototype)、会话(Session)和请求(Request)。不同作用域的Bean在生命周期和实例化策略上有所不同。 5. **AOP支持**:Spring的IOC容器...
在Java中,可以使用JSR 303/349(Bean Validation)标准进行校验,通过在模型类上添加验证注解,如`@NotNull`, `@Size`, `@Pattern`等,然后在服务层调用验证API来检查数据的有效性。此外,Spring MVC提供了`@...
Spring提供了多种Bean的作用域,如单例(Singleton)、原型(Prototype)、请求(Request)、会话(Session)等。选择合适的作用域有助于管理bean的实例化和生命周期。 7. **Spring的工具类和实用程序**: Spring...
可以通过实现InitializingBean或DisposableBean接口,或者使用@PostConstruct和@PreDestroy注解来定制初始化和销毁方法。 #### Bean的装配 **7.1 概念** Bean的装配是指在Spring容器中注册bean,并且根据bean的...
4. Spring IoC的实现机制:通过反射机制和工厂模式来实现依赖注入。 5. Spring的依赖注入(DI):是指在编译时不知道某个对象的具体类型,但是在运行时可以将该对象的具体类型注入到需要该对象的类中。 6. 紧耦合和...
使用`@Autowired`注解可以实现自动装配,而`@Qualifier`注解用于指定具体要注入的Bean。 综上所述,Spring框架通过其强大的IoC容器和依赖注入机制,极大地简化了Java应用的开发流程,并提升了应用的可维护性和扩展...
**Bean**:Spring 在启动时,会通过 `beanFactory` 使用工厂模式和反射机制,依据如 `@Controller`、`@Service`、`@Component` 等注解来创建对象,并将它们实例化为 Bean。Bean 可以有不同的 Scope,包括默认的单例...
为了确保这个类可以被Spring容器管理,我们通常会使用`@Component`注解,或者通过`@Bean`注解在配置类中定义它。例如: ```java @Component("testRequest") public class TestRequest { public ResponseEntity...
根据Bean的scope(如singleton、prototype、request、session),Spring会管理不同作用域下的Bean创建和销毁。例如,singleton作用域的Bean在整个应用中只有一个实例,而prototype作用域的Bean每次请求都会创建新的...
2. 通过 BeanDefinition 反射创建 Bean 对象; 3. 对 Bean 对象进行属性填充; 4. 回调实现了 Aware 接口的方法,如 BeanNameAware; 5. 调用 BeanPostProcessor 的初始化前方法; 6. 调用 init 初始化方法; 7. 调用 ...
- **作用域**:Bean可以具有单例(Singleton)、原型(Prototype)、请求(Request)、会话(Session)等不同的作用域,决定了Bean的生命周期和创建数量。 - **生命周期**:Bean的创建、初始化、使用和销毁过程...
2. 使用@Bean注解:在配置类中,通过@Bean方法创建`TestRequest`的实例,这样可以自定义bean的名称。在这种情况下,`TestRequest`类不需要其他Spring注解。 测试这个动态注册的过程,可以创建一个简单的TestRequest...