【问题标题】:Struts 2 Message Store Interceptor Removing Errors on No RedirectStruts 2 消息存储拦截器在无重定向时删除错误
【发布时间】:2013-10-29 00:48:24
【问题描述】:

我在使用 Struts 2 中的消息存储拦截器时遇到问题。我的 struts.xml 文件中有以下操作:

<action name="rfi" method="add" class="org.test.action.RfiAction">
    <interceptor-ref name="store">
        <param name="operationMode">AUTOMATIC</param>
    </interceptor-ref>
    <interceptor-ref name="defaultStack" />
    <result name="error">../display/irrt/rfi.jsp</result>
    <result name="input">../display/irrt/rfi.jsp</result>
    <result name="success" type="redirectAction">
        <param name="actionName">rfis</param>
        <param name="namespace">/irrt</param>
    </result>
</action>

当动作成功返回时,它会重定向到列出的动作,并且成功消息会被拦截器正确保存和检索。

但是,当发生错误时,没有重定向,它会转到列出的 JSP 页面,但不会显示错误(所有其他数据都会显示)。就像 MessageStoreInterceptor 在运行时会清除错误变量的内容,这样如果没有发生重定向,则当前操作不再有错误消息。

当拦截器设置为 STORE 或 AUTOMATIC 模式时会发生这种情况(即使拦截器在 AUTOMATIC 模式下甚至不应该运行并且结果不包含重定向)。

我的代码只会添加错误或消息。它永远不会删除它们。动作代码如下:

private String add()
{
    try
    {
        // add the rfi entry
        this.rfiService.addRfi(this.rfiEntry, this.getLoggedInUser());
    }
    catch(ConnectionException e)
    {
        this.addActionError("Could not add RFI entry.");
        e.printStackTrace();

        return ERROR;
    }

    // set success message
    this.addActionMessage("RFI entry added.");

    return SUCCESS;
}

这是用于显示消息的 JSP 中的代码:

<s:if test="hasActionErrors() == true">
    <s:iterator value="actionErrors">
        <p class="text"><b><font color="red"><s:property /></font></b></p>
    </s:iterator>
</s:if>
<s:elseif test="hasActionMessages() == true">
    <s:iterator value="actionMessages">
        <p class="text"><b><font color="green"><s:property /></font></b></p>
    </s:iterator>
</s:elseif>

对于这个问题的任何帮助将不胜感激。

【问题讨论】:

    标签: java jsp struts2


    【解决方案1】:
    <result name="success" type="redirectAction">
            <param name="actionName">rfis</param>
            <param name="namespace">/irrt</param>
        </result>
    

    redirectAction rfis 也应该通过store 拦截器。

    <action name="rfis" class="..." method="...">
        <interceptor-ref name="store">
            <param name="operationMode">AUTOMATIC</param>
        </interceptor-ref>
        <interceptor-ref name="defaultStack" />
        <result ..../>
    </action>
    

    【讨论】:

    • “rfis”动作确实通过了拦截器。这与 rfi 动作有关,当它进入“错误”或“输入”结果(根本没有重定向的结果)时。当它通过这些结果时,不会显示操作错误。
    • 您的意思是说使用s:actionerrors:actionmessage 不会显示错误/消息?
    • 没错。我正在使用上面的迭代器来遍历操作错误或消息,但是,我只是尝试使用 s:actionerror 和 s:actionmessage 标签,但它仍然没有显示出来。
    【解决方案2】:

    我错过了包含错误的特定页面上的包含。

    故事的寓意:不要假设每个其他页面上的代码都在不起作用的页面上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-15
      • 2013-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多