日期:2014-05-17  浏览次数:20803 次

jsp中提交list问题
我action的作用域是session
我action定义了一个List<Test> testList;
现在的问题是我想通过JSP操作testList,对它进行增删改等等,
JSP:

<table>
<tr>
<td>
<input type="text" name="testList[0].name" value="name1"/>
<input type="text" name="testList[0].type" value="type1"/>
</td>
<td>
<input type="text" name="testList[1].name" value="name2"/>
<input type="text" name="testList[1].type" value="type2"/>
</td>
<td>
<input type="text" name="testList[2].name" value="name3"/>
<input type="text" name="testList[2].type" value="type3"/>
</td>
<td>
<input type="text" name="testList[3].name" value="name4"/>
<input type="text" name="testList[3].type" value="type4"/>
</td>
<td>
<input type="text" name="testList[4].name" value="name5"/>
<input type="text" name="testList[4].type" value="type5"/>
</td>
</tr>
</table>

我的想法是如果我action中listTest.size() = 5时,
我在页面通过js来删除掉第三行记录,并且把table中listTest重新顺番了,
form提交后,理论上应该listTest.size()=4,
可是结果listTest.size() = 5,而且我看了listTest的值:
name1,type1
name2,type2
name4,type4
name5,type5
name5,type5
也就是说listTest前4项被替换了,第五项还是保存在其中。

我的问题来了,如何将listTest第五项清除掉?我不
jsp list

------解决方案--------------------
楼主用js删掉第三行的时候后面的input的name的testList角标是否没有减一。例如你将testList[2]角标2的这行都删了后面的角标依旧是testList[3] testList[4]这样的话当然size还是5因为struts2会根据ognl进行赋值的你角标最大是多少就是list的最大索引,如果楼主testList的角标都是按顺序的,楼主可以在js里面删掉某一行的时候。把input里面name属性中testList角标最大的那个角标再替换成删除掉的那行角标这样就等于把最大的替换成删除掉的那个位置。按楼主这个把testList[2]的删除掉把input的name中testList[4]的替换成testList[2]这样最大的角标就变成testList[3]了,struts2赋值的时候就只有4个这样size就是4了
------解决方案--------------------
引用:
Quote: 引用:

这种问题由于Structs的Action在使用单利模式的设计缺陷
在项目中如果使用到了Structs框架,我一般都会禁止Action使用单利,所以都会在Spring中将其scope设置为prototype,这样就不会出现你上述的问题

谢谢你的回复。
我上面说了,我的scope=session
我如果改了scope=prototype的话,页面其他的东西可能就用不了了。

抱歉,如果作用于是session级别的有两种办法:
1. JS剔除HTML代码时,生成一个隐藏的被剔除的记录id,提交后校验list并剔除
2. 在Action中维护一个零时list,接收表单数据,提价后清楚原list,将新的list给他