ОК, это последний ]
, который вызывает проблемы.При использовании
<h:outputText value="[#{item}]"/>
ответ XML на запрос ajax выглядит следующим образом:
<?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})"/>
XML-ответ на запрос ajax выглядит следующим образом:
<?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 или в синтаксическом анализаторе ответов XML JS, но теперь мы по крайней мере знаем причину.Я сообщу о проблеме ребятам из Мохарры, рано или поздно, когда прибьём.
Обновление : ОК, я прибил её ещё ниже: это обработчик ответа ajax PrimeFaces и JSXML-парсер, который делает это неправильно.При использовании h:commandLink
Mojarra вместо p:commandLink
он работает нормально.
<h:commandLink value="Display" actionListener="#{myBean.setDisplay}">
<f:ajax render=":table" />
</h:commandLink>
Обработчик ответа ajax Mojarra не печатает ненужные блоки CDATA после каждого ]
.Это может быть основной причиной в PrimeFaces.
Обновление : проблема сообщена ребятам из PF: http://code.google.com/p/primefaces/issues/detail?id=1282