`

注解+反射实现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
分享到:
评论
Global site tag (gtag.js) - Google Analytics