项目中采用的struts 1.3 + Spring 2.6+hibernate 3.2,在jdk1.4环境下开发,在form回填时总要一项一项的去回填每一个属性,实例类的属性少了还好些,如果实体类的属性比较多,那简直是费时费力的活。于是结合java反射reflect部分的一些类的用法实现了表单的回填。下面直接贴代码:
package com.adam.dev.utils;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
/**
* @author adam.胡升阳
* 创建日期 2011-7-13
*/
public class FormBackfill2 {
public FormBackfill2() {
super();
}
/**
* 用于将获取对象的各属性值封装为map key-value形式,
* key为对象的属性,value为对象值
* @param obj封装的对象
* @return map
*/
public Map getProperty(Object obj){
Map map = new HashMap();
Class clazz = obj.getClass();
try {
Field[] field = clazz.getDeclaredFields();
for(int i=0;i<field.length;i++){
String propertyName = field[i].getName(); //得到对象的属性名
Method[] method = clazz.getDeclaredMethods();
for(int j=0;j<method.length;j++){
String methodName = method[j].getName(); //得到方法名
if(methodName.startsWith("get")){ //以get开头的方法
Object methodValue = method[j].invoke(obj,null); //new Object[]{}
if(propertyName.toLowerCase().equals(methodName.toLowerCase().replaceAll("get", ""))){
map.put(propertyName, methodValue);
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
/**
* 用于将表单的值回填页面 request范围
* @param request
* @param obj
* @return request
*/
public HttpServletRequest setAttributes2Request(HttpServletRequest request,Object obj){
try{
Map map = this.getProperty(obj);
for(int i=0;i<map.size();i++){
Iterator keyIter = map.keySet().iterator();
while(keyIter.hasNext()){
Object key = keyIter.next();
Object value = map.get(key);
request.setAttribute(key.toString(), value);//回填表单属性值
}
}
}catch(Exception e){
e.printStackTrace();
}
return request;
}
/**
* 用于将表单的值回填页面 session范围
* @param request
* @param obj
* @return
*/
public HttpServletRequest setAttributes2Session(HttpServletRequest request,Object obj){
try{
Map map = this.getProperty(obj);
for(int i=0;i<map.size();i++){
Iterator keyIter = map.keySet().iterator();
while(keyIter.hasNext()){
Object key = keyIter.next();
Object value = map.get(key);
request.getSession().setAttribute(key.toString(), value);//回填表单属性值
}
}
}catch(Exception e){
e.printStackTrace();
}
return request;
}
}
这便是实现form回填的工具类。
在调用的时候,将带值的实体类对象传入便即可回填form表单。仅仅需要简单的两行代码即可,如下所示:
//利用 formBackfill 工具类回填form表单
FormBackfill2 formBackfill2 = new FormBackfill2();
formBackfill2.setAttributes2Request(request, obj);
//formBackfill2.setAttributes2Session(request, obj);
这样就很简单快捷的实现了form表单的回填。