使用 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.

访问操作属性