我可以传播不同的动作类之间的struts2的ActionErrors?(Can I propagat

2019-06-24 16:23发布

如果我有一个动作,结果就是一个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>

Answer 1:

可能有办法做到这一点,但我不认为这是使用Struts一个很好的办法。 如果actionA被验证失败,您很可能会想要么有这方面的非输入重定向结果显示错误,或者是一个全球性的错误页面,可以证明这一点。

我想你可以存储的操作错误,如在重定向之间的会话的地方,但你不会真的是使用该框架是如何设计的。



Answer 2:

Struts2的默认有一个商店拦截。 它存储了actionMessages,和的ActionErrors在fieldErrors在STORE模式会话,你可以通过使用它在提取模式使用相同的拦截检索下一个重定向相同。 更多细节,可以发现这里



Answer 3:

基本上,你必须使用预定义的拦截器叫店这需要一个operationMode:存储和检索:

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


Answer 4:

我找到一个更好的解决方案,以传递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/>

这是它.....快乐编码



Answer 5:

结果类型链将消息/错误复制到所产生的动作,如果你在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"/>


Answer 6:

使用ActionContext.getContext().getSession().put(key, value)在第一时间行动,并使用检索ActionContext.getContext().getSession().get(key)redirectedActionaddActionErrors的主要行动



Answer 7:

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

您可以通过传递动态更改商店拦截器的操作operationMode参数行动

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

您可以在店里拦截STORE模式在默认堆栈这使得存储会话中的所有操作信息。

    <interceptor-ref name="store">
           <param name="operationMode">STORE</param>
    </interceptor-ref>

为了让你需要添加消息store在拦截RETRIEVE模式给需要这些信息的具体行动。

这是被重定向到,这个动作可以读取样品全局错误页面actionErrorsfieldErrorsactionMessages当我们添加store拦截它,并设置operationModeRETRIEVE

@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”,“重定向”),所以你并不需要定义一个明确的store在拦截RETRIEVE模式。

虽然这不是一个好办法,但你可以在这些键的会话访问存储邮件。

session.get(MessageStoreInterceptor.fieldErrorsSessionKey)
session.get(MessageStoreInterceptor.actionErrorsSessionKey)
session.get(MessageStoreInterceptor.actionMessagesSessionKey)


Answer 8:

这个功能不是由Struts2的默认支持。 解决方案存在,虽然(它是由简单的支柱做拦截器,在会话邮件存储)。

与源代码溶液



Answer 9:

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

<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可以显示你在删除操作设定动作错误或操作的消息



Answer 10:

这项工作在我

加入这一行中的struts.xml:

<constant name="struts.xwork.chaining.copyErrors" value="true"/>
<constant name="struts.xwork.chaining.copyMessages" value="true"/>

使用结果类型“链”,并命名为“输入”添加的结果:

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


文章来源: Can I propagate struts2 ActionErrors between different action classes?