Цепочка иерархии классов действий от SuperAction к методам SubAction в Struts 2

Я переношу существующее приложение Struts1 в Struts2. Я сохранил иерархию классов Actions и ActionForms одинаковой.

Действия Struts2 SuperAction расширяются из ActionSupport и имеют ModerlDriven переменную-член SuperForm, а SubAction расширяются из SuperAction и имеют ModelDriven переменную-член SubForm.

Конечно, SubForm является подклассом SuperForm. И SubAction, и SuperAction имеют некоторые методы действия.

SubAction конструктор выглядит так:

    public SubAction() {
      subForm = new SubForm();
      this.superForm(this.subForm);
    }

Теперь у меня есть сценарий, в котором я вызываю метод SuperAction из сопоставления SubAction, например:

    <package name="sub-pkg" namespace="/subns" extends="struts-default" strict-method-invocation="true">
        <action name="subAction_*" method="{1}" class="com.company.SubAction">
          <result name="showArchived" type="chain">subAction_list</result>
          <result name="list">/jsps/list_logs.jsp</result>
          <allowed-methods>list, showArchived</allowed-methods>
        </action>
    </package>

Метод действия SuperAction.showArchived() устанавливает значения в свою переменную-член superForm.setLogMode() и возвращает String showArchived, что, как видно из сопоставления, связано с методом действия SubAction.list().

Этот метод использует атрибут SuperForm logMode из своей переменной-члена subForm и возвращает String list для отображения list_logs.jsp.

Цепочка действий работает, но она не передает значение атрибута SuperForm logMode, в данном случае цепочка методов SuperAction в метод SubAction.

Какие-либо предложения?

Обновление:

На самом деле, я обнаружил общую проблему, не относящуюся к действиям SuperClass/SubClass. Обычно это происходит из-за того, что использование type="chain" не работает для объекта модели в ModelDriven действиях.

Поэтому chain не повторно заполняет свойства модели в конце chain для второго действия.

Мы ценим любые предложения.


person Shah-G    schedule 01.02.2018    source источник
comment
Цепочка - это целый шарик воска, которого обычно лучше избегать (IMO). Это отлично подходит для простых вещей, но приводит к всевозможным проблемам, когда появляется сложность. Тем не менее: мне не ясно, в чем ваша проблема - вы говорите, что в SuperForm есть заполненное свойство, которое не отражено в SubForm? Если это так, нам, вероятно, понадобится дополнительная информация о классах форм.   -  person Dave Newton    schedule 01.02.2018
comment
См. предложения ниже.   -  person Roman C    schedule 06.02.2018
comment
@DaveNewton, SubForm является подклассом SuperForm. Что еще нужно знать?   -  person Shah-G    schedule 06.02.2018


Ответы (1)


TL;DR

Результат chain создает новый valueStack с тем же компонентом действия и заполняет его из старого стека.

Когда вызывается связанное действие, в стеке находится перехватчик params.

Когда вызывается перехватчик params, он заполняет компонент действия из ActionContext параметров.


То, что у вас есть для атрибута, заполняется params перехватчиком. Если вам не хватает некоторых параметров запроса проверки атрибута, и у вас есть геттеры, устанавливающие свойство атрибута.

Цепочка действий работает, но не передает значение атрибута SuperForm


Некоторые свойства, которые будут доступны из корня ModelDriven, должны использовать это решение.

modelDriven перехватчик отправляет модель на top из valueStack, поэтому его легко использовать в JSP. Объект действия находится под моделью. Таким образом, на него можно было бы ссылаться напрямую, используя префикс [1]. См. основы OGNL.

person Roman C    schedule 02.02.2018