Бизнес-логика в калитке, где есть несколько рекомендуемых мест для размещения логики (на логике загрузки) - PullRequest
2 голосов
/ 03 марта 2011

Итак, я вижу, что этот вопрос задан, но я добавлю немного кода:

Где лучше всего разместить код для инициализации модели перед страница рендеринга. Я знаю пять вариантов, но куда вы обычно ставите это тип инициализации?

Перед рендерингом страницы я хочу установить данные в моем бине / модели с помощью определенные атрибуты, которые могут быть характерны только для этой страницы.

Я думаю, что есть пять вариантов.

  1. Добавить логику инициализации в конструктор. Это может сработать, но я не знаю, вызывается ли конструктор для каждого вызова страницы (например, когда страница десериализована).

  2. Добавить логику инициализации в onBeforeRender. Это работает, и он призвал каждого запрос? Но это лучшее место? Или на конфигурации? onInitialize.

И затем, вы вызываете setDefaultModel / setDefaultObject с обновленными значениями?

  1. Добавить логику инициализации в методе «load» или «getmodel» в Класс LoadableDetachableModel?

  2. Добавить init на предыдущей странице для метода onSubmit или onEvent. (OnSubmit () {initBeanInSession (); setResponsePage (); }

  3. Передать модель в конструктор панели или страницы (используя параметры страницы?)

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

(a) Код конструктора страницы с загружаемой съемной моделью:

MyPage.java: 
... 
final Form form = new Form(FORM, new 
CompoundPropertyModel(new LoadableDetachableModel() { 

private static final long serialVersionUID = 1L; 
@Override 
protected MyBean load() { 
final MyBean app = (MyBean) Session.get().getApp(); 

????????????? 
????????????? 
initialize here??????? 
????????????? 
return app; 
} 
}; 
}); 

??? 
onBeforeRender() { 
?? Add initiailize here 
final MyBean app = (MyBean) Session.get().getApp(); 
app.setData(doSomeBusinessLogicHere) 

} 

или initModel?

/**    
 * Called once per request on components before they are about to be rendered. 
 * This method should be used to configure such things as visibility and enabled flags.
 */
    @Override
    protected void onConfigure() {     
        super.onConfigure();

        // Call business logic and properly set email address.

    }

Ответы [ 2 ]

4 голосов
/ 08 марта 2011

1 Добавить логику инициализации в конструктор.Это может работать, но я не знаю, вызывается ли конструктор для каждого вызова страницы (например, когда страница десериализована).

Конструктор вызывается только при вызове new.Десериализация обходит обычное построение объектов (она только выделяет достаточно памяти и затем загружает данные напрямую - при условии, что вы не создали никакого специального кода для сериализации / десериализации).Такие предположения легко проверяются с помощью отладчика.

Так что, если вы хотите что-то делать для каждого запроса с вашим объектом модели, конструктор не туда.

2 Добавить логику инициализациив onBeforeRender.Это работает, и это называется для каждого запроса?Но это лучшее место?Или на конфигурации?onInitialize.

onBeforeRender вызывается только для видимых компонентов (для каждого запроса).Новое событие onConfigure вызывается для всех компонентов (независимо от видимости) с каждым запросом.onInitialize вызывается только после того, как компонент добавлен к его родителю (т. Е. Только один раз).

Ответ на ваш вопрос трудно дать, потому что неясно, намерены ли вы перезаписать значения ваших пользователейуже предоставили в своих полях ввода.Если это так, то вы можете сделать это с помощью load метода LoadableDetachableModel.Если нет, то вы должны сделать это в onInitialize или, возможно, установить эти значения по умолчанию в конструкторе вашего App объекта.

Для таких задач проектирования не существует золотых молотков - всегда зависит.

1 голос
/ 03 марта 2011

Я обычно помещаю это в load() метод LoadableDetachableModel.Этот метод специально предназначен для того, чтобы содержать логику инициализации.

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

...