struts1.x包含嵌套List的多行提交

olivesoup 2008-02-26 12:20:32
普通的多行提交没任何问题,可现在这个业务比较特殊
一般的多行提交,从一个list中迭代出来,然后再提交回这个list就行了,
现在这个list中还有一个list,假设外面这个list是list1,里面这个list是list2,
在页面显示数据的时候都正常,提交时外面这个list1的数据能够正常提交,里面那个list2就只能提交一部分了
把jsp的一部分发上来吧,外面的叫result,里面的叫list,这两个list的get方法都重写过了

<logic:present name="bodyForm" property="result">
<logic:iterate id="result" name="bodyForm" property="result" indexId="idx">
GROUP CODE:<html:text name="result" property="groupCd" indexed="true" />
<div class="list" id="rsdiv">
<table id="rstbl">
<tr>
<th>名称</th>
<th>年齢</th>
<th>金額</th>
</tr>
<logic:iterate id="list" name="result" property="list">
<tr>
<td>
<html:text name="list" property="name" indexed="true" /><BR>
</td>
<td>
<html:text name="list" property="old" indexed="true" /><BR>
</td>
<td>
<html:text name="list" property="money" indexed="true" /><BR>
</td>
</tr>
</logic:iterate>
</table>
</div>
<html:text name="result" property="muiltMoney" indexed="true" /><BR><BR>
</logic:iterate>
</logic:present>

也就是说第二个<logic:iterate>标签内的不能正常提交,看了一下生成的源码,也大概知道原因,但不清楚该怎么改,源码如下

GROUP CODE:<input type="text" name="result[0].groupCd" value="1">
<div class="list" id="rsdiv">
<table id="rstbl">
<tr>
<th>名称</th>
<th>年齢</th>
<th>金額</th>
</tr>

<tr>
<td>
<input type="text" name="list[0].name" value="name1"><BR>
</td>
<td>
<input type="text" name="list[0].old" value="1"><BR>
</td>
<td>
<input type="text" name="list[0].money" value="101"><BR>
</td>
</tr>

<tr>
<td>
<input type="text" name="list[1].name" value="name7"><BR>
</td>
<td>
<input type="text" name="list[1].old" value="7"><BR>
</td>
<td>
<input type="text" name="list[1].money" value="107"><BR>
</td>
</tr>

<tr>
<td>
<input type="text" name="list[2].name" value="name9"><BR>
</td>
<td>
<input type="text" name="list[2].old" value="9"><BR>
</td>
<td>
<input type="text" name="list[2].money" value="109"><BR>
</td>
</tr>

</table>
</div>
<input type="text" name="result[0].muiltMoney" value="317"><BR><BR>

GROUP CODE:<input type="text" name="result[1].groupCd" value="2">
<div class="list" id="rsdiv">
<table id="rstbl">
<tr>
<th>名称</th>
<th>年齢</th>
<th>金額</th>
</tr>

<tr>
<td>
<input type="text" name="list[0].name" value="name2"><BR>
</td>
<td>
<input type="text" name="list[0].old" value="2"><BR>
</td>
<td>
<input type="text" name="list[0].money" value="102"><BR>
</td>
</tr>

<tr>
<td>
<input type="text" name="list[1].name" value="name8"><BR>
</td>
<td>
<input type="text" name="list[1].old" value="8"><BR>
</td>
<td>
<input type="text" name="list[1].money" value="108"><BR>
</td>
</tr>

<tr>
<td>
<input type="text" name="list[2].name" value="name11"><BR>
</td>
<td>
<input type="text" name="list[2].old" value="11"><BR>
</td>
<td>
<input type="text" name="list[2].money" value="111"><BR>
</td>
</tr>

</table>
</div>
<input type="text" name="result[1].muiltMoney" value="321"><BR><BR>

...................

