Последовательность ModelDriven и Prepare?

Я помещаю println() в каждый метод класса Action.

public String execute() throws Exception {
  System.out.println("execute");
  //...
 }
 public void prepare() throws Exception {
  System.out.println("prepare");
  //...
 }
 public Object getModel() {
  System.out.print("getModel");
  //...
 }

Я думал, что порядок будет; подготовить → выполнить → получить модель.

Поскольку я помню, что читал это в книге, поэтому я создавал класс bean-компонентов и выполнял некоторую логику в prepare() и просто возвращал SUCCESS в execute(). И я думаю, что getModel предназначен для помещения bean-компонента в стек значений, верно?

... во всяком случае, консоль показала мне это. Это очень странно; подготовить → получить модель → выполнить.

И это становится для меня огромной проблемой. Очень сложно объяснить причину на английском... но я попробую!

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

Теперь я пытаюсь создать одно действие, чтобы избежать дублирования. Этот класс действий имеет несколько методов (сопоставленных в struts.xml следующим образом; <action name="View_board" method="view">).

И, как мы видели в консоли, этот view() вызывается последним в классе действия, подобно execute(). prepare() только создает bean-компоненты, а view() выполняет настоящую работу. Но getModel() вызывается перед вызовом view(), поэтому нет возможности поместить бины в ValueStack.

Надеюсь, вы понимаете, что я пытаюсь объяснить.

Подводя итог, можно сказать, что есть все классы действий, такие как BoardView, BoardDelete, BoardWrite... и они работали хорошо! Но я ненавижу дублировать вещи, поэтому я создал класс BoardManager. Этот класс имеет каждый метод (например, view()), который обрабатывается классом (например, BoardView). Но этот view() был вызван после вызова getModel(), поэтому bean-компонент (возврат getModel()) не может быть помещен в ValueStack.

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

Спасибо!!


person Deckard    schedule 09.08.2010    source источник
comment
Нашел еще одну странность. в консоли есть 3 getModel.. означает, что фреймворк пытается получить модель 3 раза, чего не хватает.. я думаю   -  person Deckard    schedule 10.08.2010


Ответы (2)


Вы должны сами установить объект модели, поскольку перехватчик, управляемый моделью, может поместить его в стек только в том случае, если он не равен нулю. Если ваш getModel() выглядит так:

SomeModelClass myModelObject = null;

public Object getModel()
{
   return myModelObject;
}

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

public void prepare(){
   myModelObject = new myModelObject("I'm so new");
}

... или просто инициализируйте его в поле:

SomeModelClass myModelObject = new myModelObject("I'm so new");

Не забудьте реализовать соответствующие интерфейсы (ModelDriven и Preparable). Надеюсь это немного поможет.

person Akku    schedule 11.08.2010

Я нашел свое собственное решение.. но не очень хорошее..

При настройке объекта домена сеттером я вручную помещаю его в стек значений.

Он работает хорошо, и в мой класс добавлено всего 2 строки.

Но я не чувствую себя так хорошо.

person Deckard    schedule 10.08.2010