17

我有一个关于 struts2 值堆栈的问题。假设我有一个名为 Action 的类RegisterAction,它有一个执行方法,如下所示:

public String execute() {
    ValueStack stack = ActionContext.getContext().getValueStack();
    stack.push(new String("test string"));
    return SUCCESS;
}

我的 struts.xml 看起来像这样:

<struts>
    <package name="default" extends="struts-default">
        <action name="*Register" method="{1}" class="vaannila.RegisterAction">
            <result name="populate">/register.jsp</result>
            <result name="input">/register.jsp</result>
            <result name="success">/success.jsp</result>
        </action>        
        <action name="*Test" method="{1}" class="vaannila.TestAction">
            <result name="test">/test.jsp</result>
            <result name="success">/success2.jsp</result>
        </action>        
    </package>
</struts>

因此,在该类中执行 execute 方法后,控制将流向 success.jsp。

我的问题是:

1)我如何获得我在堆栈中推入的值success.jsp

2)假设success.jsp我有一个<s:submit method="testMethod" />重定向到一个名为的动作类TestAction。也就是说,从注册页面,用户点击提交,在我们的execute方法中,RegisterAction我们将“测试字符串”压入栈中。然后我们去success.jsp。有success.jsp一个提交按钮,指示我们到TestAction#testMethod. 在TestAction#testMethod中,我压入堆栈的值RegisterAction#execute还在吗?我怎么才能得到它?我单步执行了 Eclipse 调试器,但看不到值。

谢谢。

4

5 回答 5

17

好的,我想通了。

1)我发现在值堆栈上获取对象以便我们可以从 jsp 访问它们的方式是这样的:

Map<String, Object> context = new HashMap<String, Object>();
context.put("key", "some object");
context.put("key2", "another object");
ActionContext.getContext().getValueStack().push(context);

换句话说,我们可以在包含我们需要的对象的值堆栈上放置一个 HashMap。然后,在 jsp 中,我们可以像这样访问实际值:

<s:property value="key" />
<s:property value="key2" />

它将查看值堆栈并在我们推送的 HashMap 中找到这些值。

2) 动作类的一个实例只与一个请求相关联。因此,当我们进行另一个动作然后在另一个 jsp 结束时,我们从第一个动作压入值堆栈的东西将不存在,因为另一个动作有它自己的值堆栈。参考:http ://www.manning-sandbox.com/thread.jspa?messageID=93045

如果有任何错误或者有更聪明的方法来做这些事情,你们可以随时纠正我:)。

谢谢。

于 2009-11-27T01:27:31.257 回答
2

Struts 2 在执行时将您的操作添加到值堆栈的顶部。因此,将东西放在值堆栈上的常用方法是将值的 getter/setter 添加到 Action 类中。您仍然使用 s:property 标记来访问这些值。

CRUD 教程:http ://struts.apache.org/2.1.6/docs/crud-demo-i.html

于 2009-11-28T11:35:35.340 回答
2

只需定义一个属性

String string1 = "test string";

在你的行动中。

在jsp中可以直接访问。

例如

 <s:property value="string1"/>

将打印出来

“测试字符串”

于 2012-06-06T16:43:28.613 回答
0

您好,仅供参考

这是使用getValueStack().getContext()有时数据在 .ftl 中不可用的缺点(数据未显示在 line2 中,但它出现在 line1 中)我真的不知道这是为什么。但是使用.getValueStack().set("resDTO",resDTO);问题得到了解决(这两个函数的数据都被填充了)。

 ${resDTO.data} //line 1
var selonload='<@s.property value="resDTO.data" escape="false" />'; //line 2
于 2011-02-16T04:08:08.633 回答
0

通常,正如 Nate 所说,您将在您的操作中使用一个字段,因为该操作始终位于 ValueStack 上。但是,如果您正在编写拦截器代码,这将不起作用,因为在调用模板(JSP/freemarker 等)时拦截器将消失。就像上面所做的那样,您需要在 ValueStack 上放置某种类似 java bean 的对象。

于 2010-03-09T14:36:31.027 回答