FaceletContext.includeFacelet проблема - PullRequest
2 голосов
/ 21 февраля 2012

В настоящее время я пытаюсь вставить предварительно определенные страницы 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.,

1 Ответ

0 голосов
/ 31 июля 2012

Попробуйте использовать

faceletContext.includeFacelet(centerPanelGrid.getParent(), actualPath);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...