struts2 - 了解值堆栈

2022-09-03 01:47:37

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

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

我的支柱.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>

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

我的问题是:

1)我如何获得我在堆栈上推送的值?success.jsp

2)假设在我有一个重定向到名为的操作类。换句话说,从注册页面,用户点击提交,并在执行方法中我们将“测试字符串”推送到堆栈上。然后我们转到.有一个提交按钮,可将我们定向到 。在 中,我在堆栈上推送的值是否仍然存在?我怎样才能得到它?我逐步执行了 eclipse 调试器,但看不到该值。success.jsp<s:submit method="testMethod" />TestActionRegisterActionsuccess.jspsuccess.jspTestAction#testMethodTestAction#testMethodRegisterAction#execute

谢谢。


答案 1

好吧,我想通了。

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

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

谢谢。


答案 2

Struts 2 在执行时将您的操作添加到值堆栈的顶部。因此,将内容放在值堆栈上的常用方法是将值的 getters/setter 添加到 Action 类中。您仍使用 s:属性标记来访问值。

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


推荐