JSF UIRepeat и обратная передача

#jsf #postback #facelets

#jsf #обратная передача #facelets

Вопрос:

У меня есть простая страница, на которой я использую <ui:repeat> , и она получает значение из резервного компонента.

Первоначальный запрос выдаст ему пустой список. Затем обратная передача вызовет действие, которое изменит модель, стоящую за <ui:repeat> , но она не отображается ?!

Я отладил его и увидел, что <ui:repeat> он оценивает значение на этапе восстановления, но это все. Когда он достигает ответа рендеринга, он не использует последнее значение из моего компонента. Это ожидаемое поведение?

Как я могу заставить это работать? Должен ли я писать свой собственный тег повтора?

Комментарии:

1. Это должно работать нормально, пожалуйста, включите минимальный xhtml, чтобы продемонстрировать это поведение.

2. @mrembisz Я как-то не могу воспроизвести эту ошибку. Это действительно странно, это происходит только тогда, когда сеанс является новым? Я работаю в IBM… Я попробую, но не могли бы вы мне что-нибудь предложить?

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

4. @mrembisz Я даже не могу привести вам полный пример, потому что тестовое приложение, которое я создал сейчас, не работает на glassfish, как только я добавляю myfaces в качестве реализации jsf. Реальное приложение работает на WAS8 с myfaces 2.1.3. Та же реализация myfaces ведет себя иначе в glassfish 3.1.2-b4

5. Действительно удивительно, myfaces jsf impl codi на glassfish 3.1.2-b4 разрушает функциональность CDI в JSF … трудно воспроизвести эту ошибку, но я не могу себе представить, в чем может быть проблема. тег повтора НЕ является вложенным!

Ответ №1:

Я не могу точно сказать, в чем может быть проблема без вашего кода, но это основы:

Компонент резервного копирования:

 public class ObjectService{

private DataModel objectDataModel;
private List<Object> objectList;
private Pagination paginationHelper;
private ObjectDao objectDao = new ObjectDao();
private String queryOption;

public void setQueryOption(String queryOption){
    this.queryOption = queryOption;
}

public String getQueryOption(){
    return this.queryOption;
}

public <E> PaginationHelper getPagination(final List<E> list) {
    pagination = new PaginationHelper(10) {

        @Override
        public int getItemsCount() {
            return list.size();
        }

        @Override
        public DataModel createPageDataModel() {
            return new ListDataModel(list);
        }
    };

    return pagination;
}

public void setPagination(PaginationHelper pagination) {
    this.pagination = pagination;
}

public List<Object> getObjectList(){
    this.objectList = objectDao.readObjectsWhere(queryOption);

    return this.objectList;
}

public void setObjectList(List<Object> objectList){
    this.objectList = objectList;
}

public DataModel getObjectDataModel(){
     if (objectDataModel == null) {
        objectDataModel = getPagination(getObjectList()).createPageDataModel();
    }

    return objectDataModel;
}

public void setObjectDataModel(DataModel objectDataModel){
    this.objectDataModel = objectDataModel
}

public String changeModel(){
    objectDataModel = null;     
    return null;
}

}
  

Страница XHTML:

     ...
<h:form>


    <fieldset>                   
        <label>
        <span>Option:</span>
        <h:inputText value="#{objectService.queryOption}" />
        </label>

        <h:commandButton action="#{objectService.changeModel}" value="request data" />
    </fieldset>

    <ui:repeat value="#{objectService.objectDataModel}" var="objectVar">

        <h:outputLabel value="#{objectVar.property1}" />
        <h:outputLabel value="#{objectVar.property2}" />
        <h:outputLabel value="#{objectVar.property3}" />

    </ui:repeat>

</h:form>
...