dataTable只打印出第一个项目,如果value属性包含方括号

时间:2010-09-27 18:59:15

标签: java jsf jsf-2 primefaces

我有一个显示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

2 个答案:

答案 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