Использование ModelDriven в Struts 2

Я разрабатываю проект с использованием Hibernate, Struts 2 и Spring, но у меня проблемы со Struts.

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

Структура занятий такая

Class1Action.java:

public class Class1Action extends ActionSupport implements ModelDriven<ModelDrivenClass> {

     private ModelDrivenClass modelDrivenClass;


     // getter and setter for modelDrivenClass

     public String methodName() {

     System.out.println("Entrou!");

        return SUCCESS;

    }

    @Override
    public Sensor getModel() {
        return getSensor();
    }

}

В struts.xml я создал 3 действия, используя следующую структуру

struts.xml:

<action name="actionName1" method="methodName" class="Class1Action">
   <interceptor-ref name="validation">
      <param name="excludeMethods">methodName</param>
   </interceptor-ref>
   <result name="success" >success.jsp</result>
   <result name="input" >input.jsp</result>
</action>

Кроме того, у меня есть JSP с 3 кнопками, относящимися к различным действиям Struts, и несколько полей, представляющих поля из управляемого моделью класса, используемого в 3 классах действий, и все поля внутри тега <s:push>.

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

Я попытался удалить 3 строки Struts, которые исключают методы из проверки, но вместо того, чтобы поля были пустыми, во второй раз, когда я нажал ту же кнопку, он возвращает ввод и перенаправляется на input.jsp.

Следующий код от success.jsp, это стартовая страница:

успех.jsp:

<form method="post" >
    
    
    <s:push value="modelDrivenClass">

        <s:textfield label="FieldLabel1" name="modelDrivenClassAttribute1" />
        <s:textfield label="FieldLabel2" name="modelDrivenClassAttribute2" />
        <s:textfield label="FieldLabel3" name="modelDrivenClassAttribute3" />
        <s:textfield label="FieldLabel4" name="modelDrivenClassAttribute4" />
        <s:textfield label="FieldLabel5" name="modelDrivenClassAttribute5" />
            
    </s:push>
    
    
<s:submit action="actionName1" name="Submit1" value="Submit1" />
<s:submit action="actionName2" name="Submit2" value="Submit2" />
<s:submit action="actionName3" name="Submit3" value="Submit3" />
</form>

Я не знаю, правильно ли это сделать, но я заставил его работать, когда использовал только один класс, реализующий ModelDriven, и этот класс имеет все 3 метода.

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


person Luis    schedule 01.08.2012    source источник


Ответы (1)


Подход с классом действий ModelDriven очень полезен, если вы переносите старый код Struts на новый, поэтому он упрощает концепцию FormBean.

И в более новых Struts 2 нет необходимости использовать ModelDriven, если вы можете использовать компонент действия из top из valueStack и модели, связанной только с префиксом к его имени.

Примечание: при переопределении конфигурации перехватчиков в конфигурации действия defaultStack исчезает. Итак, лучше создать свой собственный стек или ссылаться хотя бы на basicStack, чтобы убедиться, что необходимые перехватчики вызываются. В вашем случае это modelDriven перехватчик.

Если вы используете этот перехватчик в стеке, он помещает модель перед действием, поэтому вам не нужно s:push ее в результате.

Объект модели должен быть инициализирован экземпляром класса модели и возвращен получателем модели. Также рассмотрите возможность использования валидатора посетителя при проверке полей модели.

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

Примечание. использование prepare требует изменения порядка вызова перехватчиков, чтобы отправить модель до ее заполнения.

person Roman C    schedule 28.06.2014