Программно создать в вспомогательном компоненте

#java #jsf #facelets

#java #jsf #facelets

Вопрос:

На странице JSF у меня есть:

 <h:form id="form">
   <h:panelGroup id="content" layout="block"/>
</h:form>
 

В компоненте Java с привязкой к сеансу у меня есть метод:

 public void fillContent()
{
   UIComponent content = FacesContext.getCurrentInstance().getViewRoot().findComponent("form:content");
   content.getChildren().clear();
   content.getChildren().add(/*New <ui:include src="Page.xhtml"/>*/);
}
 

Какой код Java для вставки в <ui:include src="Page.xhtml"/> качестве content дочерних элементов?
Где я могу найти список для сопоставления всех имен Java в JSF?

Спасибо

Ответ №1:

К сожалению, ui:include реализован как обработчик тегов. Это означает, что он вычисляется и выполняется при построении дерева компонентов и отсутствии соответствующего класса UIComponent.

Чтобы достичь своей цели, вам придется использовать API facelets, например javax.faces.view.facelets.FaceletContext#includeFacelet, после сохранения ссылки на FaceletContext, которая доступна во время построения дерева. Это не простой подход, и я бы настоятельно рекомендовал перефразировать вашу проблему и поискать другое решение.

Я не знаю ни одного официального руководства по сопоставлению тегов с компонентами / обработчиками, я уверен, что некоторые книги, такие как «Core Java Server Faces», помогут в этом.

Для начала вы можете попробовать сделать это в facelets, что-то вроде:

 <h:form id="form">
  <ui:include src="#{content.path}"/>
</h:form>
 

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

1. Я не думаю, что primefaces предлагает что-то дополнительное для решения этой проблемы. Почему вы должны изменять свое представление программным способом? Сделать это в facelets для начала должно быть намного проще.

2. Как? Не могли бы вы объяснить мне, пожалуйста?

3. Я использовал его, он работает «совсем немного», я имею в виду, что загружает страницу (все в Ajax, без обновлений), но содержимое страницы не работает, и когда я перезагружаю страницу, она выдает ClassCastException: не удается привести простые лица. Ajax — поведение java.util.List. Не знаю, как сделать это правильно: (

4. Боюсь, ваш вопрос не содержит достаточно подробностей, чтобы ответить на него должным образом. Если все включенные варианты известны заранее, самым безопасным вариантом было бы создать раздел ui:fragment для каждого и управлять его атрибутом «средство визуализации» с помощью выражения EL.