如何通过索引在表单中访问会话ArrayList?

时间:2012-09-01 20:07:48

标签: forms session struts2 arraylist

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

这是我在JSP页面上尝试过的(我使用struts2 Framework):

<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 具有相同的尺寸。

我想我错误地迭代它,但在我的情况下,通过索引迭代它是一种义务。 非常感谢你提前:))

1 个答案:

答案 0 :(得分:1)

您需要通过操作访问会话,会话可以通过jsp访问,但不能直接从外部访问。

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

修改

假设您的动作中有一个名为“matrix”的StringList的ArrayList,您可以通过以下方式迭代属性:

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

外部迭代器迭代“matrix”,将每个实例推送到值堆栈的顶部。内部迭代器将使用默认情况下堆栈顶部的内容与属性标记相同。将tr和td元素放置在正确的位置,您可以渲染表格。

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