1

我可以在不使用会话的情况下在 Struts2 中跨操作保留对象吗?

我正在研究一个 Struts2 项目,并且好奇是否有一些方法可以在动作结束后保留​​对象值。

我想做的是:

  1. 调用操作以从上传的文件中读取并将其内容准备为对象列表。
  2. 然后我将列表显示为用户的示例。
  3. 然后用户可以点击提交按钮来调用一个动作来处理从第一个动作创建的列表。

通常,一旦操作结束,列表就会丢失。所以,我必须将列表存储为一个会话,但我认为它应该有一些更好的方法来实现我正在研究的目标。

4

2 回答 2

2

如果您想跨请求保留数据,则会话是这样做的正常机制。

如果您不使用会话,则需要基本上复制其功能以维护与当前用户/会话关联的数据。

于 2013-01-12T06:07:54.720 回答
1

如果你需要保存List,那么你必须使用Session。

但是如果你(如果我理解你的问题)只需要通过

ActionOne(创建列表)->

JSPOne(向用户显示列表)->

ACtionTwo(从 JSPOne 接收列表并与之做一些交易)

,而不必担心用户可以更改 List 客户端这一事实(例如使用 FireBug 操作网页),那么您就不需要会话。

您只需要在 ActionOne 和 ActionTwo 上声明 List 对象(使用 getter 和 setter,至少 ActionOne 上的 getter 和 ActionTwo 上的 setter),并在nameJSP 标记的属性中包含 List 名称和索引。如果您只是绘制它(例如使用<s:property/>标签),而不是使用一些将发布值的标签,例如<s:textfield />,那么只需使用 an<s:hidden />来发布 te 值。

例如,如果您有:

List<MyObject> myList //with getters and setters

并假设 MyObject 具有idvalue字段(带有 getter 和 setter),

在 JSP 中而不是

<s:iterator value="myList" >
   <s:property value="id"/>
   <s:textfield name="value"/>
</s:iterator>

采用

<s:iterator value="myList" status="ctr" >
   <s:hidden name="myList[#ctr.index].id" value="id"/>
   <s:property value="id"/> <!-- no need here, you won't post this -->
   <s:textfield name="myList[#ctr.index].value" value="value" />
</s:iterator>

您最终将通过访问者验证器验证这样的列表(在完成所有其余部分后,将来会出现 :)

享受

于 2013-01-12T15:23:18.607 回答