2012-05-04 23 views
2

JSF的組件我有這樣的事情:不插入任何HTML

<ul>   
<li>User</li> 
<li>Admin</li> 
.. 
</ul> 

,並要渲染列表項「管理」僅當用戶實際是在角色的「管理員」。

我知道,我是這樣做的:

<ul>   
<li>User</li> 
<h:panelGroup rendered="#{request.isUserInRole('admin')}"> 
<li>Admin</li> 
</h:panelGroup> 
.. 
</ul> 

然而標記插入的,因爲h的「跨度」 - 元素:panelGroup中。

是否有一個JSF組件具有「呈現」屬性不插入任何HTML?

不幸的是,Facelets的UI:刪除/用戶界面:包括有沒有 '渲染' 屬性:

<ul>   
<li>User</li> 
<ui:remove rendered="#{request.isUserInRole('admin')}"> 
<li>Admin</li> 
</ui:remove> 
.. 
</ul> 

我應該怎麼解決這樣的情景?

+0

你可以指定是否JSF 1.2要麼jsf 2.0 –

+0

我正在使用JSF 2.0。 – nimo23

+0

當您沒有指定任何需要生成HTML的屬性時,'''不會**插入一個跨度,如'id','styleClass'等。 – BalusC

回答

5

你的意思是可以通過使用ui:fragment來實現。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
       xmlns:ui="http://java.sun.com/jsf/facelets"> 

    <ui:fragment rendered="#{action.isUserLoggedIn()}"> 
     <!-- this will only be shown to logged in users --> 
    </ui:fragment> 
</ui:composition> 
+0

Thanks - It作品!!你看到了什麼,那個UI:fragment有一個渲染屬性。根據http://docs.oracle.com/cd/E17802_01/j2ee/javaee/javaserverfaces/2.0/docs/pdldocs/facelets/index.html這個組件沒有渲染屬性(我的智能感知不顯示這個財產,或者)。但是,它的工作。 – nimo23

+0

我想知道,如果我更好地使用JSTL c:如果這種情況。作爲c:如果僅在渲染視圖時進行評估,這更有效。我對嗎? – nimo23

+0

好吧,我發現了一個類似的案例http://stackoverflow.com/questions/6015609/jsf-uifragment-rendered-performance它聲稱c:如果會更好的一個渲染案例。由於角色在運行時不會改變,我最好使用c:if。 – nimo23

3

是否有一個JSF的組件與「rendered'屬性不 插入任何HTML?

您已經有了答案,只是爲了記錄panelGroup組件不會呈現任何html,前提是您不包含id和style屬性。 例如

<ul> 
    <li>Hello</li> 
    <h:panelGroup rendered="#{expression}"> 
    <li>world</li> 
    </h:panelGroup> 
</ul> 

將呈現爲

<ul> 
<li>Hello</li> 
<li>world</li> 
</ul> 

如果表達式爲true

<ul> 
<li>Hello</li> 
</ul> 

如果表達式,如果假

+0

h:panelGroup有時不會輸出span或div? –

+0

是的,你是對的。我也工作。我爲h:panelGroup的紅色API聲明,如果缺少layout-attribute,它將被渲染爲span-element。也許我誤解了這一點。但在查看呈現的標記之後,當沒有爲h:panelgroup聲明layout或id時,(幸好)沒有span/div元素。 – nimo23