当reRender h:selectOneRadio时,JSF(1.2)出现错误

时间:2013-07-15 11:04:30

标签: jsf richfaces jsf-1.2

当我通过a4j执行reRender:在h:selectOneRadio上支持Richfaces(3.3.3)时,我有一种奇怪的行为(不是每次都有)。

这是我的xhtml部分,其中包含h:selectOneRadio:

<h:selectOneRadio id="toto" value="#controller.toto}" >
   <f:selectItem itemLabel="#{bundle['oui']}"
   itemValue="#{true}" />
   <f:selectItem itemLabel="#{bundle['non']}"
   itemValue="#{false}" />
</h:selectOneRadio>
<rich:message for="toto" />

当我进入浏览器时,我得到了这个HTML代码:

<table id="formulaire:toto" >
<tbody>
<tr>
<td>
<input id="formulaire:toto:0" type="radio" onchange="A4J.AJAX.Submit('formulaire',event,{'control':this,'similarityGroupingId':'formulaire:support','parameters':{'ajaxSingle':'formulaire:toto','formulaire:support':'formulaire:support'} } )" value="true" name="formulaire:toto">
<label for="formulaire:toto:0"> oui</label>
</td>
<td>
<input id="formulaire:toto:1" type="radio" onchange="A4J.AJAX.Submit('formulaire',event,{'control':this,'similarityGroupingId':'formulaire:support','parameters':{'ajaxSingle':'formulaire:toto','formulaire:support':'formulaire:support'} } )" value="false" name="formulaire:toto" checked="checked">
<label for="formulaire:toto:1"> non</label>
</td>
</tr>
</tbody>
</table>

一切都很好。

但是当这个是另一个组件的reRender时,html会发生变化而第一个无线电元素不在表中:

<input type="radio" onchange="A4J.AJAX.Submit('formulaire',event,{'control':this,'similarityGroupingId':'formulaire:support','parameters':{'ajaxSingle':'formulaire:toto','formulaire:support':'formulaire:support'} } )" value="true" id="formulaire:toto:0" name="formulaire:toto" checked="checked">
<label for="formulaire:toto:0"> oui</label>
<table id="formulaire:toto">
<tbody>
<tr>
<td>
    <input type="radio" onchange="A4J.AJAX.Submit('formulaire',event,{'control':this,'similarityGroupingId':'formulaire:support','parameters':{'ajaxSingle':'formulaire:toto','formulaire:support':'formulaire:support'} } )" value="false" id="formulaire:toto:1" name="formulaire:toto"><label for="formulaire:toto:1"> non</label>
</td>
</tr>
</tbody>
</table>

这是一种非常奇怪的行为,它打破了我的风格。

为什么reRender打破了html代码?

感谢。

2 个答案:

答案 0 :(得分:1)

经过多次搜索后,该错误来自neko。

为了优化性能,我改变了neko的xml解析(默认为微小),这个可以打破html。

答案 1 :(得分:0)

RichFaces 3 AJAX响应与Content-Type: text/xml标头一起提供。 因此,它们应该是有效的XML,并且在浏览器端由RichFaces JavaScript客户端代码进行解析。

另一方面,从模板生成的HTML不需要是有效的XML,因此当RichFaces重新呈现模板的片段时,it tidies it up by default with the Tidy parser以避免在客户端解析问题。

通常建议使用NekoHTML替换Tidy解析器以获得更好的性能。 但是,NekoHTML在整理过程中可能会走得太远,并且会破坏一些RichFaces / JSF组件,主要是那些基于HTML元素的组件。

例如,自版本1.9.13,NekoHTML automatically adds TBODY around TR nested directly within TABLE。 降级到5.5岁版本1.9.12会恢复此行为并修复组件的重新呈现。 但这不是IMHO的选择,因为过去几年已经修复了很多问题。

根据我的经验,获得表现并避免这些问题的更好方法是:

  1. 确保模板的重新呈现部分是有效的XML

  2. 放弃整理解析器

  3. 对应的web.xml片段:

    <context-param>
      <param-name>org.ajax4jsf.xmlparser.ORDER</param-name>
      <param-value>NONE</param-value>
    </context-param>
    

    为避免一次性破坏太多,可以使用模式逐页管理转换:

    <context-param>
      <param-name>org.ajax4jsf.xmlparser.ORDER</param-name>
      <param-value>TIDY,NEKO,NONE</param-value>
    </context-param>
    <context-param>
      <param-name>org.ajax4jsf.xmlparser.TIDY</param-name>
      <param-value>/pages/tidy/.*\.xhtml</param-value>
    </context-param>
    <context-param>
      <param-name>org.ajax4jsf.xmlparser.NEKO</param-name>
      <param-value>/pages/neko/.*\.xhtml</param-value>
    </context-param>