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());
}
}
分享到:
相关推荐
本教程将详细阐述如何通过表单数据为JavaBean对象赋值,以实现数据的高效管理。 首先,理解JavaBean规范是关键。JavaBean是一种符合特定规范的Java类,它具有属性、构造方法和getter/setter方法,通常用于封装数据...
利用反射技术,可以高效地实现实体类对象与表单之间的赋值操作,尤其是在处理大量数据时显得非常省事。 首先,我们来看反射(Reflection)技术。反射是在运行时获取程序集信息、加载和实例化类型以及调用其成员(如...
当用户通过网页表单提交数据时,Servlet通常负责接收这些数据并将其保存到JavaBean对象中,以便后续业务逻辑处理。为了简化这一过程,开发者经常使用工具类BeanUtil,它能够自动将HTTP请求参数映射到JavaBean的属性...
例如,Angular的`ngModel`指令可以将表单字段与模型对象关联,提交时自动转换为JSON发送给服务器。 5. **错误处理**: 自动封装过程中可能会出现数据类型不匹配、必填项缺失等错误。框架通常会提供异常处理机制,...
2. 在`saveRow`函数中,我们可以获取当前单元格的新值,并根据业务逻辑计算其他列的值。这可能涉及到对服务器的异步请求,以验证或处理数据。 3. 使用jqGrid的`setCell`方法来更新其他列的值。这个方法接受行号、...
在IT领域,尤其是在Web开发中,"实现多选项赋值功能"通常指的是处理HTML表单中的复选框(Checkbox)元素。复选框允许用户在多个选项中选择一个或多个,然后将这些选择传递到服务器进行处理。在这个场景中,`check....
它支持多种表单类型,包括PDF表单和HTML表单,并提供了丰富的工具和组件来满足各种业务需求。此外,该设计器还支持使用内置JavaScript编写逻辑处理脚本,从而增强了表单的动态性和交互性。 #### 三、表单设计流程 #...
在实际开发中,OVal常用于表单验证、API参数校验、业务对象验证等场景,帮助提升代码质量和用户体验。 总结,Java对象验证框架OVal以其便捷的注解使用、强大的自定义能力、灵活的验证策略和良好的扩展性,成为Java...
在上述帮助类中,使用反射来动态地创建实体类的实例,并且根据表单中的控件名来给对象的属性赋值。 2. **泛型方法的实现**:`RequestToModel`类中的方法使用了泛型(`<T>`),这使得帮助类可以适用于任何实体类型。...
ecology-7是一款可能的企业流程管理软件,它允许开发者定制工作流和表单,以满足特定业务需求。这里我们将深入理解如何通过`jsp`页面实现JS验证,并涉及相关的编程技巧和最佳实践。 首先,`customePageSetting`是一...
另外,还有一种暴力清除的方式,即直接将`userFormSearch`对象赋值为空对象`{}`,这种方法的使用前提是`userFormSearch`中不包含有默认值的状态字段。如果有默认值状态,则不能使用该方法,因为这会导致默认值也被...
此外,Yii框架还提供了场景(Scenario)的概念,允许在同一模型中根据不同的业务需求设置不同的验证规则。通过在验证规则中指定on参数,可以将规则应用到特定的场景列表中。 在处理表单更新数据时,可能会遇到候选...
综上所述,`MechanicalSoup`是Python中一个强大的网页交互库,它极大地简化了与网站的互动,为开发者提供了便利。通过熟练掌握其使用,你可以更高效地实现各种基于Web的任务。如果你正在寻找一个能帮你处理复杂网页...
这通常是通过JSP内置的`request`对象来实现的,使用`request.getParameter()`方法获取表单字段的值,并将其设置到JavaBean的相应属性中。 3. **读取JavaBean中的属性值**:一旦JavaBean封装了表单数据,就可以通过...
在JSP中,我们可以使用`<jsp:useBean>`标签来创建一个JavaBean对象,这个对象将存储表单数据。接着,我们可以使用`<jsp:setProperty>`标签来设置Bean的属性值,这些值来自于表单的输入字段。 例如,如果我们有一个...
以及给一个对象赋值: ```php $obj = new stdClass(); $obj->course = 'PHP'; $obj->lecture = 'zhang'; $this->view->assign('info', $obj); ``` 在模板文件中,我们可以通过定义的模板变量名称来输出变量值,...
这里创建了一个名为stu的对象,可能是自定义的`Student`类,包含与表单字段相对应的属性。例如,`Student`类可能有`name`、`id`、`gender`等属性,我们将对应的表单数据赋值给这些属性。 4. **调用业务层**:封装好...
2. **创建ActionForm实例**:如果请求中包含了表单数据,但还没有对应的ActionForm实例,那么ActionServlet会创建一个新的ActionForm对象,并将表单数据填充到该对象中。 3. **表单验证**:根据配置信息,如果需要...
`AssembleModel<T>`方法则负责创建对象实例、遍历表单参数、匹配属性并赋值。通过这种方式,我们可以在Web Forms中实现类似MVC的自动映射功能,从而简化代码编写,并提升开发效率。 需要注意的是,在实际项目中使用...
这对于创建表单对象、持久化模型或者在业务逻辑中传递数据非常有用。 2. **反射调用(Reflection Invocations)**:BeanUtils通过反射机制动态调用setter和getter方法,使得我们可以不关心具体的属性名,只用关心...