struts2 - 理解值栈

时间:2009-11-26 15:19:51

标签: java struts2 valuestack

我对struts2值堆栈有疑问。假设我有一个名为RegisterAction的Action类,其执行方法如下:

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的动作类。换句话说,从Register页面,用户单击submit,在RegisterAction的execute方法中,我们在堆栈上推送“test string”。然后我们转到success.jspsuccess.jsp有一个提交按钮,可将我们引导至TestAction#testMethod。在TestAction#testMethod中,我在RegisterAction#execute的堆栈中推送的值是否仍在那里?我怎么才能得到它?我逐步完成了eclipse调试器,但我没有看到它的价值。

感谢。

5 个答案:

答案 0 :(得分:14)

好的,我想出来了。

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

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

感谢。

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

只需定义像

这样的属性
String string1 = "test string";

在你的行动中。

在jsp中你可以直接访问。

e.g

 <s:property value="string1"/>

将打印出来

  

“测试字符串”

答案 3 :(得分:0)

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

答案 4 :(得分:0)

嗨,仅供参考

这是使用getValueStack().getContext()的缺点,有时数据在.ftl中不可用(数据没有显示在第2行,但它在第1行中出现)我真的不知道原因。但是使用.getValueStack().set("resDTO",resDTO);问题已经解决了(数据正在为这两个函数填充)。

 ${resDTO.data} //line 1
var selonload='<@s.property value="resDTO.data" escape="false" />'; //line 2