看源码就清楚了,问题就出在外面的result每迭代一次,里面的list的索引都是0,1,2..这样重新计算的,
提交后,里面的list封装数据,索引一样的数据都会被覆盖,所以只能提交一部分。
请问该如何解决呢,我觉得里面的list应该把外面的result list关联上提交就好了,比如
result[0].list[0].name,result[1].list[0].name...这样索引就具有唯一性了,但还没有找到关联的方法。请您赐教!
...全文
886 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
java_freshman01 2012-08-08
  • 打赏
  • 举报
回复
四年后的今天,我同样遇到了相同的问题,多谢各位大神
bjw211 2011-11-07
  • 打赏
  • 举报
回复
在三年后的今天,我遇到了相同的问题。非常感谢楼主的总结,先拿去用下。不懂的地方再来请教。。
dingjunfeng 2009-11-20
  • 打赏
  • 举报
回复
大有帮助 , 我也在解决嵌套问题
olivesoup 2008-03-27
  • 打赏
  • 举报
回复
问题解决了,我总结一下吧
一开始用普通的struts多行提交机制来解决,就是9楼给的那篇文章里的方法,原理大同小异,
因为以前都是这么做的,没出过什么问题。可是这次遇到嵌套list就是不行,struts无法自动封装
第二层list中的数据,但是发现其实数据都是提交上来了的,只是没能再装回list中去,于是用request.getParameterValues("list[4].money");这种形式将提交上来的数据再手动封装到第二层list中回去,
在后台写双重for循环。可以想像性能比较低下,而且比较繁琐容易出错。但在没办法的情况下,项目要继续,也只好先这样了。

最后看到了15楼xls024朋友的留言,查了一下nested标签的官方文档,发现这是个专门解决迭代,嵌套等问题的标签,
于是全部换成nested标签试了一下,原来这个困扰我多时的问题竟被如此简单的解决了,不得不佩服struts的设计人员。
给出部分jsp代码,可以同我在1楼给出的代码做个比较

<nested:present property="result">
<nested:iterate property="result" indexId="idx">
<nested:hidden property="groupSize" />
GROUP CODE:<nested:text property="groupCd" />
<div class="list" id="rsdiv">
<table id="rstbl">
<tbody>
<tr>
<th>名称</th>
<th>年齢</th>
<th>金額</th>
</tr>
</tbody>
<nested:iterate property="list" indexId="index">
<tbody>
<tr>
<td>
<nested:text property="name" /><BR>
</td>
<td>
<nested:text property="old" /><BR>
</td>
<td>
<nested:text property="money" /><BR>
</td>
</tr>
</tbody>
</nested:iterate>
</table>
</div>
<nested:text property="muiltMoney" /><BR><BR>
</nested:iterate>
</nested:present>


感谢大家的热心帮助,别的朋友再遇到这种问题时希望这篇文章能够给你写启发。

ps:最近一直在忙工作的事,很久没来了,csdn邮件通知我来结贴,匆忙总结一下,不足之处请大家指出
xls024 2008-02-27
  • 打赏
  • 举报
回复
你可以试一下struts1.x中的nested标签 下面是官方文档中的例子
<nested:iterate property="myBeanList" >
<nested:iterate property="myItemList" >
<html:write property="beanListObject/"><br>
</html:iterate>
</html:iterate>
olivesoup 2008-02-27
  • 打赏
  • 举报
回复
To qwe8254:
你给的文章我看了,它那篇只是一个普通的多行提交,没涉及到嵌套list的问题



To liang8305:
我也想把两个list关联起来啊,试过了,EL无法那样关联
liang8305 2008-02-27
  • 打赏
  • 举报
回复
总之想办法把

<logic:iterate id="list${idx}" name="result" property="list">

中的ID和idx关联起来
liang8305 2008-02-27
  • 打赏
  • 举报
回复
<logic:iterate id="list${idx}" name="result" property="list">
<tr>
<td>
<html:text name="list${idx}" property="name" indexed="true" /><BR>
</td>
<td>
<html:text name="list${idx}" property="old" indexed="true" /><BR>
</td>
<td>
<html:text name="list${idx}" property="money" indexed="true" /><BR>
</td>
</tr>
</logic:iterate>


