以下是拦截器的配置:
<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>
显示字段错误。
当我的输入结果是一个动作时,如何显示字段错误?
答案 0 :(得分:4)
这是因为当您使用redirectAction
时,Struts2正在创建一个新的请求和响应对象,并将清除值堆栈并在值堆栈中放置新的请求和响应,以便它将覆盖以前的数据。 / p>
这里你的选择很少
redirectAction
上,您可以从操作中获取消息并将其显示给用户。对于范围结果有一个很长的待处理请求,它将能够处理这样的用例,但我相信它会出现在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的更多详细信息。