Jakarta ee 使用Struts 2标记时,新变量的确切位置是哪里?

Jakarta ee 使用Struts 2标记时,新变量的确切位置是哪里?,jakarta-ee,struts2,Jakarta Ee,Struts2,我正在学习使用Struts 2标记,我对使用这些标记时新变量存储在哪里有些疑问。例如,当我想在操作范围内创建一个新变量时,如下所示: <s:set var="newVar" value="'This is a new string'" /> <s:set var="sessionVar" scope="session" value="'Another string'"> <s:iterator value="#actionVar.userList">

我正在学习使用Struts 2标记,我对使用这些标记时新变量存储在哪里有些疑问。例如,当我想在
操作
范围内创建一个新变量时,如下所示:

<s:set var="newVar" value="'This is a new string'" />
<s:set var="sessionVar" scope="session" value="'Another string'">
<s:iterator value="#actionVar.userList">
    ...
</s:iterator>
但我能获取其价值的唯一方法是:

<s:property value="#session.sessionVar"/>
它应该将动作对象放在
值堆栈的顶部。但是,当我想在action对象中迭代
userList
属性时,我还需要指定表示前面有
#
的操作的变量的名称,如下所示:

<s:set var="newVar" value="'This is a new string'" />
<s:set var="sessionVar" scope="session" value="'Another string'">
<s:iterator value="#actionVar.userList">
    ...
</s:iterator>

...
所以,我不知道动作对象的确切位置,或者我的错误是什么

谢谢你的建议。

当你像那样关闭
标签时:

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

动作不再在堆栈上,而是存储在值堆栈“上下文”中(不在堆栈本身上,而是在堆栈的上下文中命名)。如果您想访问操作的属性而不必存储它,那么您可以像其他任何东西一样嵌套它,可以将其视为


在我看来,
标签会导致难以解释的意大利面代码

当对某些变量(而不是所有变量)设置为可选时,关于何时需要
#
的混淆就更加复杂了。我忘记了哪个版本,在2.1或2.2 IIRC的某个地方。它不存储在动作中;不能从视图中更改操作的结构


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

您在访问这些对象时有任何错误吗?没有,我没有收到任何错误。谢谢您的回复,Dave。是的,正如你所说,行动不在“价值堆栈”中,而是在我所谓的“行动上下文”中,一切都有意义。问题是Struts 2官方文档将var属性称为“用于引用推送到值堆栈中的值的名称”,我认为这是真的,但现在我认为这是不正确的。@Nextor我认为这是误导性的措辞;你能提供一个链接吗?我会试着把它修好。还有一些其他文档需要修复,所以我将把它应用到这项工作中。set标记似乎也是如此:新变量存储在“action context”(或“stack context”)中,而不是“value stack”中,就连Struts 2文档也说是这样。以下是链接:,@Nextor“操作上下文”包含所有内容;值堆栈、范围映射等。
不会“推到值堆栈上”;那是个错误。我将与S2团队的其他成员讨论术语,我们将从这里开始讨论。谢谢你的意见。
<s:action name="nameAction" namespace="/" var="actionVar" />
<s:action name="nameAction" namespace="/">
  <s:property value="userList"/>
</s:action>