java - dataTable仅打印第一项,如果value属性包含方括号

标签 java jsf jsf-2 primefaces

我有一个 h:dataTable,它显示 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来设置renderProfileNotification=true,它会打印出4个项目。但是,如果我取消注释 item.createTime,它只会打印出 1 个项目,第一个项目

编辑:问题是内的[]。由于 BalusC 怀疑这是一个 EL bug,因此我用一个小的、可读且可重现的代码重现了我的 bug。此代码在 Glassfish v3.0.1 b22 上运行

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

@ManagedBean(name="myBean")
@SessionScoped
public class myBean {

List<String> temp = null;

public myBean() {
}

private boolean display = false;

@PostConstruct
public void init(){
    temp = new ArrayList<String>();
    temp.add(0, "Tom");
    temp.add(1, "Peter");
    temp.add(2, "Mike");
    temp.add(3, "Fox");
}

public List<String> getTemp() {
    return temp;
}

public void setTemp(List<String> temp) {
    this.temp = temp;
}

public boolean isDisplay() {
    return display;
}

public void setDisplay() {
    this.display = !this.display;
}
}

最佳答案

好的,是最后一个 ] 引起了问题。使用时

<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 block 。

使用时

<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 block ,并且 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 block 。这可能是 PrimeFaces 的根本原因。

<小时/>

更新:向 PF 人员报告的问题:http://code.google.com/p/primefaces/issues/detail?id=1282

关于java - dataTable仅打印第一项,如果value属性包含方括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3806906/

相关文章:

java - 使用来自多个 selectOneMenus 和按钮的内容填充 inputTextArea

JSF 2.0 不渲染任何页面

html - 如何在对话框窗口中覆盖 primefaces 中的主题并设置用户定义 CSS

jsf-2 - 在另一个 ManagedBean 中获取 session 作用域 Bean 数据

java - 如何基本和简单地设置一个 Servlet 来处理和预处理 JSP 请求

java - 测试用例问题

java - 工具栏图像动画折叠样式

maven - java.lang.IllegalStateException :Could not find backup for factory javax. faces.context.FacesContextFactory

java - 在服务器上执行外部 Java 源代码 - 限制安全和资源?

java - 获取用户界面 :param value in Managed bean