2013-08-04 1 views
1

Я запускаю базовое приложение Struts2, в котором у меня возникает одна путаница. Мой класс действий реализует интерфейсы Readyable и ModelDriven и расширяет класс ActionSupport. У компонента модели есть одно свойство с именем «Пользователь».разница в значении свойства, полученном в валидаторе и методе модели в Struts2

На моей домашней странице (jsp) есть одно поле ввода, соответствующее единственному свойству «Пользователь» из модельного компонента.

В методе prepare() Я инициализирую компонент и установив его свойство в значение по умолчанию, например «Test», и метод model() возвращает этот объект bean.

В validate() у меня есть проверка, что если свойство «Пользователь» компонента bean имеет значение равно «Test», то addFieldError else continue.

public Student getModel() { 
    System.out.println("inside getModel.."+ st.getName());  
    return st; 
} 

public void validate(){ 
    System.out.println("inside validate"+st.getName()); 
    if(st.getName().equals("Test")){ 
     addFieldError("name","blank field"); 
    }  
} 

public void prepare() throws Exception { 
    st = new Student(); 
    st.setName("Test"); 
} 

Теперь мой вопрос Когда я получить доступ к действию непосредственно, то ошибка приходит и в консоли я получил ниже журналы:

inside getModel..Test 
inside getModel..Test 
inside validate...Test 

, но если я ввести любое значение сказать «Стек» в в поле формы и отправьте форму, тогда метод проверки распечатает значение, которое пользователь вводит, когда модельный метод печатает то, что подготовил инициализированный.

inside getModel..Test 
inside getModel..Test 
inside validate...Stack 

Почему так? Почему оба метода не синхронизированы? Используют ли метод проверки и метод модели значение свойства из разных мест?

Спасибо.

ответ

1

Значения получаются/задаются порядком вызовов перехватчика. Пока действие находится на оценочной стоимости, после prepare перехватчик params называется getModel(), чтобы получить объект, свойство которого должно быть установлено.

Перехватчик modelDriven также извлекает модель из оценочной площади. Любые последующие поиски свойств модели с помощью выражения приводят к вызову getModel(), пока свойство еще не установлено. Перехватчик params устанавливает свойство, наконец, вызывается перехватчик validation, который также извлекает getModel(), чтобы получить значения свойств, которые должны быть уже установлены.

Консоль будет выглядеть выше. Это нормальное поведение перехватчиков, пока действие не будет выполнено. В первом случае вы не отправляли значения с запросом, поэтому консоль печатает то, что было после prepare. Во втором значение отправляется и свойство было изменено, поэтому консоль отразила его. Значения идут с запросом http, так что это одно и то же «местоположение» в области запроса.

+0

Я пропустил заказ, в котором работают перехватчики. Благодарю. – Infotechie

+0

@Infotechie Он имеет тот же порядок, что и в файле конфигурации сверху вниз. Посмотрите на тег 'interceptor-stack'. –

Смежные вопросы