使用Struts 2标签时,新变量到底在哪里?

时间:2015-03-06 12:58:05

标签: java-ee struts2

我正在学习使用Struts 2标签,我对使用其中一些标签时存储的新变量存在疑问。例如,当我想在action范围内创建一个新变量时,如下所示:

<s:set var="newVar" value="'This is a new string'" />

然后我想得到我可以使用的这个新变量的值:

<s:property value="#newVar"/>

以及

<s:property value="newVar"/>

让我感到困惑,因为我无法确定存储此新变量的位置。第一个property标记让我认为它存储在操作上下文映射中,但在{ {1}},第二个ValueStack标记让我认为它存储为动作对象中的新属性,该对象位于property的顶部(其名称不需要是访问其中一个属性时指定)... 我甚至认为,标签的属性ValueStack中给出的变量的名称可能允许您直接访问变量...但后来我尝试设置另一个变量,这次是在会话范围内,就像这样:

var

但我可以访问其值的唯一方法是:

<s:set var="sessionVar" scope="session" value="'Another string'">

但不是:

<s:property value="#session.sessionVar"/>

所以我放弃了变量名称可以让你立即访问变量的想法。

另一种疑问是我使用Struts 2的<s:property value="sessionVar"> 标签。例如,我有一个包含名为action的属性的动作类(它是一个Java usersList)。然后我想在我的JSP页面中调用该操作:

List

应该将该操作对象放在<s:action name="nameAction" namespace="/" var="actionVar" /> 的顶部。但是,当我想迭代操作对象中的ValueStack属性时,我还需要指定代表userList前面的操作的变量的名称,如下所示:

#

所以,我不确切知道动作对象到底在哪里或者我的错误是什么?

Thanx的建议。

1 个答案:

答案 0 :(得分:2)

当您关闭<action>标记时:

<s:action name="nameAction" namespace="/" var="actionVar" />

操作不再在堆栈上,而是存储在值堆栈“上下文”中(不在堆栈本身上,而是在堆栈的上下文中命名)。如果你想要访问动作的属性而不必存储它,那么你就像其他任何东西一样嵌套它,把它想象成<s:push>

<s:action name="nameAction" namespace="/">
  <s:property value="userList"/>
</s:action>

IMO <s:action>标签导致难以推理的意大利面条代码。

当某些变量(而不是所有变量)成为可选项时,关于何时需要#的混淆是复杂的。我忘了在2.1或2.2 IIRC期间的哪个版本。 存储在动作中;你无法从视图中改变动作的结构。

<s:property>不会自动搜索servlet上下文范围。但是,您可以使用普通的旧JSP EL来访问这些内容,例如${sessionVar}。由于S2请求包装器,您还可以通过JSP EL访问操作属性。