Последовательность ModelDriven и Prepare? - PullRequest
1 голос
/ 09 августа 2010

Я поместил 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");
  //...
 }

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

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

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

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

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

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

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

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

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

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

Спасибо !!

Ответы [ 2 ]

5 голосов
/ 11 августа 2010

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

SomeModelClass myModelObject = null;

public Object getModel()
{
   return myModelObject;
}

... вам нужно установить modelObject, чтобы он мог получить значение ValueStack. Я думаю, вы могли бы сделать это так:

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

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

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

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

0 голосов
/ 10 августа 2010

Я нашел свое собственное решение .. но не самое удачное ..

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

Это работает хорошо и только2 строки добавлены в мой класс.

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

...