/**
* 普通的写法,如:
* <tb:code type="CODE_DevJobGrade" name="criterionForm" required="true" property="criterions.jobGrade" elementWidth="150" value="0"/>
* <tb:code type="CODE_DevJobGrade" name="criterionForm" required="true" property="criterions.jobGrade" elementWidth="150" value="0"/>
* 其中的两个 property="criterions.jobGrade" 会被struct解释为属性criterions的字符串JobGrade数组。<br/>
* 但是有些时候会需要解释为criterions的数组,值保持到criterion[0]的jobGrade属性中.
* so here it is.
* @param form
* @param request
* @return
* @author hite
* @throws NoSuchMethodException
* @throws InvocationTargetException
* @throws IllegalAccessException
* @throws InstantiationException
* @throws SecurityException
* @throws IllegalArgumentException
* @date 2009-12-21下午02:16:03
* @since 1.0.0
*/
public static boolean lazyPopulateForm(ActionForm form, HttpServletRequest request) throws IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException{
//先循环反射,再循环变量
//HiteFix 应该做出迭代的
HashMap args = new HashMap();
for (Enumeration e = request.getParameterNames();e.hasMoreElements();){
String key = (String)e.nextElement();
String[] keys =key.split("\\.");
if (keys.length>1) {
if (args.containsKey(keys[0])) {
List kv = (List) args.get(keys[0]);
kv.add(keys[1]);
args.put(keys[0],kv);
} else {
List kv = new ArrayList();
kv.add(keys[1]);
args.put(keys[0],kv);
}
}
}
Class c=form.getClass();
Field []fs=c.getDeclaredFields();
for(int i=0;i<fs.length;i++){
Field f=fs[i];
String voArrayName = f.getName();
if(args.containsKey(voArrayName)){
f.setAccessible(true);
Class type = f.get(form).getClass();
if(type.isArray()){
List subArgs = (List)args.get(voArrayName);
if(subArgs.size()>0){
Class componentType = type.getComponentType();
String[] values = request.getParameterValues(voArrayName+"."+subArgs.get(0).toString());
//VO Array
Object[] filledArray = (Object[])Array.newInstance(componentType, values.length);
//TODO to VO
for (int k = 0; k < filledArray.length; k++) {
Object singleVO = filledArray[k];
if (singleVO == null) {
singleVO = componentType.getConstructor(null).newInstance(null);
}
Field[] svFields = singleVO.getClass().getDeclaredFields();
for (int j = 0; j < svFields.length; j++) {
Field svField = svFields[j];
String svFieldName = svField.getName();
if (subArgs.contains(svFieldName)) {
svField.setAccessible(true);
Method method;
String currentArgValue = request.getParameterValues(voArrayName + "." + svFieldName)[k];
if (currentArgValue.length()>0) {//not fill if null or empty
try {
Object svFieldValue = svField.get(singleVO);
if (svFieldValue == null) {
method = svField.getType().getMethod("getInstance", new Class[] { java.lang.String.class });
svFieldValue = method.invoke(singleVO, currentArgValue);
}
if (svFieldValue instanceof CodeType) {
svField.set(singleVO, svFieldValue);
}
} catch (NoSuchMethodException e2) {
if (svField.getType() == java.lang.String.class) {
svField.set(singleVO, currentArgValue);
} else if (svField.getType() == java.lang.Long.class) {
svField.set(singleVO, Long.parseLong(currentArgValue));
}
}
}
}
}
//finish filling a piece of vo
filledArray[k] = singleVO;
}
//finish filling a group of VOs
f.set(form, filledArray);
}
}
}
}
return false;
}
1. 目前做的只适合两级如
" property = 'criterion.grade' "
2. 参数也只有2个是servlet的,打算以后重构
3. 里面只考虑到有线的自定义类型和string别的没加
4. 代码意思,基本上可以看 变量命名就能看懂。
分享到:
相关推荐
Julia包懒惰地表示填充有单个条目的矩阵,以及标识矩阵。 这个包导出以下类型: Eye , Fill , Ones , Zeros , Trues和Falses 。 该软件包的主要目的是提供一种构造矩阵的统一方法。 例如,要构建全零的5 ...
完整版懒惰的窗口.rar
狼的自述: 我是狼,为了生存,我要去捕食,我还要照顾我的孩子们,因为它们都还太小,没有捕食的本领,所以,我就要捕获更多的食物,这就需要勤,要远离懒惰.
《懒惰的智慧》课件.ppt
我终于战胜了懒惰250.doc
本书针对年轻人身上普遍存在的“懒惰”问题,深入分析了懒惰的表现和成因,并给出了对策。书中穿插有心理测验和分析,能够使读者在自我检测的基础上“对症下药”,先找出自身问题所在,再有针对性地予以解决,具有很...
大班体育游戏小公鸡和懒惰虫.doc
大班社会优秀教案《懒惰虫和勤快人》润新教育.txt
在多标记学习框架下的一种多标记懒惰学习算法,算法利用了蕴含于其他概念类中的信息,充分考察了样本多个标记之间的相关性
懒惰怎么办.doc
易语言懒惰的窗口源码,懒惰的窗口,下落窗口,取窗口信息索引,GetForegroundWindow,MoveWindow,GetWindowRect,GetSystemMetrics
基于java的开发源码-懒惰者代码生成器 IdlerCodeGenerator.zip 基于java的开发源码-懒惰者代码生成器 IdlerCodeGenerator.zip 基于java的开发源码-懒惰者代码生成器 IdlerCodeGenerator.zip 基于java的开发源码-懒惰...
科技真的会让人累懒惰吗.docx
大班音乐优质课教案《勤快人和懒惰人》润新教育.txt
每日英语名言-懒惰就像一把锁,锁住了知识的仓库,使你的智力变得.doc
已通过编译,可运行
UIScroView 3倍的contentSize,左右Scroll时,懒惰添加左右的View
ipynb源文件,KNN(K-Nearest Neighbor)实现对鸢尾花数据集的分类!!
懒惰者代码生成器 IdlerCodeGenerator
懒惰的狐狸作文.doc