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