我正在学习如何使用Struts 2标记,并且我对使用这些标记时存储的新变量的位置有一些疑问。例如,当我想在action作用域中创建一个新变量时,如下所示:
<s:set var="newVar" value="'This is a new string'" />然后,我想得到这个新变量的值,我可以使用以下两种方法:
<s:property value="#newVar"/>而且还
<s:property value="newVar"/>这让我很困惑,因为我不知道这个新变量存储在哪里。第一个property标记使我认为它存储在操作上下文映射中,但在ValueStack之外,而第二个property标记使我认为它存储为动作对象中的一个新属性,该属性位于ValueStack的顶部(在访问它的一个属性时不需要指定它的名称).我甚至认为,也许标签的属性var中给出的变量名允许您直接访问变量.但是,我尝试设置另一个变量,这次是在会话范围中,如下所示:
<s:set var="sessionVar" scope="session" value="'Another string'">但我唯一能获得它的价值的方法是:
<s:property value="#session.sessionVar"/>但不是通过:
<s:property value="sessionVar">因此,我放弃了这样一种想法,即变量的名称允许您立即访问变量。
另一个疑问是,当我使用Struts 2的action标记时。例如,我有一个动作类,它包含一个名为usersList的属性(它是List)。然后,我想在JSP页面中使用以下方法调用该操作:
<s:action name="nameAction" namespace="/" var="actionVar" />它应该将动作对象放置在ValueStack的顶部。但是,当我想在action对象中的userList属性上迭代时,我还需要指定变量的名称,该变量表示前面有#的操作,如下所示:
<s:iterator value="#actionVar.userList">
...
</s:iterator>所以,我不知道具体的动作对象放在哪里,或者我的错误是什么?
谢谢你的建议。
发布于 2015-03-06 14:25:41
当您像以前一样关闭<action>标记时:
<s:action name="nameAction" namespace="/" var="actionVar" />操作不再存储在堆栈上,而是存储在值堆栈"context“中(不是在堆栈本身上,而是在堆栈的上下文中命名)。如果您想要访问该操作的属性而不必存储它,那么您可以像其他任何东西一样嵌套它,把它看作是<s:push>
<s:action name="nameAction" namespace="/">
<s:property value="userList"/>
</s:action>国际海事组织的<s:action>标签导致了意大利面代码,这是很难解释的。
对于某些变量(但不是所有变量)来说,当#成为可选变量时,关于什么时候需要它的混淆就变得更加复杂了。我忘记了哪个版本,在2.1或2.2 IIRC的某个地方。它没有存储在操作中;您不能从视图中更改操作的结构。
<s:property>不自动搜索servlet上下文作用域。但是,您可以使用简单的旧JSP来访问这些东西,例如${sessionVar}。由于使用了S2请求包装器,您还可以通过JSP访问操作属性。
https://stackoverflow.com/questions/28899279
复制相似问题