Struts2验证重定向操作输入 - FieldErrors已经过去了

时间:2012-09-25 09:25:38

标签: java struts2

以下是拦截器的配置:

    <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>

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

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

显示字段错误。

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

3 个答案:

答案 0 :(得分:4)

这是因为当您使用redirectAction时,Struts2正在创建一个新的请求和响应对象,并将清除值堆栈并在值堆栈中放置新的请求和响应,以便它将覆盖以前的数据。 / p>

这里你的选择很少

  1. 将您的消息存储在操作中以及redirectAction上,您可以从操作中获取消息并将其显示给用户。
  2. 使用MessageStoreInterceptor
  3. 对于范围结果有一个很长的待处理请求,它将能够处理这样的用例,但我相信它会出现在struts-3.x(a.k.a 2.5)版本中。

答案 1 :(得分: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>

始终 注意拦截器的顺序。

答案 2 :(得分:0)

正如Umesh所说,您指定的redirectAction导致在调用新操作时从值堆栈中清除错误消息。在这种情况下,您有另一个选择是使用Chain结果。链结果导致调用另一个操作,保留值堆栈中除错误消息之外的所有现有值,您必须使用ChainingInterceptor。 您还可以查看this blog post以获取有关如何使用链结果和ChainingInterceptor的更多详细信息。