3

以下是我对拦截器的配置:

    <interceptors>
        <interceptor-stack name="storeStack">
            <interceptor-ref name="defaultStack"/>
            <interceptor-ref name="store">
                <param name="operationMode">STORE</param>
            </interceptor-ref>
        </interceptor-stack>

        <interceptor-stack name="retrieveStack">
            <interceptor-ref name="defaultStack"/>
            <interceptor-ref name="store">
                <param name="operationMode">RETRIEVE</param>
            </interceptor-ref>
        </interceptor-stack>

        <interceptor-stack name="appDefaultStack">
            <interceptor-ref name="defaultStack">
                <param name="exception.logEnabled">true</param>
                <param name="exception.logLevel">ERROR</param>
            </interceptor-ref>
        </interceptor-stack>
    </interceptors>

而我的行动:

    <action name="update/*" class="comics.comics.ComicsAction" method="view">
        <interceptor-ref name="retrieveStack" />
        <param name="key">{1}</param>
        <result>/comics/comics-chapters.jsp</result>
    </action>


    <action name="add" class="comics.comics.ChapterAction" method="add">
        <interceptor-ref name="storeStack" />
        <result type="redirectAction">
            <param name="parse">true</param>
            <param name="key">${key}</param>
            <param name="actionName">update</param>
            <param name="namespace">/comics</param>    
        </result>

        <result name="input" type="redirectAction">
            <param name="parse">true</param>
            <param name="key">${key}</param>
            <param name="actionName">update</param>
            <param name="namespace">/comics</param>    
        </result>

    </action>

在我的comics-chapters.jsp 页面中,字段错误消失了。但是当我将输入结果更改为:

         <result name="input">/comics/comics-chapters.jsp</result>

显示字段错误。

当我的输入结果是一个动作时如何显示字段错误?

4

3 回答 3

4

这是因为当你使用时redirectAction,Struts2 正在创建一个新的请求和响应对象,并且会清除值堆栈并将新的请求和响应放入值堆栈中,这样它就会覆盖以前的数据。

您在这里几乎没有选择

  1. 将您的消息存储在操作中,然后redirectAction您可以从操作中获取它们并将它们显示给用户。
  2. 使用MessageStoreInterceptor

对范围结果的长期未决请求将能够处理此类用例,但我相信它会出现在 struts-3.x(又名 2.5)版本中。

于 2012-09-25T11:25:54.263 回答
1

尝试将store拦截器放在defaultStack这样的顶部:

<interceptor-stack name="storeStack">
         <interceptor-ref name="store">
                <param name="operationMode">STORE</param>
         </interceptor-ref>
         <interceptor-ref name="defaultStack"/>

</interceptor-stack>

<interceptor-stack name="retrieveStack">
         <interceptor-ref name="store">
                <param name="operationMode">RETRIEVE</param>
         </interceptor-ref>
         <interceptor-ref name="defaultStack"/>

 </interceptor-stack>

始终注意拦截器的顺序。

于 2012-09-25T11:32:16.080 回答
0

正如 Umesh 所说,您指定为结果的 redirectAction 会导致在调用新操作时从值堆栈中清除错误消息。在这种情况下,您可以使用的另一个选项是使用结果。链结果导致调用另一个操作,将所有现有值保留在值堆栈中,但错误消息除外,您必须为此使用ChainingInterceptor
您还可以查看这篇博文,了解有关如何使用链结果和 ChainingInterceptor 的更多详细信息。

于 2012-09-25T11:47:31.980 回答