使用 Struts 2 标签时,新变量究竟位于何处?
Where exactly are new variables located when using Struts 2 tags?
我正在学习使用 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
标签时。例如,我有一个动作 class,其中包含一个名为 usersList
的 属性(这是一个 Java List
)。然后我想在我的 JSP 页面中调用该操作:
<s:action name="nameAction" namespace="/" var="actionVar" />
应该将该操作对象放置在 ValueStack
的顶部。但是,当我想遍历动作对象中的 userList
属性 时,我还需要指定代表动作的变量名称,前面有 #
,如下所示:
<s:iterator value="#actionVar.userList">
...
</s:iterator>
所以,我不知道动作对象到底放在哪里或者我的错误是什么?
感谢您的建议。
当您像以前那样关闭 <action>
标签时:
<s:action name="nameAction" namespace="/" var="actionVar" />
操作不再在堆栈上,而是存储在值堆栈中 "context"(不是在堆栈本身上,而是在堆栈的上下文中命名)。如果您想访问操作的属性而不必存储它,那么您可以像其他任何东西一样嵌套它,将其视为 <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.
访问操作属性
我正在学习使用 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
标签时。例如,我有一个动作 class,其中包含一个名为 usersList
的 属性(这是一个 Java List
)。然后我想在我的 JSP 页面中调用该操作:
<s:action name="nameAction" namespace="/" var="actionVar" />
应该将该操作对象放置在 ValueStack
的顶部。但是,当我想遍历动作对象中的 userList
属性 时,我还需要指定代表动作的变量名称,前面有 #
,如下所示:
<s:iterator value="#actionVar.userList">
...
</s:iterator>
所以,我不知道动作对象到底放在哪里或者我的错误是什么?
感谢您的建议。
当您像以前那样关闭 <action>
标签时:
<s:action name="nameAction" namespace="/" var="actionVar" />
操作不再在堆栈上,而是存储在值堆栈中 "context"(不是在堆栈本身上,而是在堆栈的上下文中命名)。如果您想访问操作的属性而不必存储它,那么您可以像其他任何东西一样嵌套它,将其视为 <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.