Как получить доступ к параметрам POST, если проверка не удалась

Мне нужно показать страницу ответа в зависимости от некоторых полей ввода. Например. табид inputHidden ниже:

#{controllerBean.tabId}
...
<h:form id="edit">
  <h:inputHidden value="#{controllerBean.tabId}" id="tabid" />
  <h:inputText value="#{controllerBean.name}" id="name" />
</h:form>

Но когда какой-либо другой ввод в той же форме имеет ошибку проверки (например, «имя» inputText). Значение «controllerBean.tabId» не будет присвоено, так как JSF возвращает значение на этапе проверки.

Мне все еще нужен tabId, чтобы правильно отображать страницу и иметь в виду 2 идеи:

#{param['edit:tabid']}

или используйте привязку:

#{tabId.value}
<h:inputHidden value="#{controllerBean.tabId}" id="tabid" binding="tabId" />

Мой вопрос в том, что из этих двух лучше или лучше всего? Или есть еще лучшие способы сделать это?


Обновить:

Примечание. В моем конкретном случае табид устанавливается клиентским javascript.

  1. Ответ сервера с несколькими элементами в html.
  2. Javascript помещает эти элементы в разные вкладки на странице.
  3. Одна из вкладок POST данных на сервер с текущим табидом в форме.

Поэтому моему серверу нужно знать tabid, чтобы показать страницу ответа с выбранной правильной вкладкой.


person Kai    schedule 31.10.2013    source источник
comment
но где вам это нужно в управляемом бине, но если произойдет ошибка проверки, ваш управляемый бин не будет вызван.   -  person BholaVishwakarma    schedule 31.10.2013
comment
Это не мой боб нужен, а моя страница. В частности, моей странице нужен табид, чтобы знать, какую вкладку отображать.   -  person Kai    schedule 31.10.2013
comment
У тебя есть шанс пойти с @ViewScoped? Это позволит вам сохранить текущий идентификатор вкладки в компоненте.   -  person Xtreme Biker    schedule 31.10.2013
comment
Табид задается клиентским javascript, поэтому на исходной странице его нет. Я думаю, что область просмотра тоже не помогает (без использования ajax) :( Обновил вопрос с моим конкретным случаем.   -  person Kai    schedule 01.11.2013
comment
Вам нужно tabId для других целей в bean-компоненте? Или у вас есть только свойство + геттер + сеттер, которого нигде больше нет в bean-компоненте, используемом, например, во время действия?   -  person BalusC    schedule 01.11.2013
comment
Балус, до сих пор я не вижу другого использования tabId, он только отправляется обратно в браузер, чтобы показать правильную вкладку.   -  person Kai    schedule 03.11.2013


Ответы (3)


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

 <h:form id="edit">
     <h:inputHidden value="#{controllerBean.tabId}" id="tabid">
         <f:event type="preValidate" listener="#{controller.grabTabId}"/>
     </h:inputHidden>
     <h:inputText value="#{controllerBean.name}" id="name" />
 </h:form>

Это регистрирует прослушиватель для запуска непосредственно перед фазой проверки запроса. Теперь у вас есть прослушиватель, определенный в вашем вспомогательном компоненте, который будет выглядеть так:

   public void grabTabId(ComponentSystemEvent cse){
     //obtain a reference to the component
     HtmlInputHidden hiddenElement = (HtmlInputHidden)cse.getComponent(); 
     //get the value from the component.
     String hiddenValue = hiddenElement.getValue();
   }
person kolossus    schedule 04.11.2013

<h:form id="edit">
 <h:inputHidden value="#{controllerBean.tabId}" id="tabid" />
 <h:inputText value="#{controllerBean.name}" id="name" >
  <p:ajax process="tabid" immediate="true" event="keyup" />
 </h:inputText>
</h:form>

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

person BholaVishwakarma    schedule 31.10.2013
comment
Спасибо за быстрый ответ. Мой controllerBean находится в requestScoped, я думаю, что способ ajax не будет работать? - person Kai; 31.10.2013
comment
@Kai, тогда используй хотя бы @ViewScoped. И я не буду рекомендовать использовать ajax для каждой клавиши, это может быть много запросов на новый символ в тексте. - person Luiggi Mendoza; 31.10.2013
comment
Табид задается клиентским javascript, а на исходной странице его нет. Поэтому я думаю, что область просмотра тоже не помогает (без использования ajax) :( Обновил вопрос с моим конкретным случаем - person Kai; 01.11.2013

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

Поскольку обновление значений модели при неудачной проверке противоречит жизненному циклу JSF, я думаю, что любое решение будет чем-то вроде взлома.

person jdessey    schedule 31.10.2013