`
zuzong
  • 浏览: 112403 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

根据表单对象,为业务对象赋值

    博客分类:
  • java
F# 
阅读更多
package com.team.engine.util;

import java.lang.reflect.Field;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

/**
 * 根据表单对象,为业务对象赋值<br/>
 * 表单对象来自request.getParameterMap()<br/>
 * 示例:
 * <pre>
 * AttributeMapping<\Test1\> attributeMapping = new AttributeMapping<\Test1\>(Test1.class);
 * attributeMapping.setPattern("yyyy-MM-dd"); //当有日期类型时
 * Test1 mapping = attributeMapping.mapping(map);
 * </pre>
 * @data 2010-9-8
 * @param <T> 业务对象(BO,DTO)
 */
public class AttributeMapping<T> {

	/**
	 * 需要装填赋值的业务对象(BO,DTO)
	 */
	private Class clazz;
	
	/**
	 * 来自页面的表单对象
	 */
	private Map<String, String[]> map;
	
	/**
	 * 日期和时间的格式
	 */
	private String pattern;
	
	private SimpleDateFormat simpleDateFormat;
	
	public void setPattern(String pattern) {
		this.pattern = pattern;
		this.simpleDateFormat = new SimpleDateFormat(pattern);
	}

	public AttributeMapping(Class clazz){
		this.clazz = clazz;
	}
	
	private Map<String, Object> fieldPool(Map<String, String[]> map){
		
		HashMap<String, Object> fieldPool = new HashMap<String, Object>();
		
		try {
			fieldPool.put("root", (T) this.clazz.newInstance());
			
			for (Entry<String, String[]> entrySet : map.entrySet()) {
				String key = entrySet.getKey();
				String[] keySplit = null;
				if (key.contains(".")) {
					keySplit = key.split("\\.");
					for (int i = 0; i < keySplit.length; i++) {
						if (i == keySplit.length - 1)
							break;

						String keyTmp = keySplit[i];
						Object object = fieldPool.get(keyTmp);
						if (object == null) {
							Object objectParent = fieldPool
									.get(i - 1 == -1 ? "root" : keySplit[i - 1]);
							
							Field fTmp = objectParent.getClass().getDeclaredField(keyTmp);
							fTmp.setAccessible(true);
							fieldPool.put(keyTmp, (Object) Class.forName(
									fTmp.getType().getName()).newInstance());
						}
					}
				}
			}
					
		} catch (InstantiationException e) {
			throw new RuntimeException(e);
		} catch (IllegalAccessException e) {
			throw new RuntimeException(e);
		} catch (SecurityException e) {
			throw new RuntimeException(e);
		} catch (NoSuchFieldException e) {
			throw new RuntimeException(e);
		} catch (ClassNotFoundException e) {
			throw new RuntimeException(e);
		}
		
		return fieldPool;
	}
	
	/**
	 * 根据表单对象,为业务对象赋值
	 * @param map 表单对象
	 * @return
	 */
	public T mapping(Map<String, String[]> map){
		Map<String, Object> fieldPool = this.fieldPool(map);
		
		try {
			for (Entry<String, String[]> entrySet : map.entrySet()) {
				String[] keyArr = entrySet.getKey().split("\\.");
				int length = keyArr.length;
				
				Object object = fieldPool.get(length==1?"root":keyArr[length-2]);
				Field f = object.getClass().getDeclaredField(keyArr[length-1]);
				f.setAccessible(true);
				String typeName = f.getType().getSimpleName();
				
				if (typeName.equals("String"))
					f.set(object, entrySet.getValue()[0]);
				if (typeName.equals("int") || typeName.equals("Integer"))
					f.set(object, Integer.valueOf(entrySet.getValue()[0]));
				if (typeName.equals("long") || typeName.equals("Long"))
					f.set(object, Long.valueOf(entrySet.getValue()[0]));
				if(typeName.equals("Date")){
					Date date = this.simpleDateFormat.parse(entrySet.getValue()[0]);
					f.set(object, date);
				}
				
				for (int i = keyArr.length - 2; i >= 0; i--) {
					String keyParent = i != 0 ? keyArr[i - 1] : "root";
					String key2 = keyArr[i];

					Object objectParent = fieldPool.get(keyParent);
					object = i==keyArr.length - 2?object:fieldPool.get(key2);

					Field f2 = objectParent.getClass().getDeclaredField(key2);
					f2.setAccessible(true);
					f2.set(objectParent, object);
				}
			}
			
		} catch (IllegalAccessException e) {
			throw new RuntimeException(e);
		} catch (SecurityException e) {
			throw new RuntimeException(e);
		} catch (NoSuchFieldException e) {
			throw new RuntimeException(e);
		} catch (ParseException e) {
			throw new RuntimeException(e);
		}
		
		return (T) fieldPool.get("root");
	}
	
	public static void main(String[] args) {
		Map<String, String[]> map = new HashMap<String, String[]>();
		map.put("id", new String[]{"123456"});
		map.put("tUser.name", new String[]{"a1"});
		map.put("tUser.email", new String[]{"a1@ff.com"});
		map.put("tUser.phone", new String[]{"123"});
		map.put("tUser.password", new String[]{"111"});
		map.put("tUser.registerTime", new String[]{"2010-09-06"});
		map.put("tUsergroup.name", new String[]{"g1"});
		map.put("tUsergroup.explain", new String[]{"aaaaaaaaaaaaaa"});
		map.put("tUser.tUserDetails.surname", new String[]{"哈哈"});
		map.put("tUser.tUserDetails.sex", new String[]{"1"});
		
		AttributeMapping<Test1> attributeMapping = new AttributeMapping<Test1>(Test1.class);
		attributeMapping.setPattern("yyyy-MM-dd");
		Test1 mapping = attributeMapping.mapping(map);
		System.out.println(mapping.gettUser().gettUserDetails().getSurname());
		System.out.println(mapping.gettUser().getRegisterTime());
		System.out.println(mapping.getId());
		
	}
	
}

0
0
分享到:
评论

相关推荐

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    4.5.2 不能为JavaBean属性赋值 4.5.3 获取不到表单中的所有信息 4.6 精彩回顾 第5章 Web应用的缔造者 ——Servlet技术 5.1 本章学习任务 5.1.1 本章知识体系 5.1.2 实例开发任务 5.2 与时俱进——了解Servlet技术 ...

    ASP.NET的网页代码模型及生命周期

    在了解了C#的结构,以及面向对象的概念后,就可以从面向对象的思想开发ASP.NET应用程序。在ASP.NET中,能够使用面向对象的思想和软件开发中的一些思想,例如封装、派生、继承以及高级的设计模式等。本章首先介绍ASP...

    net学习笔记及其他代码应用

    7.请编程遍历页面上所有TextBox控件并给它赋值为string.Empty? 答: foreach (System.Windows.Forms.Control control in this.Controls) { if (control is System.Windows.Forms.TextBox) { System.Windows....

    客户关系管理系统框架搭建(二)

    * 根据路径创建SysUserGroupAction和在action中增加save方法,放置在cn.itcast.crm.web.action包下 public class SysUserGroupAction extends ActionSupport public String save() throws ...

    千方百计笔试题大全

    108、以下哪一个不是赋值符号? 25 109、以下哪个不是Collection的子接口? 25 110、.BufferedReader的父类是以下哪个? 25 112、div与span区别? 25 113、html的框架是什么? 25 114、alert怎样换行? 25 115、什么...

    java面试宝典

    166、如何用JQuery进行表单验证? 39 167、Prototype如何实现页面局部定时刷新? 40 168、Prototype如何为一个Ajax添加一个参数? 40 169、Ajax请求总共有多少种Callback? 41 170、Javascript如何发送一个Ajax请求?...

    archives:一个在成长的前端developer文档库,里面包含了JS、Vue.js、CSS、Node.js、React.js等前端基础知识和技巧库.....

    在线矿场 前端知识 ...ES6 的解构赋值前每次都创建一个对象吗?会加重 GC 的负担吗? CSS干货 css3中filter的各种特效 24种表单input输入框聚焦动画特效 周边 从前端角度看企业软件的研发过程 开发干货 ...

    整理后java开发全套达内学习笔记(含练习)

    instanceof (关键字) 运算符,用于引用变量,以检查这个对象是否是某种类型。返回 boolean 值。 interface (关键字) 接口 ['intәfeis] invoke vt.调用 [in'vәuk]' ( invocation [,invәu'keiʃәn]) Iterator ...

    Delphi5开发人员指南

    9.3 为什么要使用DLL 236 9.3.1 共享代码、资源和数据 236 9.3.2 隐藏实现的细节 237 9.3.3 自定义控件 237 9.4 创建和使用DLL 237 9.4.1 数美分:一个简单的DLL 237 9.4.2 显示DLL中的模式窗体 239 9.5 显示DLL中的...

    Spring攻略(第二版 中文高清版).part2

    8.9 用@Value在控制器中赋值 314 8.9.1 问题 314 8.9.2 解决方案 314 8.9.3 工作原理 314 8.10 用控制器处理表单 316 8.10.1 问题 316 8.10.2 解决方案 316 8.10.3 工作原理 317 8.11 用向导表单...

    Spring攻略(第二版 中文高清版).part1

    8.9 用@Value在控制器中赋值 314 8.9.1 问题 314 8.9.2 解决方案 314 8.9.3 工作原理 314 8.10 用控制器处理表单 316 8.10.1 问题 316 8.10.2 解决方案 316 8.10.3 工作原理 317 8.11 用向导表单...

    Java范例开发大全 (源程序)

     实例14 判断输入的年份是否为闰年 26  实例15 抽奖活动 27  3.2 for语句 28  实例16 小九九乘法表 28  实例17 如何列出素数 29  实例18 Java中的递归 31  实例19 男生女生各多少人 32  实例20 求...

    java范例开发大全(pdf&源码)

    实例14 判断输入的年份是否为闰年 26 实例15 抽奖活动 27 3.2 for语句 28 实例16 小九九乘法表 28 实例17 如何列出素数 29 实例18 Java中的递归 31 实例19 男生女生各多少人 32 实例20 求水仙花数 34 实例21 求任意...

    java范例开发大全源代码

     实例14 判断输入的年份是否为闰年 26  实例15 抽奖活动 27  3.2 for语句 28  实例16 小九九乘法表 28  实例17 如何列出素数 29  实例18 Java中的递归 31  实例19 男生女生各多少人 32  实例...

    java范例开发大全

    实例14 判断输入的年份是否为闰年 26 实例15 抽奖活动 27 3.2 for语句 28 实例16 小九九乘法表 28 实例17 如何列出素数 29 实例18 Java中的递归 31 实例19 男生女生各多少人 32 实例20 求水仙花数 34 实例21 求任意...

    Java范例开发大全(全书源程序)

    实例14 判断输入的年份是否为闰年 26 实例15 抽奖活动 27 3.2 for语句 28 实例16 小九九乘法表 28 实例17 如何列出素数 29 实例18 Java中的递归 31 实例19 男生女生各多少人 32 实例20 求水仙花数 34 实例21...

Global site tag (gtag.js) - Google Analytics