2012-09-01 34 views
3

我有一个类型为ArrayList的会话变量。 在jsp页面中,我需要通过索引来访问它以动态创建表单,但是在我提交表单后,我发现会话ArrayList的元素值没有改变。如何通过表单中的索引访问会话ArrayList?

这是我已经尽我JSP页面上(我用Struts2框架):

<s:iterator value="anotherArray" status="RowsIterator"> 
<tr> 
    <td> 
    <s:iterator value="actionOptionsArray" status="iter"> 
    <s:radio 
    name="#session.chosenActionsArray[%{#RowsIterator.index}]" <!-- The concerned line --> 
    list="%{actionOptionsArray[#iter.index]}" 
    value="#{actionOptionsArray[0]}" 
    theme="simple" /> 
    <br> 
    </s:iterator> 
    </td> 
    <!-- other fields--> 
</tr> 
</s:iterator> 

anotherArray#session.chosenActionsArray具有相同的大小。

我想我错了,但在我的情况下,按指数迭代它是一种义务。 非常感谢你提前:) :)

+0

我不认为迭代是你的问题当然没有生成的HTML谁可以说...没有你提交给它的行动是很难创建一个具体的解决方案。 – Quaternion

+0

嗨!谢谢您的回答。那么,我的行动正常,问题不在其中。我的问题是,我不知道如何在窗体中设置“ArrayList的ArrayList”(矩阵)的值。谢谢。 – Angelina

回答

1

你需要通过一个动作访问会话,会话可以从jsp访问,但不能通过这种方式直接从外部世界访问。

让您提交表单以执行SessionAware的操作。我将为ArrayList创建一个getter/setter以及适当的验证,然后通过execute方法将这些值移入会话中。我不喜欢将你的会话直接暴露给外部世界(在你的行动中为会话提供一个setter)......如果你这样做,你需要知道你可能已经让恶意用户访问你的东西可能没有预料到。

编辑

假设你有字符串的ArrayList中的ArrayList中调用的行动“矩阵” ......你可以通过迭代特性:

<s:iterator value="matrix"> 
    <s:iterator> 
    <s:property/> 
    </s:iterator> 
</s:iterator> 

外迭代,迭代“矩阵”,它将每个实例推送到值栈的顶部。默认情况下,内部迭代器将使用堆栈顶部的属性标记。把tr和td元素放在正确的地方,你可以渲染一张桌子。

要为输入元素(可能是隐藏的)生成正确的名称属性,你需要它们的形式为矩阵[i] [j],其中i和j是整数,并且将定义合适的矩阵。正如你所做的那样,使用迭代器的status属性是生成索引的好方法。

+0

我有你的观点,我同意你的看法。但问题是,在我的动作类中,我有一个数组,它在调用一个动作后获取值,但它的寿命很短,当我调用第二个动作时,它显示它已经有0作为一个大小......这就是为什么我想到会话变量。另外,如果我可以在我的ArrayList的jsp页面中为我的ArrayList设置大小,那也是一个解决方案,但我不知道该怎么做......谢谢。 – Angelina

+0

请提供代码,具体比抽象工作要容易得多。您可能会发现在为我们创建合适的演示程序时,如果问题得不到解决,问题就会解决。 – Quaternion