`
hite
  • 浏览: 51782 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

懒惰型(左优先)的from表单填充(相对于struts的右优先填充)

阅读更多

 

	/**
	 * 普通的写法,如:
	 * <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.  代码意思,基本上可以看 变量命名就能看懂。

 

 

 

分享到:
评论
4 楼 hite 2009-12-23  
humaeks 写道
瞄了一下。发现好长的一个方法,在我的1440分辨率正常字体大小下还换行了,能不能编辑一下,不然还真的读不懂。

偷懒了。嗨嗨
3 楼 humaeks 2009-12-23  
瞄了一下。发现好长的一个方法,在我的1440分辨率正常字体大小下还换行了,能不能编辑一下,不然还真的读不懂。
2 楼 yunfengw 2009-12-22  
看看  呵呵 学习学习
1 楼 yunfengw 2009-12-22  
1wwwwwwwwwwwwwwww

相关推荐

    完整版懒惰的窗口.rar

    标题中的“懒惰的窗口”可能是指一个软件或者应用程序,可能是专门为提高用户工作效率而设计的。这个软件可能具有自动化任务、批量处理、定时执行等功能,从而帮助用户减轻工作负担,节省时间,让用户能够更“懒惰”...

    FillArrays.jl:Julia包,用于懒惰地表示用单个条目填充的矩阵

    Julia包懒惰地表示填充有单个条目的矩阵,以及标识矩阵。 这个包导出以下类型: Eye , Fill , Ones , Zeros , Trues和Falses 。 该软件包的主要目的是提供一种构造矩阵的统一方法。 例如,要构建全零的5 ...

    远离懒惰——学习狼的精神

    ### 远离懒惰——学习狼的精神 在自然界中,狼是一种充满智慧与坚韧精神的生物,它们在恶劣环境中生存并繁衍后代的能力令人钦佩。本文将通过狼的生存哲学来探讨“远离懒惰”的重要性,并进一步阐述如何通过学习狼的...

    《懒惰的智慧》课件.ppt

    《懒惰的智慧》这篇课件的核心观点是挑战传统对懒惰的认知,它指出懒惰在某种程度上推动了人类的进步和发明。作者认为,正是由于人们想要避免劳累和单调乏味的工作,才激发了创新的欲望,从而促进了科技的发展。 在...

    一种新型多标记懒惰学习算法

    《一种新型多标记懒惰学习算法》探讨的主题是机器学习领域的一个重要分支——多标记学习。多标记学习是指一个样本可以同时属于多个类别的情况,这与传统的二分类或多分类问题有所不同。在这种学习环境中,每个样本...

    20多岁,不要再懒惰

    ### 20多岁,不要再懒惰 —— 深度解析及应对策略 #### 一、懒惰表现与成因分析 ##### (一)懒惰基因:三分钟热度 **1. 表现** - **兴趣广泛,缺乏专注**:这类人往往拥有众多兴趣爱好,但在每个领域都无法深耕...

    我终于战胜了懒惰250.doc

    我终于战胜了懒惰250.doc

    《懒惰的智慧》.ppt

    这与懒惰的智慧相呼应,表明我们应积极利用大脑的潜力,而不是简单地依赖体力劳动。 综上所述,《懒惰的智慧》提醒我们,人类社会的许多进步源于对舒适和效率的追求,这种追求往往源自于"懒惰"的心态。懒惰并非消极...

    懒惰学习-K近邻.zip

    在机器学习领域,"懒惰学习"是一种策略,其中模型不会尝试去记住训练数据,而是保存数据并延迟学习直到预测阶段。"K近邻"(K-Nearest Neighbor,简称KNN)是懒惰学习的一个典型代表。KNN算法基于实例的学习,用于...

    大班体育游戏小公鸡和懒惰虫.doc

    大班体育游戏小公鸡和懒惰虫.doc

    大班社会优秀教案《懒惰虫和勤快人》润新教育.txt

    大班社会优秀教案《懒惰虫和勤快人》润新教育.txt

    科技真的会让人累懒惰吗.docx

    标题“科技真的会让人累懒惰吗”引发了对现代科技影响的深度思考。在这个日新月异的时代,科技无疑极大地改变了我们的生活方式,提高了效率,带来了前所未有的便利。然而,这是否意味着科技导致了人类的惰性,是我们...

    懒惰怎么办.doc

    懒惰怎么办.doc

    小班艺术活动 《懒惰虫》.doc

    综上所述,这个小班艺术活动《懒惰虫》通过游戏和歌唱相结合的方式,不仅让幼儿在轻松的环境中学习新歌,理解歌曲的意义,还培养了他们的音乐感知力和社交技能,同时也寓教于乐,教导孩子们勤劳的品质,对幼儿的全面...

    易语言懒惰的窗口

    易语言懒惰的窗口源码,懒惰的窗口,下落窗口,取窗口信息索引,GetForegroundWindow,MoveWindow,GetWindowRect,GetSystemMetrics

    基于java的开发源码-懒惰者代码生成器 IdlerCodeGenerator.zip

    基于java的开发源码-懒惰者代码生成器 IdlerCodeGenerator.zip 基于java的开发源码-懒惰者代码生成器 IdlerCodeGenerator.zip 基于java的开发源码-懒惰者代码生成器 IdlerCodeGenerator.zip 基于java的开发源码-懒惰...

    Health_ Laziness 健康:懒惰.pdf

    标题和描述中提到的"Health_ Laziness 健康:懒惰.pdf"是一份讨论健康与懒惰关系的文档,可能包含关于懒惰对身体和生活的影响、懒惰的行为表现以及如何克服懒惰的建议等内容。虽然标签部分为空,但我们可以从部分...

    通过懒惰编译动态导入来提升webpack启动时间

    总之,通过懒惰编译和动态导入,我们可以显著提升Webpack的启动时间,特别是对于大型项目或者有大量动态加载需求的应用来说,这种优化策略显得尤为重要。`lazy-compile-webpack-plugin-master`这样的插件则提供了更...

    大班音乐优质课教案《勤快人和懒惰人》润新教育.txt

    大班音乐优质课教案《勤快人和懒惰人》润新教育.txt

    懒惰者代码生成器 IdlerCodeGenerator.7z

    《懒惰者代码生成器:IdlerCodeGenerator的探索与应用》 在编程领域,效率是程序员们追求的重要目标之一。面对重复性的工作,如何快速有效地完成任务,成为了许多开发者关注的问题。"懒惰者代码生成器...

Global site tag (gtag.js) - Google Analytics