【问题标题】:Struts2- Persistence of objects values between different actions in the same Action classStruts2- 同一动作类中不同动作之间对象值的持久性
【发布时间】:2013-09-18 13:31:15
【问题描述】:

场景:单击Submit 按钮后,我将XML 解组为Java,然后显示Java 对象(创建了一个formbean 并将JAXB java 对象映射到这个formbean - PolicyForm并使用这个formbean在JSP中显示)在JSP中。这工作正常。

问题:我在同一页面上多了一个按钮 -Calculate,与 Submit 按钮的形式相同。单击“计算”按钮时,我需要获取在单击 Submit 按钮期间未编组的 acordform 值。在这里,我无法获取acordform 值,而是获取acordform 的新对象。

当我用谷歌搜索时,我看到 - Struts 2 没有线程安全问题,因为“为每个请求实例化了 Action 对象”。

当我再次发送请求时,请让我知道 Action 对象 - acordform 每次都被实例化?如果是,我该如何避免这种情况?因为即使在下一个请求中我也需要acordformobject 值。

动作类:

public class RateAction extends ActionSupport implements
        ServletRequestAware,SessionAware {

    /* ... */

    // ACORD xml form bean
    private ACORD acordform = new ACORD();

    //To display the values in the JSP
    private PolicyForm policyForm;

    public ACORD getAcordform() {
        return acordform;
    }

    public void setAcordform(ACORD acordform) {
        this.acordform = acordform;
    }

    public String doSubmit() {
       /*...Unmatshalling from XML to Java -acordform is done..*/
    }

    public String doRateSubmimt() 
    {
       /*..trying to get the acordform values which are being set 
         previously in doSubmit() method...*/
    }
}

Strust.xml:

<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<constant name="struts.custom.i18n.resources" value="ApplicationResources" />
<package name="default" extends="struts-default" namespace="/" >

    <action name="fileUploadAction"
        class="com.main.common.action.RateAction" >
        <interceptor-ref name="fileUpload">
            <param name="allowedTypes">text/xml</param>
        </interceptor-ref>
        <interceptor-ref name="defaultStack"></interceptor-ref>
             <interceptor-ref name="params"/>   
             <interceptor-ref name="prepare"/>   
             <interceptor-ref name="basicStack"/> 
         <result name="success">First.jsp</result>
         <result name="input">First.jsp</result>
    </action>

    <action name="submitAction" class="com.main.common.action.RateAction" method="doSubmit">
    <result name="success">First.jsp</result>
    </action>
    <action name="rateAction" class="com.main.common.action.RateAction" method="doRateSubmit">
        <result name="success">First.jsp</result>
    </action>
</package>

JSP:

<s:form id="rtr" action="fileUploadAction" method="POST"
    enctype="multipart/form-data">
    <table border="0" cellspacing="0" cellpadding="0">
        <tr>
            <s:file name="uploadFile" label="Upload Request XML" />
            <s:submit value="Submit" action="submitAction" onclick="displayDetails();" /> 
            <s:hidden name="submitSuccess" />
            <s:submit value="Calculate" action="rateAction" /> 
        </tr>
    </table>
</s:form>

【问题讨论】:

    标签: java jsp struts2 jaxb


    【解决方案1】:

    不能一键操作吗?我的意思是提交 XML,然后用未编组的 XML 绘制结果......

    如果不是,由于您需要在多个请求/操作之间共享内存中的 XML(不保存在 HD 或 DB,只是发布到 Action),通过在您的行动。

    注意你使用了太多的拦截器...

    这就够了:

    <interceptor-ref name="defaultStack">
        <param name="fileUpload.allowedTypes">text/xml</param>
    </interceptor-ref>
    

    【讨论】:

    • 我确实尝试将 acordForm 放在会话中。但是我仍然得到了新对象,但没有使用 acordForm 对象值。放置在 setSession() 方法中 session.put("acordFormBean", acordform);并尝试在doRateSubmit()方法中获取acordForm对象-ACORD acordformFromSession = (ACORD)session.get("acordFormBean");
    • 那么你的尝试失败了:> 更加努力。如果您成功将一个对象放入会话中,您将成功稍后检索它,其中包含它的所有数据。
    • 想知道我是否可以在除调试之外的任何地方看到 Web 应用程序的会话对象??
    • 您可以在 Action 的日志中打印它们,并在 JSP 中使用 &lt;s:property value="#session['yourObjectName']" /&gt; 打印它们
    • @crazy287 您还可以使用&lt;s:debug/&gt; 标签查看一大堆有用的信息。
    猜你喜欢
    • 2010-11-07
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    相关资源
    最近更新 更多