Struts中form的对象数组

本文探讨了在Struts框架中如何实现复杂对象数组的注入,并解决了在实际开发过程中遇到的问题,包括对象命名规范、属性大小写敏感及nullpointer异常等问题。

有以下的一个form类,它有3个属性,2个是javaBean,还有一个是javaBean的数组

 

  1. public class PrmMainType extends ActionForm{
  2.     private PlyCalVhlType plyCalVhlType;
  3.     private PlyRdrType[] plyRdrType;
  4.     private PlyFrcVhlType plyFrcVhlType;
  5.     public PlyCalVhlType getPlyCalVhlType() {
  6.         return plyCalVhlType;
  7.     }
  8.     public void setPlyCalVhlType(PlyCalVhlType plyCalVhlType) {
  9.         this.plyCalVhlType = plyCalVhlType;
  10.     }
  11.     public PlyRdrType[] getPlyRdrType() {
  12.         return plyRdrType;
  13.     }
  14.     public void setPlyRdrType(PlyRdrType[] plyRdrType) {
  15.         this.plyRdrType = plyRdrType;
  16.     }
  17.     public PlyFrcVhlType getPlyFrcVhlType() {
  18.         return plyFrcVhlType;
  19.     }
  20.     public void setPlyFrcVhlType(PlyFrcVhlType plyFrcVhlType) {
  21.         this.plyFrcVhlType = plyFrcVhlType;
  22.     } 
  23. }

现在有一个需求就是要把页面的值注入到form中去,在开发的过程中遇到了很多意想不到的事:

首先没有使用过复杂对象数组注值,原来都是使用String数组,只要在页面使用相同的名字在后台就会获得String数组。而对于上面的这种情况则需要使用plyRdrType[0].SNclmDesc这种形式了

 

  1. <input type="checkbox" name="plyRdrType[0].SNclmDesc" value="Y">

这个地方碰到了2个问题plyRdrType对象的类型原本不是这样定义的是非规范定义:

  1. private _plyRdrType[] plyRdrType;

这在Struts中好像是不允许的:你必需按照骆驼峰的方式进行规范命名,否则你将自食其果。

不知道你们注意到上面的input中SNclmDesc的第一个字母是大写的没,其实在vo中是sNclmDesc。用小写的时候你会发现下面的异常(用nested标签的时候)或者你会发现其它的都取到值了而这个属性没有:

  1. PrmMainType has no property defined by "plyRdrType[0].sNclmDesc"

如果你还有以d打头命名的属性时也会遇到上面的问题,改成大写的就可以了。

 

 

以上的是页面方面遇到的问题,这个时候提交的话是不会出现你所期望的结果的,它会无情的给你抛出一个nullpoint exception,

为什么?没有进行初始化。为什么?我也不清楚。。。。

只要在PrmMainType中加入下面的代码就可以了:

 

  1.     public void reset(ActionMapping mapping, HttpServletRequest request) {
  2.         String plyRdrTypeLs=request.getParameter("plyRdrTypeLength");
  3.         int plyRdrTypeLength=(new Integer(plyRdrTypeLs)).intValue();
  4.         plyRdrType=new PlyRdrType[plyRdrTypeLength];
  5.         plyCalVhlType=new PlyCalVhlType();
  6.         for(int i=0;i<plyRdrTypeLength;i++){
  7.             plyRdrType[i]=new PlyRdrType();
  8.         }
  9.         plyFrcVhlType=new PlyFrcVhlType();
  10.     }

plyRdrTypeLength是页面中的一个hidden属性,用来定义plyRdrType的长度,由js来控制。

 

贴一段页面代码

 

  1. <form name="prmMainType" method="post" action="<%=request.getContextPath() %>/formArrayAction.do?cmd=getData">
  2.               <input type="hidden" name="plyRdrType[0].FRdrAmt" value="50000">
  3.               <input type="hidden" name="plyRdrType[0].FRdrAmtDes" value="50000">
  4.              <input type="submit" value="提交">
  5.     <input type="hidden" name="plyRdrTypeLength" value="2">
  6. </form>

 

这样基本上就可以了,下面介绍下nested标签。这是一个并不常用的标签,它的一个优点就是可以在页面展示很好的业务逻辑,它允许你按照form中的那种层级关系在页面中进行布局:

  1. <html:form action="/formArrayAction.do?cmd=getData">
  2.               <nested:nest property="plyRdrType[0]">
  3.               <nested:checkbox property="SNclmDesc" value="Y"></nested:checkbox>
  4.               <nested:hidden property="SNclmDescDes" value="Y"></nested:hidden>
  5.               </nested:nest>
  6.         <html:submit>提交</html:submit>
  7. </html:form>

nested标签也可以完成上面的功能,不过有些地方有点麻烦,大家自己去体会吧。

 

最后说一句,Struts之类的框架是为了给大家提供方便的,不能为了使用而使用,当你觉得使用它增加了复杂度的时候可以考虑下其他的方式。

代码转载自:https://pan.quark.cn/s/9cde95ebe57a 横道图,亦称为甘特图,是一种可视化的项目管理手段,用于呈现项目的进度安排和时间框架。 在信息技术领域,特别是在项目执行与软件开发范畴内,横道图被普遍采用来监控作业、配置资源以及保障项目能按时交付。 此类图表借助水平条带图示来标示各个任务的起止时间点,使项目成员与管理者可以明确掌握项目的整体发展状况。 周期表或可指代计算机科学中的“作业调度周期表”或“资源配置周期表”。 在计算机系统中,作业调度是一项核心功能,它规定了哪个进程或线程能够在中央处理器上执行以及执行的具体时长。 周期表有助于系统管理者洞察作业的执行频率和资源使用状况,进而提升系统的运作效能和响应能力。 不仅如此,周期表也可能意指数据处理或研究中的周期性文档,如在金融分析中按期更新的市场信息文档。 在压缩文件“横道图,周期表.zip”内含的“横道图,周期表.doc”文件,很可能是对某个项目或任务管理的详尽阐述,涵盖利用横道图来制定和展示项目的时间进程,以及可能牵涉的周期性作业调度或资源配置情形。 文件或许包含以下部分:1. **项目简介**:阐述项目的目标、范畴、预期成效及参与项目的团队成员。 2. **横道图详述**:具体列出了项目中的各项任务,每个任务的启动与终止时间,以及它们之间的关联性。 横道图通常涵盖关键节点,这些节点是项目中的重要事件,象征重要阶段的实现。 3. **任务配置**:明确了每个任务的责任归属,使项目成员明晰自己的职责和截止日期。 4. **进展更新**:若文件是动态维护的,可能会记录项目的实际进展与计划进展的对比,有助于识别延误并调整计划。 5. **周期表探讨**:深入说明了周期性作业的调度,如定期的会议、报告递交、...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值