#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>
...