【问题标题】:struts2 - understanding the value stackstruts2 - 理解值栈
【发布时间】:2009-11-26 15:19:50
【问题描述】:

我有一个关于 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 中,我有一个&lt;s:submit method="testMethod" /&gt;,它重定向到一个名为TestAction 的动作类。也就是说,在注册页面,用户点击提交,在RegisterAction的execute方法中,我们将“测试字符串”压栈。然后我们去success.jspsuccess.jsp 有一个提交按钮,可将我们定向到 TestAction#testMethod。在TestAction#testMethod 中,我在RegisterAction#execute 中压入堆栈的值还在吗?我怎么才能得到它?我单步执行了 Eclipse 调试器,但没有看到值。

谢谢。

【问题讨论】:

    标签: java struts2 valuestack


    【解决方案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 在执行时将您的操作添加到值堆栈的顶部。因此,将内容放入值堆栈的常用方法是将值的 getter/setter 添加到 Action 类中。您仍然使用 s:property 标记来访问这些值。

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

    【讨论】:

      【解决方案3】:

      只需定义一个属性,如

      String string1 = "test string";
      

      在你的行动中。

      在jsp中可以直接访问。

      例如

       <s:property value="string1"/>
      

      会打印出来

      “测试字符串”

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          您好,仅供参考

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-05-16
            • 1970-01-01
            • 1970-01-01
            • 2014-01-17
            • 1970-01-01
            相关资源
            最近更新 更多