隨筆 - 170  文章 - 536  trackbacks - 0
          <2005年12月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          我參與的團隊

          隨筆分類(103)

          搜索

          •  

          積分與排名

          • 積分 - 414347
          • 排名 - 135

          最新評論

          閱讀排行榜

                   最近一直在用JSF,遇到了一些很奇怪的事情,昨天花了點時間仔細分析了一下,找到了一個主要問題,就是JSFJSTL之間的互操作存在著兼容性問題。(JSTL使用的是Apache的基于1.1 Spec的實現(xiàn),JSFmyfaces 1.1.1,實現(xiàn)了JSF 1.1 Spec)

                   一、<h:dataTable>中列表顯示一個List中的內容,每行有幾個操作的按鈕,因為有一個功能是一個開關,當它的狀態(tài)是Start的時候,顯示的按鈕是Stop,當它是Stop的時候,顯示Start按鈕。

                   起初的實現(xiàn)方法是:在dataTable中的<h:column>使用<c:if>判斷當前狀態(tài),并決定顯示哪個按鈕。

                   代碼如下:

                   <c:if test=”${item.status} == ‘IP’}”>

                             <h:graphicImage…..>

                   </c:if>

                   運行結果:任何情況下都會顯示出這個按鈕。

                   接著,做了如下的測試。

                   <h:outputText value=“#{item.status}”/>     輸出正確的值。

                   <c:out value=”${item.status}”/>                  沒有輸出。

                   二、系統(tǒng)需要通過一個<h:dataTable>顯示一個List中的內容,當這個List中沒有數(shù)據(jù)時,則不顯示該dataTable

                   起初的寫法是這樣的:

                   <c:if test=”${not empty myList}” var=”listTest”>

                             <h:dataTable….>

                   </c:if>

                   這樣在沒有數(shù)據(jù)的時候不會顯示出表格,有數(shù)據(jù)的時候可以正常顯示出表格。看上去似乎正常,但是在處理以下需求的時候又出現(xiàn)了奇怪的問題,頁面中有個固定的表格1,顯示一些固定的數(shù)據(jù),同一頁面中有一個菜單,點擊不同的菜單項的時候,會加載項目對應的數(shù)據(jù)并生成表格2

          當點擊某一菜單后沒有對應的數(shù)據(jù),這時表格2為空,這時再點有對應數(shù)據(jù)的菜單,這時候,數(shù)據(jù)正常加載,表格2正常顯示,但奇怪的是,表格1卻出現(xiàn)的奇怪的現(xiàn)象,里面的操作按鈕全部都不顯示了,再點擊一次,又恢復正常了。

          查找了一些相關的資料,找到了一些更詳細的解釋。

          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自己迭代產生的,這些數(shù)據(jù)并不能被JSTL或者其他的非JSF Tag使用,同樣,使用<c:forEach>這樣的非JSF Tag迭代產生的數(shù)據(jù)也不能夠被JSF使用。

          那么怎樣解決上面的問題呢?

          JSF Core Library中大部分Tag都有rendered這樣的屬性,這個屬性用來控制該組件是否輸出,我們只要把原先寫在<c:if>中的判斷表達式放到這里面就可以達到和<c:if>控制輸出一樣的效果了。

          <h:dataTable id="myTable" value="#{backingBean.myList}" var="item"

          rendered="#{not empty backingBean.myList}">

          ……

                   </h:dataTable>

                   同樣的,這樣也可以解決前面那個按鈕顯示的問題。

                   有消息說,在新的JSF 1.2 SpecJSP 2.1 Spec中將會努力解決這樣的問題,讓我們拭目以待吧。

          posted on 2005-12-15 15:35 steady 閱讀(4064) 評論(0)  編輯  收藏 所屬分類: JSF & Myfaces
          主站蜘蛛池模板: 竹溪县| 寻甸| 罗田县| 河间市| 乌兰县| 乐昌市| 玉龙| 当雄县| 白城市| 上犹县| 县级市| 玉屏| 凤城市| 大庆市| 九龙坡区| 鸡泽县| 宁强县| 子长县| 剑川县| 确山县| 南昌县| 秦安县| 马鞍山市| 隆化县| 湾仔区| 普格县| 嵩明县| 祁东县| 吉隆县| 垫江县| 延安市| 邯郸市| 湘乡市| 饶河县| 南漳县| 柯坪县| 太白县| 偏关县| 黑河市| 农安县| 花莲县|