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

常用链接

我参与的团队

随笔分类(103)

搜索

  •  

积分与排名

  • 积分 - 410546
  • 排名 - 134

最新评论

阅读排行榜

         最近一直在用JSF,遇到了一些很奇怪的事情,昨天花了点时间仔细分析了一下,找到了一个主要问题,就是JSFJSTL之间的互操作存在着兼容性问题。(JSTL使用的是Apache的基于1.1 Spec的实现,JSFmyfaces 1.1.1,实现了JSF 1.1 Spec)

         一、<h:dataTable>中列表显示一个List中的内容,每行有几个操作的按钮,因为有一个功能是一个开关,当它的状态是Start的时候,显示的按钮是Stop,当它是Stop的时候,显示Start按钮。

         起初的实现方法是:在dataTable中的<h:column>使用<c:if>判断当前状态,并决定显示哪个按钮。

         代码如下:

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

                   <h:graphicImage…..>

         </c:if>

         运行结果:任何情况下都会显示出这个按钮。

         接着,做了如下的测试。

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

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

         二、系统需要通过一个<h:dataTable>显示一个List中的内容,当这个List中没有数据时,则不显示该dataTable

         起初的写法是这样的:

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

                   <h:dataTable….>

         </c:if>

         这样在没有数据的时候不会显示出表格,有数据的时候可以正常显示出表格。看上去似乎正常,但是在处理以下需求的时候又出现了奇怪的问题,页面中有个固定的表格1,显示一些固定的数据,同一页面中有一个菜单,点击不同的菜单项的时候,会加载项目对应的数据并生成表格2

当点击某一菜单后没有对应的数据,这时表格2为空,这时再点有对应数据的菜单,这时候,数据正常加载,表格2正常显示,但奇怪的是,表格1却出现的奇怪的现象,里面的操作按钮全部都不显示了,再点击一次,又恢复正常了。

查找了一些相关的资料,找到了一些更详细的解释。

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自己迭代产生的,这些数据并不能被JSTL或者其他的非JSF Tag使用,同样,使用<c:forEach>这样的非JSF Tag迭代产生的数据也不能够被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 阅读(4025) 评论(0)  编辑  收藏 所属分类: JSF & Myfaces

只有注册用户登录后才能发表评论。


网站导航: