2012-11-10 117 views
1

在我的應用程序中,我有導師和學生作爲用戶角色。我決定兩者的主頁都是一樣的。但是,導師和用戶的菜單會有所不同。我製作了.xhtml頁面tutorMenu.xhtml和student.xhtml。並且要從角色包含菜單中依賴。對於整個頁面,我使用佈局,並在每個頁面更改內容「內容部分」在UI:組成。JSF動態用戶界面:包括

在名爲menu.xhtml

<h:body> 
    <ui:composition>   
      <div class="menu_header"> 
       <h2> 
        <h:outputText value="#{msg['menu.title']}" /> 
       </h2> 
      </div> 
      <div class="menu_content"> 
       <с:if test="#{authenticationBean.user.role.roleId eq '2'}"> 
        <ui:include src="/pages/content/body/student/studentMenu.xhtml"/> 
       </с:if> 

       <с:if test= "#{authenticationBean.user.role.roleId eq '1'}"> 
        <ui:include src="/pages/content/body/tutor/tutorMenu.xhtml" /> 
       </с:if> 
      </div>  
    </ui:composition> 

我知道,使用JSTL我不更好的解決辦法,但我找不到其他。我的問題最好的決定是什麼?

+0

相關:http://stackoverflow.com/questions/3342984/jstl-in-jsf2-facelets-makes-sense – BalusC

+0

@BalusC你認爲使用h:panelGroup呈現在我的情況會更好嗎? – Ray

+1

不可以。您將最終得到兩個包含而不是一個,因爲'render'屬性是在視圖渲染時期間評估的,而不是像JSTL那樣在視圖構建期間進行評估。 – BalusC

回答

2

在這種情況下使用jstl-tags非常好,因爲Facelets有一個相應的標記處理程序(在視圖樹創建時處理)用於jstl標記並完美處理它們。在這種情況下,c:if可以阻止ui:include的處理(並添加位於包含的xhtml文件中的組件),這會導致組件樹減少和表單性能提高。 使用此方法的一個缺點是,您無法使用ajax更新這些表單部件,即更改用戶角色並使用ajax刷新表單,因爲其他角色的ui:include不再是視圖的一部分。在這種情況下,您必須執行整頁刷新。