最近一直在用JSF,遇到了一些很奇怪的事情,昨天花了點(diǎn)時(shí)間仔細(xì)分析了一下,找到了一個(gè)主要問題,就是JSF和JSTL之間的互操作存在著兼容性問題。(JSTL使用的是Apache的基于1.1 Spec的實(shí)現(xiàn),JSF是myfaces 1.1.1,實(shí)現(xiàn)了JSF 1.1 Spec)
一、<h:dataTable>中列表顯示一個(gè)List中的內(nèi)容,每行有幾個(gè)操作的按鈕,因?yàn)橛幸粋€(gè)功能是一個(gè)開關(guān),當(dāng)它的狀態(tài)是Start的時(shí)候,顯示的按鈕是Stop,當(dāng)它是Stop的時(shí)候,顯示Start按鈕。
起初的實(shí)現(xiàn)方法是:在dataTable中的<h:column>使用<c:if>判斷當(dāng)前狀態(tài),并決定顯示哪個(gè)按鈕。
代碼如下:
<c:if test=”${item.status} == ‘IP’}”>
<h:graphicImage…..>
</c:if>
運(yùn)行結(jié)果:任何情況下都會顯示出這個(gè)按鈕。
接著,做了如下的測試。
用<h:outputText value=“#{item.status}”/> 輸出正確的值。
用<c:out value=”${item.status}”/> 沒有輸出。
二、系統(tǒng)需要通過一個(gè)<h:dataTable>顯示一個(gè)List中的內(nèi)容,當(dāng)這個(gè)List中沒有數(shù)據(jù)時(shí),則不顯示該dataTable。
起初的寫法是這樣的:
<c:if test=”${not empty myList}” var=”listTest”>
<h:dataTable….>
</c:if>
這樣在沒有數(shù)據(jù)的時(shí)候不會顯示出表格,有數(shù)據(jù)的時(shí)候可以正常顯示出表格。看上去似乎正常,但是在處理以下需求的時(shí)候又出現(xiàn)了奇怪的問題,頁面中有個(gè)固定的表格1,顯示一些固定的數(shù)據(jù),同一頁面中有一個(gè)菜單,點(diǎn)擊不同的菜單項(xiàng)的時(shí)候,會加載項(xiàng)目對應(yīng)的數(shù)據(jù)并生成表格2。
當(dāng)點(diǎn)擊某一菜單后沒有對應(yīng)的數(shù)據(jù),這時(shí)表格2為空,這時(shí)再點(diǎn)有對應(yīng)數(shù)據(jù)的菜單,這時(shí)候,數(shù)據(jù)正常加載,表格2正常顯示,但奇怪的是,表格1卻出現(xiàn)的奇怪的現(xiàn)象,里面的操作按鈕全部都不顯示了,再點(diǎn)擊一次,又恢復(fù)正常了。
查找了一些相關(guān)的資料,找到了一些更詳細(xì)的解釋。
JSF Spec (Section 9.2.8) 中有如下定義:
n JSF component custom actions nested inside a custom action that conditionally renders its body (such as JSTL’s <c:if> or <c:choose>) must contain a manually assigned id attribute.
n JSF component custom actions may not be nested inside a custom action that iterates over its body (such as JSTL’s <c:forEach>). Instead, you should use a Renderer that performs its own iteration (such as the Table renderer used by <h:dataTable>).
dataTable中的每一行是由dataTable自己迭代產(chǎn)生的,這些數(shù)據(jù)并不能被JSTL或者其他的非JSF Tag使用,同樣,使用<c:forEach>這樣的非JSF Tag迭代產(chǎn)生的數(shù)據(jù)也不能夠被JSF使用。
那么怎樣解決上面的問題呢?
JSF Core Library中大部分Tag都有rendered這樣的屬性,這個(gè)屬性用來控制該組件是否輸出,我們只要把原先寫在<c:if>中的判斷表達(dá)式放到這里面就可以達(dá)到和<c:if>控制輸出一樣的效果了。
<h:dataTable id="myTable" value="#{backingBean.myList}" var="item"
rendered="#{not empty backingBean.myList}">
……
</h:dataTable>
同樣的,這樣也可以解決前面那個(gè)按鈕顯示的問題。
有消息說,在新的JSF 1.2 Spec和JSP 2.1 Spec中將會努力解決這樣的問題,讓我們拭目以待吧。
posted on 2005-12-15 15:35
steady 閱讀(4063)
評論(0) 編輯 收藏 所屬分類:
JSF & Myfaces