`
zuzong
  • 浏览: 115010 次
  • 性别: 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
分享到:
评论

相关推荐

    表单为JavaBean赋值

    本教程将详细阐述如何通过表单数据为JavaBean对象赋值,以实现数据的高效管理。 首先,理解JavaBean规范是关键。JavaBean是一种符合特定规范的Java类,它具有属性、构造方法和getter/setter方法,通常用于封装数据...

    asp.net中实体类对象赋值到表单的实现代码

    利用反射技术,可以高效地实现实体类对象与表单之间的赋值操作,尤其是在处理大量数据时显得非常省事。 首先,我们来看反射(Reflection)技术。反射是在运行时获取程序集信息、加载和实例化类型以及调用其成员(如...

    Servlet中对获取网页表单数据自动给JavaBean赋值的BeanUtil工具类

    当用户通过网页表单提交数据时,Servlet通常负责接收这些数据并将其保存到JavaBean对象中,以便后续业务逻辑处理。为了简化这一过程,开发者经常使用工具类BeanUtil,它能够自动将HTTP请求参数映射到JavaBean的属性...

    表单数据自动封装到javaBean中

    例如,Angular的`ngModel`指令可以将表单字段与模型对象关联,提交时自动转换为JSON发送给服务器。 5. **错误处理**: 自动封装过程中可能会出现数据类型不匹配、必填项缺失等错误。框架通常会提供异常处理机制,...

    jqgrid行编辑+动态为其他列赋值

    2. 在`saveRow`函数中,我们可以获取当前单元格的新值,并根据业务逻辑计算其他列的值。这可能涉及到对服务器的异步请求,以验证或处理数据。 3. 使用jqGrid的`setCell`方法来更新其他列的值。这个方法接受行号、...

    实现多选项赋值功能实现多选项赋值功能

    在IT领域,尤其是在Web开发中,"实现多选项赋值功能"通常指的是处理HTML表单中的复选框(Checkbox)元素。复选框允许用户在多个选项中选择一个或多个,然后将这些选择传递到服务器进行处理。在这个场景中,`check....

    adobe livecycle表单设计器使用说明

    它支持多种表单类型,包括PDF表单和HTML表单,并提供了丰富的工具和组件来满足各种业务需求。此外,该设计器还支持使用内置JavaScript编写逻辑处理脚本,从而增强了表单的动态性和交互性。 #### 三、表单设计流程 #...

    java源码:Java对象验证框架 OVal.zip

    在实际开发中,OVal常用于表单验证、API参数校验、业务对象验证等场景,帮助提升代码质量和用户体验。 总结,Java对象验证框架OVal以其便捷的注解使用、强大的自定义能力、灵活的验证策略和良好的扩展性,成为Java...

    ASP.NET中实现把form表单元素转为实体对象或集合

    在上述帮助类中,使用反射来动态地创建实体类的实例,并且根据表单中的控件名来给对象的属性赋值。 2. **泛型方法的实现**:`RequestToModel`类中的方法使用了泛型(`&lt;T&gt;`),这使得帮助类可以适用于任何实体类型。...

    设置ecology-7流程表单的验证页面customePageSetting

    ecology-7是一款可能的企业流程管理软件,它允许开发者定制工作流和表单,以满足特定业务需求。这里我们将深入理解如何通过`jsp`页面实现JS验证,并涉及相关的编程技巧和最佳实践。 首先,`customePageSetting`是一...

    Vue 一键清空表单的实现方法

    另外,还有一种暴力清除的方式,即直接将`userFormSearch`对象赋值为空对象`{}`,这种方法的使用前提是`userFormSearch`中不包含有默认值的状态字段。如果有默认值状态,则不能使用该方法,因为这会导致默认值也被...

    Yii框架form表单用法实例

    此外,Yii框架还提供了场景(Scenario)的概念,允许在同一模型中根据不同的业务需求设置不同的验证规则。通过在验证规则中指定on参数,可以将规则应用到特定的场景列表中。 在处理表单更新数据时,可能会遇到候选...

    Python-MechanicalSoup一个用于自动与网站交互的Python库

    综上所述,`MechanicalSoup`是Python中一个强大的网页交互库,它极大地简化了与网站的互动,为开发者提供了便利。通过熟练掌握其使用,你可以更高效地实现各种基于Web的任务。如果你正在寻找一个能帮你处理复杂网页...

    javabean基础知识

    这通常是通过JSP内置的`request`对象来实现的,使用`request.getParameter()`方法获取表单字段的值,并将其设置到JavaBean的相应属性中。 3. **读取JavaBean中的属性值**:一旦JavaBean封装了表单数据,就可以通过...

    基于Java的实例源码-制作简单的表单程序(Jsp).zip

    在JSP中,我们可以使用`&lt;jsp:useBean&gt;`标签来创建一个JavaBean对象,这个对象将存储表单数据。接着,我们可以使用`&lt;jsp:setProperty&gt;`标签来设置Bean的属性值,这些值来自于表单的输入字段。 例如,如果我们有一个...

    thinkphp5.1框架模板赋值与变量输出示例

    以及给一个对象赋值: ```php $obj = new stdClass(); $obj-&gt;course = 'PHP'; $obj-&gt;lecture = 'zhang'; $this-&gt;view-&gt;assign('info', $obj); ``` 在模板文件中,我们可以通过定义的模板变量名称来输出变量值,...

    录入一名学生信息1

    这里创建了一个名为stu的对象,可能是自定义的`Student`类,包含与表单字段相对应的属性。例如,`Student`类可能有`name`、`id`、`gender`等属性,我们将对应的表单数据赋值给这些属性。 4. **调用业务层**:封装好...

    Struts1.x.pdf

    2. **创建ActionForm实例**:如果请求中包含了表单数据,但还没有对应的ActionForm实例,那么ActionServlet会创建一个新的ActionForm对象,并将表单数据填充到该对象中。 3. **表单验证**:根据配置信息,如果需要...

    ASP.NET中实现Form表单字段值自动填充到操作模型中

    `AssembleModel&lt;T&gt;`方法则负责创建对象实例、遍历表单参数、匹配属性并赋值。通过这种方式,我们可以在Web Forms中实现类似MVC的自动映射功能,从而简化代码编写,并提升开发效率。 需要注意的是,在实际项目中使用...

    Beanutils.rar

    这对于创建表单对象、持久化模型或者在业务逻辑中传递数据非常有用。 2. **反射调用(Reflection Invocations)**:BeanUtils通过反射机制动态调用setter和getter方法,使得我们可以不关心具体的属性名,只用关心...

Global site tag (gtag.js) - Google Analytics