dataTable seulement imprimer le premier élément, si l'attribut de valeur contient crochets

StackOverflow https://stackoverflow.com/questions/3806906

  •  25-09-2019
  •  | 
  •  

Question

J'ai un h:dataTable qui affiche ProfileNotification comme ci-dessous:

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

quand je n'ai pas le item.createTime, si je clique sur un commandLink pour définir renderProfileNotification=true, il imprimer 4 articles. Cependant, si je décommenté item.createTime, il ne l'imprimer 1 point, le premier élément .

EDIT: Le problème est le [] intérieur value. Puisque BalusC pensera que c'est un bug EL, je reproduis mon bug dans un code petit, lisible et reproductible. Ce code execute sur 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;
}
}
Était-ce utile?

La solution

OK, il est le dernier ] qui est à l'origine des problèmes. Lorsque vous utilisez

<h:outputText value="[#{item}]"/>

la réponse XML de la demande ajax est la suivante:

<?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>

Notez les blocs CDATA inutiles.

Et lorsque vous utilisez

<h:outputText value="[#{item})"/>

la réponse XML de la demande ajax est la suivante:

<?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>

Cela revient à la cause du problème suivant: le gestionnaire de réponse Ajax est inutile et la fermeture à partir d'un bloc CDATA pour une ] en réponse partielle et l'analyseur de réponse XML JS ne capte que la première pour l'affichage. Une solution facile est de placer le ] en dehors de l'expression de valeur:

<h:outputText value="[#{item}"/>]

qui se traduit par la réponse XML suivant:

<?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>

Je ne sais pas encore où le problème est enraciné, dans le gestionnaire de réponse ajax ou dans l'analyseur de réponse XML JS, mais maintenant on au moins la cause. Je signaler un problème aux gars Mojarra tôt ou tard, une fois clouées.


Mise à jour : OK, je cloue plus bas: il est le gestionnaire de réponse ajax et de PrimeFaces analyseur XML JS qui fait ce mal. Lorsque vous utilisez un de h:commandLink de Mojarra au lieu de p:commandLink il fonctionne très bien.

<h:commandLink value="Display" actionListener="#{myBean.setDisplay}">
    <f:ajax render=":table" />
</h:commandLink>

gestionnaire de réponse ajax de Mojarra n'imprime pas des blocs CDATA inutiles après chaque ]. Cela pourrait être la cause racine dans PrimeFaces.


Mise à jour : problème signalé aux gars PF: http://code.google.com/p/primefaces/issues/detail?id=1282

Autres conseils

Je figure ce qui est faux. Apparente, mettant [] l'intérieur attribut value est mauvais. Ce que j'est le suivant:

<h:outputText value="[#{item.createTime}]"/>

si je prends le [], pour devenir

<h:outputText value="#{item.createTime}"/>

alors tout fonctionne bien. Doit être l'une des choses de caractère spécial.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top