Java Struts2验证重定向操作输入-字段错误消失

Java Struts2验证重定向操作输入-字段错误消失,java,struts2,Java,Struts2,以下是我对拦截器的配置: <interceptors> <interceptor-stack name="storeStack"> <interceptor-ref name="defaultStack"/> <interceptor-ref name="store"> <param name="operationMode">STOR

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

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

{1}
/comics/comics-chapters.jsp
真的
${key}
更新
/漫画
真的
${key}
更新
/漫画
在我的comics-chapters.jsp页面中,字段错误消失了。但当我将输入结果更改为:

         <result name="input">/comics/comics-chapters.jsp</result>
/comics/comics-chapters.jsp
将显示字段错误


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

这是因为当您使用
重定向操作时,Struts2正在创建一个新的请求和响应对象,并将清除值堆栈,并将新的请求和响应放入值堆栈中,以便覆盖以前的数据

你在这里几乎没有选择

  • 将消息存储在操作中,然后在
    重定向操作上
    可以从操作中获取消息并将其显示给用户
  • 使用

  • 对于scope result有一个长期未决的请求,它将能够处理这样的用例,但我相信它将出现在struts-3.x(也称为2.5)版本中。

    尝试将
    存储
    拦截器放在
    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>
    
    
    贮藏
    检索
    

    请始终注意拦截器的顺序。

    因为Umesh说,您指定为结果的重定向操作会在调用新操作时从值堆栈中清除错误消息。不过,在这种情况下,您还有一个选择,就是使用结果。链结果导致调用另一个操作,将所有现有值保留在值堆栈中,但错误消息除外,您必须使用。

    您还可以查看有关如何使用“链结果”和“链接Interceptor”的更多详细信息。

    通常不建议使用操作链接。首先探索其他选项,例如Post后重定向技术。裁判:。相反,最好使用messageStore拦截器。博客帖子不存在。@JRGalia:是的,它就在那里,但是有了
    FlashResult
    ,它就像将对象存储在HTTP重定向中,让用户更容易地做事情一样,配置
    MessageStoreInterceptor
    确实有点棘手。@Umeshawashi,你所说的FlashResult是什么意思?@JRGalia:The
    FlashResult
    基本上与ServletActionRedirectResult类似,只是没有将所有额外的参数转换为字符串并将它们作为HTTP参数添加到重定向URL中,它使用这些参数键/值对创建一个HashMap,不进行任何转换,并将其存储在用户会话中。在下一个HTTP请求中,如果将FlashInterceptor正确添加到拦截器堆栈中,它将检索此映射并使用参数键将映射条目复制到目标操作。这比
    MessageStoreInterceptor
    更简单。已经存在JIRA票证。MessageStoreInterceptor的链接是404