我可以在不同的操作类之间传播struts2 ActionErrors吗?

如果我有一个动作,其结果是redirectAction到另一个类中的另一个动作,是否有可能在结果动作中显示validation错误? 例如,在下面的示例中,如果用户执行actionA(没有与之关联的视图),并且存在错误,是否有任何方法可以在actionB结果(foo.jsp)中显示这些错误? 或者我是以完全错误的方式解决这个问题?

   actionB /b   actionB /b      /foo.jsp   

可能有办法做到这一点,但我认为这不是一个使用struts的好方法。 如果actionAvalidation失败,您很可能希望为其显示错误的非重定向输入结果,或者可能是可以显示错误的全局错误页面。

我想你可以将动作错误存储在重定向之间的会话中,但你不会真正使用框架的设计方式。

Struts2默认有一个商店拦截器。 它在STORE模式下将actionMessages,actionErrors和fieldErrors存储在会话中,您可以通过在RETRIEVE模式下使用相同的拦截器在下一个重定向中检索相同的内容。 更多细节可以在这里找到

基本上你必须使用名为store的预定义拦截器来获取operationMode:store和retrieve:

     STORE     actionB /b   actionB /b       RETRIEVE    /foo.jsp   

我找到了一个更好的解决方案,可以在actionRedirect结果类型上传递操作错误和消息。 它对我有用。

  /abc.jsp  action2 ${param1} ${param2} ${actionErrors}    /def.jsp /def.jsp  

这就是…..快乐的编码

如果您在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) –

  

在第一个操作中使用ActionContext.getContext().getSession().put(key, value)并使用ActionContext.getContext().getSession().get(key)redirectedAction中的ActionContext.getContext().getSession().get(key)addActionErrors检索到主Action

存储拦截器( MessageStoreInterceptor )可用于存储和检索actionErrorsactionMessagesfieldErrors

您可以通过将operationMode参数传递给action来动态更改store拦截器的operationMode

HTTP://localhost/sample.action一个operationMode = STORE

您可以在默认堆栈中将商店拦截器设置为STORE模式,这样可以将所有操作消息存储在会话中。

   STORE  

要获取消息,您需要将RETRIEVE模式中的store拦截器添加到需要这些消息的特定操作。

这是一个重定向到的示例全局错误页面,当我们向其添加store拦截器并将operationMode设置为RETRIEVE时,此操作可以读取actionErrorsfieldErrorsactionMessages

 @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不支持此function。 但是存在解决方案(它由简单的struts拦截器完成,它在会话中存储消息)。

源代码解决方案

您可以使用结果类型“链”。

   show    /jsp/show.jsp  

在show.jsp中,您可以显示在删除操作中设置的操作错误或操作消息

这项工作在我身上

在struts.xml中添加以下行:

   

使用结果类型“链”并添加名称为“input”的结果:

    actionB /b   actionB /b      /foo.jsp /foo.jsp