[英]Can I propagate struts2 ActionErrors between different action classes?
如果我有一个动作,其结果是redirectAction到另一个类中的另一个动作,是否有可能在结果动作中显示验证错误? 例如,在下面的示例中,如果用户执行actionA(没有与之关联的视图),并且存在错误,是否有任何方法可以在actionB结果(foo.jsp)中显示这些错误? 或者我是以完全错误的方式解决这个问题?
<package name="a" extends="struts-default" namespace="/a">
<action name="actionA" class="actionAClass">
<result name="input" type="redirectAction">
<param name="actionName">actionB</param>
<param name="namespace">/b</param>
</result>
<result type="redirectAction">
<param name="actionName">actionB</param>
<param name="namespace">/b</param>
</result>
</action>
</package>
<package name="b" extends="struts-default" namespace="/b">
<action name="actionB" class="actionBClass">
<result>/foo.jsp</result>
</action>
</package>
Struts2默认有一个商店拦截器。 它在STORE模式下将actionMessages,actionErrors和fieldErrors存储在会话中,您可以通过在RETRIEVE模式下使用相同的拦截器在下一个重定向中检索相同的内容。 更多细节可以在这里找到
基本上你必须使用名为store的预定义拦截器,它接受operationMode:store和retrieve:
<package name="a" extends="struts-default" namespace="/a">
<action name="actionA" class="actionAClass">
<!-- Here you are storing the Error messages -->
<interceptor-ref name="store">
<param name="operationMode">STORE</param>
</interceptor-ref>
<!-- include your default stack in case you need to load other interceptors -->
<interceptor-ref name="defaultStack" />
<result name="input" type="redirectAction">
<param name="actionName">actionB</param>
<param name="namespace">/b</param>
</result>
<result type="redirectAction">
<param name="actionName">actionB</param>
<param name="namespace">/b</param>
</result>
</action>
</package>
<package name="b" extends="struts-default" namespace="/b">
<action name="actionB" class="actionBClass">
<interceptor-ref name="store">
<param name="operationMode">RETRIEVE</param>
</interceptor-ref>
<!-- include your default stack in case you need to load other interceptors -->
<interceptor-ref name="defaultStack" />
<result>/foo.jsp</result>
</action>
</package>
我找到了一个更好的解决方案,可以在actionRedirect结果类型上传递操作错误和消息。 它对我有用。
<action name="action1" class="action.Action1" >
<result>/abc.jsp</result>
<result name="input" type="redirectAction">
<param name="actionName">action2</param>
<param name="param1">${param1}</param>
<param name="param2">${param2}</param>
<param name="actionErrors">${actionErrors}</param>
</result>
</action>
<action name="action2" class="action.Action2" >
<result>/def.jsp</result>
<result name="input">/def.jsp</result>
</action/>
这就是.....快乐的编码
可能有办法做到这一点,但我认为这不是一个使用struts的好方法。 如果actionA验证失败,您很可能希望为其显示错误的非重定向输入结果,或者可能是可以显示错误的全局错误页面。
我想你可以将动作错误存储在重定向之间的会话中,但你不会真正使用框架如何设计它。
如果您在struts.xml或struts.properties文件中执行以下操作,结果类型链会将消息/错误复制到生成的操作中 -
struts.xwork.chaining.copyErrors - set to true to copy Action Errors
struts.xwork.chaining.copyFieldErrors - set to true to copy Field Errors
struts.xwork.chaining.copyMessages - set to true to copy Action Messages
示例(struts.xml) -
<constant name="struts.xwork.chaining.copyErrors" value="true"/>
在第一个操作中使用ActionContext.getContext().getSession().put(key, value)
并使用ActionContext.getContext().getSession().get(key)
将redirectedAction
中的ActionContext.getContext().getSession().get(key)
和addActionErrors
检索到主Action
存储拦截器( MessageStoreInterceptor
)可用于存储和检索actionErrors
, actionMessages
和fieldErrors
。
您可以通过将operationMode
参数传递给action来动态更改store拦截器的operationMode
HTTP://localhost/sample.action一个operationMode = STORE
您可以在默认堆栈中将商店拦截器设置为STORE
模式,这样可以将所有操作消息存储在会话中。
<interceptor-ref name="store">
<param name="operationMode">STORE</param>
</interceptor-ref>
要获取消息,您需要将RETRIEVE
模式中的store
拦截器添加到需要这些消息的特定操作。
这是一个重定向到的示例全局错误页面,当我们向其添加store
拦截器并将operationMode
设置为RETRIEVE
时,此操作可以读取actionErrors
, fieldErrors
和actionMessages
:
@Action(value = "error-page" ,
interceptorRefs =
{@InterceptorRef(value = "store", params = {"operationMode", "RETRIEVE"})}
)
public String execute() throws Exception {
LOG.error("An error accrued during action ActionErrors '{}' , FieldErrors '{}' " , getActionErrors() , getFieldErrors());
//Rest of the code
}
MessageStoreInterceptor
在添加新错误之前删除先前的错误。
您可以在默认堆栈中将商店设置为AUTOMATIC
。 这样,所有消息都会被存储,并且当动作结果是ServletRedirectResult
类型时会自动重试(例如,如果动作'redirectAction','redirect')那么你不需要在RETRIEVE
模式下定义显式的store
拦截器。
虽然这不是一个好方法,但您可以使用这些键访问会话中的商店消息。
session.get(MessageStoreInterceptor.fieldErrorsSessionKey)
session.get(MessageStoreInterceptor.actionErrorsSessionKey)
session.get(MessageStoreInterceptor.actionMessagesSessionKey)
默认情况下,Struts2不支持此功能。 但是存在解决方案(它由在会话中存储消息的简单struts拦截器完成)。
您可以使用结果类型“链”。
<action name="delete" class="com.example.Delete">
<result name="error" type="chain">
<param name="actionName">show</param>
</result>
</action>
<action name="show" class="com.example.Show">
<result name="success" type="dispatcher">/jsp/show.jsp</result>
</action>
在show.jsp中,您可以显示在删除操作中设置的操作错误或操作消息
这项工作在我身上
在struts.xml中添加以下行:
<constant name="struts.xwork.chaining.copyErrors" value="true"/>
<constant name="struts.xwork.chaining.copyMessages" value="true"/>
使用结果类型“链”并添加名称为“input”的结果:
<package name="a" extends="struts-default" namespace="/a">
<action name="actionA" class="actionAClass">
<result name="input" type="chain">
<param name="actionName">actionB</param>
<param name="namespace">/b</param>
</result>
<result type="chain">
<param name="actionName">actionB</param>
<param name="namespace">/b</param>
</result>
</action>
</package>
<package name="b" extends="struts-default" namespace="/b">
<action name="actionB" class="actionBClass">
<result>/foo.jsp</result>
<result name="input">/foo.jsp</result>
</action>
</package>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.