这一层不知道能不能加一个EL表达式
olivesoup 2008-02-27
  • 打赏
  • 举报
回复
To:harston
感谢你的提醒,是我考虑错了,request.getParameterNames()返回的是个枚举
harston 2008-02-27
  • 打赏
  • 举报
回复
request.getParameterNames()你数据得名称有重复啊,当然只有一部分,你这些名字对应得都是一个数组得嘛。
struts得可能不支持嵌套哦。所有你只有获取后自己处理。
麻烦的一笔 2008-02-27
  • 打赏
  • 举报
回复
这个用STRUTS1.X确实比较麻烦,我以前看到有个叫MAX的网友做过
他的BLOG,http://www.blogjava.net/max/category/16130.html你去找下
老紫竹 2008-02-26
  • 打赏
  • 举报
回复
如果你很急,先用JSP标签完成任务再说,我再看看!
还有,索引一样的不会被覆盖,
至少request.getParamegerValues();可以返回一个数组
String[] strs = request.getParameterValues("list[0].name");
if(strs!=null){
for(String str : strs){
System.out.println(str);
}
}
olivesoup 2008-02-26
  • 打赏
  • 举报
回复
用request.getParameterValues可以得到所有的值,但是用request.getParameterNames();却只能得到
一部分名称,就是我说的被提交的那部分
olivesoup 2008-02-26
  • 打赏
  • 举报
回复
确实如紫竹大哥所说,用request.getParameterValues("list[4].money");这样的方法,提交后全都能取到,
可是我想用struts的自动封装为什么就不行,是不是不支持多嵌套的这种多行提交?

另外把我封装数据的结构说一下
bean-->list-->resultBean-->result-->form
补充一下,我说提交后得到了一部分的值,也是特殊处理了一下
正常情况下,数据提交后就只封装到resultBean这一步,里面的list已经装不进去了,
于是我在form中又加了一个list字段,专门用来封装list的数据,这倒是成功了,可惜只能封装一部分,
封装的这一部分也有特点,比如页面上第一组result[0].list.size()=3, 那么把这三条装进去后,
后面第二组的数据只从>3条开始封装,后面都以次类推,只封装>已封装的索引的数据(这表达的不太好)
olivesoup 2008-02-26
  • 打赏
  • 举报
回复
TO:WIN_ANGEL
第二个是嵌到第一个list里的
<logic:iterate id="list" name="result" property="list">
从这句就能看出来,第二个list是从第一个result里取得的

我也想要“对象1.对象2.属性”这种样子,源代码就能看出来,第二个list只是显示成“对象2.属性”

之所以要做成这样是因为在页面上需要对数据分组显示,外面的result list根据groupCd分组,
每组又有多条数据,用里层的list显示
WIN_ANGEL 2008-02-26
  • 打赏
  • 举报
回复
对象1.属性
对象2.属性

对象1.对象2.属性
WIN_ANGEL 2008-02-26
  • 打赏
  • 举报
回复
搞不懂为什么非要弄2个迭代 感觉1个迭代也应该可以做 而且你把第2个list嵌到第一个list里不行么?那样2个list不就有关系了么?你现在这种写法其实2个list是个走各的 并没有联系 所以第2次你再赋值就会把第一次的覆盖掉 建议把第2个list嵌到第一个list里
老紫竹 2008-02-26
  • 打赏
  • 举报
回复
一个表单,字段名字重复很常见,比如选择一个部门的人员,多选。
每个表单Checkbox都叫 EmployeeId , 而 Value 则是每个员工的编号了。
olivesoup 2008-02-26
  • 打赏
  • 举报
回复
对啊,request.getParamegerValues();可以返回一个数组的嘛,
但是如果不是被覆盖那难道就是没提交上来,或是提交丢了?
我再用request.getParamegerValues();看看能取到不

不是很急,但是这周之内应该要解决。

感谢你啊!继续期待!

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