2012-08-31 2 views
1

Я хочу передать флажки в CDI-Бин. postTest.values ​​ - это просто список длин.h: selectBooleanCheckbox не передает результат на карту

<h:form> 
    <h:dataTable value="#{postTest.values}" var="val"> 
     <h:column> 
      <h:outputLabel value="#{val}"/> 
     </h:column> 
     <h:column> 
      <h:selectBooleanCheckbox value="#{postTest.checked[val]}"/> 
     </h:column> 
    </h:dataTable> 
    <h:commandButton action="#{postTest.process}"/> 
</h:form> 

Метод действия должен распечатывать проверенные значения. Но он просто пуст.

@Named 
@RequestScoped 
public class PostTest { 

    List<Long> values; 
    Map<Long, Boolean> checked; 

    ... 
    public String process() { 
     logger.info(this.toString() + "Processing"); 
     for (Long l : checked.keySet()) { 
      logger.info(this.toString() + "\t" + l + ". checked: " + checked.get(l)); 
     } 

     return "index2"; 
    } 
    ... 
} 

Когда я добавить протоколирование в getChecked() метод, я могу видеть, что он просто извлекается один раз в колонку и его содержание не изменилось.

Проблема, как представляется, связаны с точкой, что postTest.values ​​ не инициализируется, когда форма передает значения. Поскольку, если я инициализирую postTest.values ​​ в конструкторе (или @PostConstruct), проверенные элементы передаются правильно.

Зачем мне нужно инициализировать postTest.values ​​ вообще после выполнения запроса POST?

Есть ли способ предотвратить это?

Или у меня есть другой вариант? Например. убедитесь, что postTest.values ​​ инициализированы правильно, не используя конструктор или @PostConstruct, поэтому я хочу передать ему значения перед инициализацией (я пробовал прослушиватели, но они, похоже, не решают этого).

Спасибо!

Tim

+0

Я подозреваю, что ваша проблема в том, что область действия невелика. Подсчет запросов рассчитывается только для рендеринга страницы - при первом доступе к странице. В форме submit (postback) создается новый bean-компонент и значения должны быть повторно инициализированы. Попробуйте увеличить масштаб до чего-то большего - например, сеанса. –

ответ

0

Вы также можете использовать MyFaces CODI @ViewAccessScoped аннотацию, если вы не хотите играть с @ConversationScoped и start() и end() методов. это расширение CDI, которое эквивалентно @ViewScoped управляемого компонента JSF. Я не проверял реализацию этой аннотации, но я вижу, что многие разработчики говорят, что это даже лучше, чем @ViewScoped аннотация.

Просто скачайте Myfaces CODI и поместите его в свой путь к классам и используйте аннотацию.

+0

MyFaces CODI позволяет использовать как '@ ViewAccessScoped', так и' @ ViewScoped' для ваших CDI-компонентов. Разница упоминается в WIKI. –

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