项目中采用的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表单的回填。