`

注解+反射实现request转bean

    博客分类:
  • java
 
阅读更多
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;

 


 


 
 

 

  • 大小: 8.3 KB
分享到:
评论

相关推荐

    spring bean加载

    - Java配置:通过实现`Configuration`接口或使用`@Configuration`注解的类来定义Bean。例如: ```java @Configuration public class AppConfig { @Bean public ExampleBean exampleBean() { return new ...

    Spring bean 管理

    - class:用于指定Bean所对应的完整类名,Spring通过反射来创建该类的实例。 3. Bean的作用域: - singleton:默认的作用域,表示容器中只有一个Bean实例。 - prototype:每次请求都创建一个新的Bean实例。 - ...

    spring3_mvc_lib_支持注解方式

    描述中提到的 "支持注解方式" 是指Spring 3 MVC通过注解实现了控制器、数据绑定、模型映射等功能的自动化处理,大大提高了开发效率和代码的可读性。这包括但不限于以下几个核心注解: 1. **@Controller**:这个注解...

    java 常见面试题 应届生 个人总结 仅供参考

    * Spring Bean 的作用范围有:singleton(默认)、prototype、request、session、globalSession。 * Singleton:Spring IOC 中默认只存在一个 Bean 实例。 * Prototype:每次调用 Bean 时都会创建一个对象,相当于 `...

    Spring----IOC实现

    7. **Bean的作用域**:Spring中的Bean可以有多种作用域,包括单例(Singleton)、原型(Prototype)、会话(Session)和请求(Request)。选择合适的作用域有助于管理Bean的生命周期。 8. **AOP(面向切面编程)**...

    自己实现的简单Spring 容器

    实例化Bean可以通过反射机制完成,即利用`Class.forName()`加载类并调用`newInstance()`方法创建对象。 2. **依赖注入**: 依赖注入是Spring的核心特性,它允许我们在不修改代码的情况下改变对象之间的关联关系。...

    02-spring-v1.zip

    4. **Bean的作用域**:Bean可以有多种作用域,如单例(Singleton)、原型(Prototype)、会话(Session)和请求(Request)。不同作用域的Bean在生命周期和实例化策略上有所不同。 5. **AOP支持**:Spring的IOC容器...

    基于java反射机制的山寨版WEB2

    在Java中,可以使用JSR 303/349(Bean Validation)标准进行校验,通过在模型类上添加验证注解,如`@NotNull`, `@Size`, `@Pattern`等,然后在服务层调用验证API来检查数据的有效性。此外,Spring MVC提供了`@...

    一段Spring代码引起的调用绑定总结

    Spring提供了多种Bean的作用域,如单例(Singleton)、原型(Prototype)、请求(Request)、会话(Session)等。选择合适的作用域有助于管理bean的实例化和生命周期。 7. **Spring的工具类和实用程序**: Spring...

    SSM集成应用

    可以通过实现InitializingBean或DisposableBean接口,或者使用@PostConstruct和@PreDestroy注解来定制初始化和销毁方法。 #### Bean的装配 **7.1 概念** Bean的装配是指在Spring容器中注册bean,并且根据bean的...

    2023最新Spring全家桶面试题-图灵徐庶

    4. Spring IoC的实现机制:通过反射机制和工厂模式来实现依赖注入。 5. Spring的依赖注入(DI):是指在编译时不知道某个对象的具体类型,但是在运行时可以将该对象的具体类型注入到需要该对象的类中。 6. 紧耦合和...

    Java - Spring-IoC(Inverse of Control)–> 控制反转

    使用`@Autowired`注解可以实现自动装配,而`@Qualifier`注解用于指定具体要注入的Bean。 综上所述,Spring框架通过其强大的IoC容器和依赖注入机制,极大地简化了Java应用的开发流程,并提升了应用的可维护性和扩展...

    面试基础宝典7.1.docx

    **Bean**:Spring 在启动时,会通过 `beanFactory` 使用工厂模式和反射机制,依据如 `@Controller`、`@Service`、`@Component` 等注解来创建对象,并将它们实例化为 Bean。Bean 可以有不同的 Scope,包括默认的单例...

    动态生成Java springboot controller.docx

    为了确保这个类可以被Spring容器管理,我们通常会使用`@Component`注解,或者通过`@Bean`注解在配置类中定义它。例如: ```java @Component("testRequest") public class TestRequest { public ResponseEntity...

    java学习整理文档.docx

    根据Bean的scope(如singleton、prototype、request、session),Spring会管理不同作用域下的Bean创建和销毁。例如,singleton作用域的Bean在整个应用中只有一个实例,而prototype作用域的Bean每次请求都会创建新的...

    Java ssm 面试题.docx

    2. 通过 BeanDefinition 反射创建 Bean 对象; 3. 对 Bean 对象进行属性填充; 4. 回调实现了 Aware 接口的方法,如 BeanNameAware; 5. 调用 BeanPostProcessor 的初始化前方法; 6. 调用 init 初始化方法; 7. 调用 ...

    第四课:IOC容器设计理念与源码解读 (2)1

    - **作用域**:Bean可以具有单例(Singleton)、原型(Prototype)、请求(Request)、会话(Session)等不同的作用域,决定了Bean的生命周期和创建数量。 - **生命周期**:Bean的创建、初始化、使用和销毁过程...

    动态生成Java springboot controller (2).pdf

    2. 使用@Bean注解:在配置类中,通过@Bean方法创建`TestRequest`的实例,这样可以自定义bean的名称。在这种情况下,`TestRequest`类不需要其他Spring注解。 测试这个动态注册的过程,可以创建一个简单的TestRequest...

Global site tag (gtag.js) - Google Analytics