Могу ли я распространять struts2 ActionErrors между разными классами действий?

Если у меня есть действие, результатом которого является redirectAction на другое действие в другом классе, возможно ли получить ошибки проверки для отображения в результирующем действии? Например. в следующем примере, если пользователь выполняет действие A (с которым не связано никаких представлений) и возникают ошибки, есть ли способ отобразить эти ошибки в результате действия B (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>

person sk.    schedule 01.07.2009    source источник
comment
Попробуйте использовать перехватчик MessageStore — struts.apache.org/release /2.3.x/docs/   -  person coding_idiot    schedule 17.04.2013


Ответы (10)


Возможно, есть способ сделать это, но я не думаю, что это очень хороший способ использовать распорки. Если actionA не проходит проверку, вы, скорее всего, захотите получить для него результат ввода без перенаправления, который показывает ошибки, или, возможно, страницу глобальной ошибки, которая может это показать.

Я предполагаю, что вы могли бы хранить ошибки действия где-то, например, в сеансе между перенаправлениями, но на самом деле вы бы не использовали структуру так, как она была разработана.

person Brian Yarger    schedule 09.07.2009

Struts2 по умолчанию имеет перехватчик хранилища. Он сохраняет actionMessages, actionErrors и fieldErrors в сеансе в режиме STORE, и вы можете получить их при следующем перенаправлении, используя тот же перехватчик, используя его в режиме RETRIEVE. Более подробную информацию можно найти здесь

person Sarvjeet Ahuja    schedule 01.05.2012

По сути, вы должны использовать предопределенные перехватчики, называемые store, которые принимают операциюMode: store and 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>
person samsina    schedule 15.07.2009

Я нахожу лучшее решение для передачи ошибок действий и сообщений в типе результата 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/>

Вот оно..... Удачного кодирования

person Jibran    schedule 14.07.2014
comment
<param name="actionErrors">${actionErrors}</param> это делает всю магию. - person Jibran; 14.07.2014
comment
Это передает как ошибки действий, так и сообщения, или вам нужно <param name="actionMessages">${actionMessages}</param> для передачи сообщения? - person ponder275; 27.06.2016
comment
<param name="actionMessages">${actionMessages}</param> действительно передает сообщения. Спасибо! - person ponder275; 27.06.2016
comment
Вы должны указать, что вы всегда будете получать результат ввода действия2, и метод выполнения этого действия не вызывается... - person Nils-o-mat; 22.11.2017

Используйте ActionContext.getContext().getSession().put(key, value) в первом действии и получите его, используя ActionContext.getContext().getSession().get(key) в redirectedAction и addActionErrors в основном действии.

person Meena    schedule 12.12.2012
comment
Я думаю, MessageStoreInterceptor был бы намного лучшим способом. - person coding_idiot; 17.04.2013
comment
MessageStoreInterceptor — struts.apache.org/release/2.3. х/документы/ - person coding_idiot; 17.04.2013

Цепочка типов результатов будет копировать сообщения/ошибки в результирующее действие, если вы сделаете следующее в файле 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"/>
person tiwari.vikash    schedule 24.08.2014

Перехватчик хранилища (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, fieldErrors и actionMessages, когда мы добавляем к нему перехватчик store и устанавливаем operationMode в RETRIEVE :

@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'). Таким образом, вам не нужно определять явный перехватчик store в режиме RETRIEVE.

Хотя это не очень хороший подход, но вы можете получить доступ к сообщениям хранилища в сеансе с помощью этих ключей.

session.get(MessageStoreInterceptor.fieldErrorsSessionKey)
session.get(MessageStoreInterceptor.actionErrorsSessionKey)
session.get(MessageStoreInterceptor.actionMessagesSessionKey)
person Alireza Fattahi    schedule 27.01.2016

Эта функция не поддерживается Struts2 по умолчанию. Однако решение существует (это делается простым перехватчиком struts, который хранит сообщения в сеансе).

решение с исходным кодом< /а>

person rdk    schedule 11.07.2009

Вы можете использовать тип результата «цепочка».

<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 вы можете отображать ошибки действий или сообщения о действиях, которые вы установили в действии удаления

person Szymon Lisiecki    schedule 11.02.2014
comment
Использование chain не рекомендуется. - person Aleksandr M; 27.01.2016

Эта работа во мне

добавьте эту строку в 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>
person Mozquito    schedule 18.03.2015