我正在学习使用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的建议。
答案 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访问操作属性。