我有一个显示h:dataTable
的{{1}},如下所示:
ProfileNotification
当我没有 <h:dataTable value="#{myBean.profileNotifications}" var="item"
rendered="#{myBean.renderProfileNotification}">
<h:column>
<h:form>
<h:outputText value="#{item.userName} "/>
<h:outputText value="commented on your profile. "/>
<!-- <h:outputText value="[#{item.createTime}]"/> -->
</h:form>
</h:column>
</h:dataTable>
时,如果我点击item.createTime
设置commandLink
,则会打印出4个项目。但是,如果我取消注释renderProfileNotification=true
,则只打印1个项目,第一个项目。
编辑:问题是item.createTime
内的[]
。由于BalusC怀疑这是一个EL错误,我在一个小的,可读的和可重现的代码中重现我的错误。此代码在Glassfish v3.0.1 b22上运行
value
index.xhtml
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.prime.com.tr/ui">
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>TODO supply a title</title>
</h:head>
<h:body>
<h:form id="table">
<h:dataTable value="#{myBean.temp}" var="item" rendered="#{myBean.display}">
<h:column>
<h:outputText value="[#{item}]"/>
</h:column>
</h:dataTable>
</h:form>
<h:form>
<p:commandLink value="Display" actionListener="#{myBean.setDisplay}" update="table"/>
</h:form>
</h:body>
</html>
myBean.java
答案 0 :(得分:1)
我想出了什么问题。显然,将[]
放在value
属性中是不好的。我有这个:
<h:outputText value="[#{item.createTime}]"/>
如果我拿出[]
,成为
<h:outputText value="#{item.createTime}"/>
然后一切正常。必须是特殊性格之一。
答案 1 :(得分:1)
好的,这是造成问题的最后一个]
。使用时
<h:outputText value="[#{item}]"/>
ajax请求的XML响应如下:
<?xml version="1.0" encoding="UTF-8"?><partialResponse><components><component><id>table</id><output><![CDATA[
<form id="table" name="table" method="post" action="/playground/test.jsf" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="table" value="table" />
<table>
<tbody>
<tr>
<td>[Tom]]]><![CDATA[</td>
</tr>
<tr>
<td>[Peter]]]><![CDATA[</td>
</tr>
<tr>
<td>[Mike]]]><![CDATA[</td>
</tr>
<tr>
<td>[Fox]]]><![CDATA[</td>
</tr>
</tbody>
</table>
~com.sun.faces.saveStateFieldMarker~
</form>]]></output></component></components><state><![CDATA[<input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="8834103461195979522:5904029216967015556" autocomplete="off" />]]></state><callbackParams><callbackParam>{"validationFailed":false}</callbackParam></callbackParams></partialResponse>
注意不必要的CDATA块。
使用时
<h:outputText value="[#{item})"/>
ajax请求的XML响应如下:
<?xml version="1.0" encoding="UTF-8"?><partialResponse><components><component><id>table</id><output><![CDATA[
<form id="table" name="table" method="post" action="/playground/test.jsf" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="table" value="table" />
<table>
<tbody>
<tr>
<td>[Tom)</td>
</tr>
<tr>
<td>[Peter)</td>
</tr>
<tr>
<td>[Mike)</td>
</tr>
<tr>
<td>[Fox)</td>
</tr>
</tbody>
</table>
~com.sun.faces.saveStateFieldMarker~
</form>]]></output></component></components><state><![CDATA[<input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="502405171373727621:5591448575905434431" autocomplete="off" />]]></state><callbackParams><callbackParam>{"validationFailed":false}</callbackParam></callbackParams></partialResponse>
这归结为以下问题原因:ajax响应处理程序是不必要的,在部分响应中关闭并启动]
的CDATA块,而JS XML响应解析器只选择第一个用于显示。一个简单的解决方法是将]
置于值表达式之外:
<h:outputText value="[#{item}"/>]
导致以下XML响应:
<?xml version="1.0" encoding="UTF-8"?><partialResponse><components><component><id>table</id><output><![CDATA[
<form id="table" name="table" method="post" action="/playground/test.jsf" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="table" value="table" />
<table>
<tbody>
<tr>
<td>[Tom]
</td>
</tr>
<tr>
<td>[Peter]
</td>
</tr>
<tr>
<td>[Mike]
</td>
</tr>
<tr>
<td>[Fox]
</td>
</tr>
</tbody>
</table>
~com.sun.faces.saveStateFieldMarker~
</form>]]></output></component></components><state><![CDATA[<input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="-1679996061683473780:1967669133311943592" autocomplete="off" />]]></state><callbackParams><callbackParam>{"validationFailed":false}</callbackParam></callbackParams></partialResponse>
我不确定问题的根源,在ajax响应处理程序或JS XML响应解析器中,但现在我们至少知道原因。我会迟早向Mojarra家伙报告一个问题。
更新:好的,我把它进一步缩小了:它是PrimeFaces的ajax响应处理程序和JS XML解析器,它做错了。使用Mojarra h:commandLink
代替p:commandLink
时,它可以正常工作。
<h:commandLink value="Display" actionListener="#{myBean.setDisplay}">
<f:ajax render=":table" />
</h:commandLink>
Mojarra的ajax响应处理程序在每个]
之后不会打印不必要的CDATA块。这可能是PrimeFaces的根本原因。
更新:向PF小组报告的问题:http://code.google.com/p/primefaces/issues/detail?id=1282