В настоящее время я пытаюсь вставить предварительно определенные страницы jsf в определенную часть главной страницы jsf.Я смог добиться этого полу-успешно, используя следующее:
public void includeFacelet(String pageString){
//NOTE SEE BELOW
centerPanelGrid.getParent().getChildren().clear();
centerPanelGrid.getChildren().clear();
String actualPath = "faceletFolder/".concat(pageString).concat(".xhtml");
try{
FacesContext facesContext = FacesContext.getCurrentInstance();
FaceletContext faceletContext = (FaceletContext)facesContext.getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY);
faceletContext.includeFacelet(centerPanelGrid, actualPath);
}catch(IOException ex){
...
}
}
Где centerPanelGrid - это переменная поля в моем управляемом компоненте (dynamicComponentBean), который связан с HtmlPanelGrid на главной странице jsf иПеременная actualPath - это относительный путь, указывающий местоположение страницы jsf.
Что касается примечания, то может показаться бессмысленным иметь эту строку (поверьте, я понимаю, что), однако во всех моихпроверяет, не было ли у меня этой строки, тогда, когда я пошел, чтобы включить страницу jsf, она не включала бы ничего ...
Это схема главной страницы jsf:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui">
<h:head>
<title>User Page</title>
</h:head>
<h:body>
<p:layout fullPage="true">
<p:layoutUnit position="north" size="45" header="header"/>
<p:layoutUnit position="south" size="100" resizable="true">
[Footer Text]
</p:layoutUnit>
<p:layoutUnit position="west" size="200" resizable="true">
[West Content]
</p:layoutUnit>
<p:layoutUnit position="east" size="200" resizable="true">
[East Content]
</p:layoutUnit>
<p:layoutUnit position="center" resizable="true" id="dynamicLayout">
<h:panelGrid id="dynamicContent" binding="#{dynamicComponentBean.centerPanelGrid}"/>
</p:layoutUnit>
</p:layout>
</h:body>
</html>
И небольшой пример страницы, которая может быть вставлена в centerPanelGrid, будет выглядеть следующим образом:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<title>Reports Interface</title>
</h:head>
<h:body>
<h:form>
<h:panelGrid columns="3" columnClasses="rightalign,leftalign,leftalign">
<h:outputText value="Find Daily Report"/>
<p:calendar id="dailyCalendar" value="#{reports.dailyDate}" mode="popup" effect="slide"/>
<h:commandButton id="findDailyReport" value="Search" action="#{dynamicComponentBean.includeFacelet('navString')}"/>
</h:panelGrid>
<h:message for="dailyCalendar"/>
</h:form>
</h:body>
</html>
Если navString - это любая строка, которую я передаю ей, чтобы метод includeFacelet мог получить соответствующий jsf длявставить следующий.
Моя проблема возникает, когда я пытаюсь использовать командную кнопку для навигации, мне нужно нажать ее дважды, чтобыrk, при первом нажатии создается впечатление, что он обновляет страницу или что-то в этом роде, а затем последующий щелчок позволяет мне включить правильный centerlet в centerPanelGrid.
Я провел обширную отладку на issuse и обнаружил, чтово время первого щелчка он не вызывает ни одного метода внутри какого-либо из моих управляемых bean-компонентов и фактически не входит ни в один мой код.Я понятия не имею, почему он делает это или что мне нужно сделать, чтобы он включал нужный мне фасет и имел нормальную навигацию.
По сути, эти веб-страницы взяты из дополнительного корпоративного приложения, котороебыл разработан отдельно и интегрирован в существующую систему.Текущая система генерирует все страницы вручную, создавая Java-объекты, которые представляют все различные компоненты UIC, и помещая их в соответствующие места.Несмотря на то, что кроме создания отдельных сессионных компонентов Stateles для генерации всех этих различных страниц аналогичным образом, я настроил его так, чтобы он знал, когда эти страницы вызываются из интегрированного приложения, и вместо этого помещал их в панель динамических компонентов с помощью метода includeFacelet.,