2012-11-10 78 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不再是视图的一部分。在这种情况下,您必须执行整页刷新。