代码之家  ›  专栏  ›  技术社区  ›  sk.

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

  •  13
  • sk.  · 技术社区  · 16 年前

    如果我有一个操作,结果是重定向到不同类中的另一个操作的操作,是否有可能在结果操作中显示验证错误?例如,在以下示例中,如果用户执行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>
    
    10 回复  |  直到 16 年前
        1
  •  11
  •   Marco Borchert Sarvjeet Ahuja    6 年前
        2
  •  7
  •   samsina    16 年前

    基本上,你必须使用名为store的预定义拦截器,它接受操作Mode: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>
    
        3
  •  6
  •   Jibran    11 年前

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

    就是这样。….快乐编码

        4
  •  4
  •   Brian Yarger    16 年前

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

        5
  •  3
  •   Janak Nirmal Biju    13 年前

    使用 ActionContext.getContext().getSession().put(key, value) 在第一个操作中,使用以下命令检索它 ActionContext.getContext().getSession().get(key) redirectedAction addActionErrors 到主要行动

        6
  •  3
  •   tiwari.vikash    11 年前

    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
    

    <constant name="struts.xwork.chaining.copyErrors" value="true"/>
    
        7
  •  1
  •   Alireza Fattahi    9 年前

    商店拦截器( MessageStoreInterceptor actionErrors , actionMessages fieldErrors .

    您可以通过传递以下命令来动态更改存储拦截器的操作 operationMode

    http://localhost/sample.action?operationMode=STORE

    STORE 默认堆栈中的模式,使所有操作消息都能存储在会话中。

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

    store RETRIEVE 模式转换为需要这些消息的特定操作。

    actionErrors , field错误 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 商店 检索

    虽然这不是一个好方法,但您可以使用这些键在会话中访问存储消息。

    session.get(MessageStoreInterceptor.fieldErrorsSessionKey)
    session.get(MessageStoreInterceptor.actionErrorsSessionKey)
    session.get(MessageStoreInterceptor.actionMessagesSessionKey)
    
        8
  •  0
  •   rdk    16 年前
        9
  •  0
  •   Szymon Lisiecki    11 年前

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

    <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中,您可以显示在delete操作中设置的操作错误或操作消息

        10
  •  0
  •   Mozquito    10 年前

    这工作在我身上

    在struts.xml中添加此行:

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

    使用结果类型“chain”并添加名为“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>
    
    推荐文章