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

Если у меня есть действие, в котором результат является 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>

Ответ 1

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

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

Ответ 2

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

Ответ 3

В основном вы должны использовать предопределенные перехватчики, называемые хранилищем, который принимает операциюMode: сохранение и извлечение:

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

Ответ 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/>

Это он..... Счастливое кодирование

Ответ 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"/>

Ответ 6

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

Ответ 7

Хранитель-перехватчик (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)

Ответ 8

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

решение с исходным кодом

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

Ответ 10

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

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