使用JSF Primefaces

时间:2015-10-14 10:39:24

标签: primefaces jsf-2.2

我使用的JSF模板分为4个部分 - Header,Menubar,Content和Footer。标题包含从DB检索的应用程序名称,版本,用户名,上次登录等。菜单部分包含从DB w.r.t填充的动态菜单。用户角色和访问权限。基于菜单项,我只需刷新内容部分而无需重新加载/刷新标题,菜单栏和页脚。因此,如果菜单包含SomePage.xhtml的URL,则单击菜单项时,SomePage.xhtml应加载到内容中。我在网上检查了很多链接和解决方案,但无法使其工作。有人可以请我在这里吗?

以下代码中的所有辅助bean引用都是从数据库中检索数据。

BaseTemplate.xhtml               

<h:head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
    <h:outputStylesheet name="css/override.css" />
    <h:outputStylesheet name="css/style.css" />
</h:head>
<h:body>
    <f:loadBundle basename="messages" var="msg" />
    <f:event type="preRenderView" listener="#{homePageBean.init}" />
    <h:panelGroup id="header" layout="block">
        <ui:insert name="header">
            <ui:include src="/pages/header.xhtml" />
        </ui:insert>
    </h:panelGroup>
    <h:panelGroup id="menu" layout="block">
        <ui:insert name="menu">
            <ui:include src="/pages/menu.xhtml" />
        </ui:insert>
    </h:panelGroup>
    <h:panelGroup id="content">
        <ui:insert name="content" />
    </h:panelGroup>
    <h:panelGroup id="footer" layout="block">
        <ui:insert name="footer">
            <ui:include src="/pages/footer.xhtml" />
        </ui:insert>
    </h:panelGroup>
</h:body>
</html>

header.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">
<body>
    <ui:composition>
        <h:form id="frmHeader">
            <table class="hdrMainTbl">
                <tr>
                    <td width="10%">
                        <h:graphicImage value="images/logo.png" width="180 px"
                            height="40 px" />
                    </td>
                    <td width="65%">
                        <table class="hdrAppNmTbl">
                            <tr>
                                <td align="center">
                                    <h:outputText styleClass="appNameText"
                                        value="#{homePageBean.appName}" /> <br/>
                                    <h:outputText styleClass="appVersionText"
                                        value="#{msg['appVersion']} #{homePageBean.appVersion}" />
                                </td>
                            </tr>
                        </table>
                    </td>
                    <td width="20%">
                        <table class="hdrUserDtlsTbl">
                            <tr>
                                <td align="right"><h:outputText styleClass="baseFontStyle"
                                        value="#{msg['welcome']}" /></td>
                                <td><h:outputText styleClass="baseFontStyle"
                                        value="#{homePageBean.userName}" /></td>
                            </tr>
                            <tr>
                                <td align="right"><h:outputText styleClass="baseFontStyle"
                                        value="#{msg['lastLogin']}" /></td>
                                <td><h:outputText styleClass="baseFontStyle"
                                        value="#{homePageBean.lastLogin}" /></td>
                            </tr>
                        </table>
                    </td>
                    <td width="5%">
                        <h:commandLink action="#{homePageBean.logoutUser}">
                            <h:graphicImage id="logoutImg" value="images/logout.png" width="40 px"
                                height="40 px" title="Logout" alt="Logout" />
                        </h:commandLink>
                    </td>
                </tr>
            </table>
        </h:form>
    </ui:composition>
</body>
</html>

名为menu.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">
<body>
    <ui:composition>
        <h:form>
            <p:menubar model="#{homePageBean.menubar}" />
        </h:form>
    </ui:composition>
</body>
</html>

footer.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">
<body>
    <ui:composition>
        <table class="footerTbl">
            <tr>
                <td align="center">
                    <h:outputText value="#{msg['copyright']}" /> 
                    <h:outputLink target="_blank" value="http://www.google.com/">
                        <h:outputText value="#{msg['website']}" />
                    </h:outputLink>
                </td>
            </tr>
        </table>
    </ui:composition>
</body>
</html>

SomePage.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">
<body>
    <ui:composition template="BaseTemplate.xhtml">
        <ui:define name="content">
            <h:form>
                This is in Content section populated when one of the menu item is clicked.
            </h:form>
        </ui:define>
    </ui:composition>
</body>
</html>

1 个答案:

答案 0 :(得分:0)

这里有两个技巧:

1)检查菜单模型bean范围:

  • 如果您的菜单与用户相关,那么我猜它应该是@SessionScoped
  • 您还可以在每次动态创建菜单(在getMenuModel()中而不是bean构造函数)。效率较低但至少工作。

2)如果要刷新菜单,则必须为菜单栏组件设置id属性

val sourceRDD = val sourceRDD = sc.parallelize(1 to 100, 4)
val seedValue = 5
val splitRDD = sourceRDD.randomSplit(Array(1.0,1.0,1.0,1.0,1.0), seedValue)

splitRDD(1).collect()
res7: Array[Int] = Array(1, 6, 11, 12, 20, 29, 40, 62, 64, 75, 77, 83, 94, 96, 100)

然后使用Primefaces的更新功能,例如当用户单击特定菜单项时(Java端:在菜单栏Bean中查看)。

<p:menubar id="menuBar1" model="#{menuBean.model}" />