JSF 2 复合组件渲染问题

Posted

技术标签:

【中文标题】JSF 2 复合组件渲染问题【英文标题】:JSF 2 Composite Component rendering problem 【发布时间】:2011-09-28 15:26:26 【问题描述】:

我的复合组件 (cc) 创建了一个 inputText-Field。重要的部分是,它的呈现取决于模型属性“可见”。模型通过参数 "name" 提供给组件。

<cc:interface>
  <cc:attribute name="name" required="true"/>
</cc:interface>
<cc:implementation componentType="ch.sbi.pt.components.PMSInputText">
      <h:inputText value="#cc.attrs.name.value" rendered="#cc.attrs.name.visible"/>
</cc:implementation>

在视图中,我有一个具有 2 个单元格/行的 panelGrid:第一行有一个标签和我的 cc,第二个并不重要。标签使用与我的 cc 相同的模型属性呈现自己。

<h:panelGrid columns="2">  
   <h:outputText value="Name" rendered="#person.name.visible"/>
   <sbic:pmsInputText name="#person.name"/> 
   <h:outputText value="Next Label"/>
   <sbic:pmsInputText name="#something.name"/>
</h:panelGrid>

如果“visible”-property 返回“false”,结果(和问题)如下: 没有任何组件被渲染(完美!)但是 cc 生成的 html 会留下一个空单元格(例如&lt;td&gt;&lt;/td&gt;),这会导致布局丑陋的 HTML 表格(偏移一个单元格):

<table>
<tbody>
<tr>
<td></td>
<td>Next Label</td>
</tr>
....

据我了解,这与生命周期有关(jstl 与 jsf):我的 cc 在 &lt;h:outputText../&gt; 之前呈现,但我怎样才能摆脱空单元格(例如 &lt;td&gt;&lt;/td&gt;)?我在这里错过了什么吗?

感谢您的帮助,专家! 马克

【问题讨论】:

“JSTL vs JSF”是什么意思?这里面没有任何 JSTL 的东西。您不会混淆/误解什么是 JSTL 吗?继续阅读:***.com/tags/jstl/info 是的,我是。我的错。谢谢。 【参考方案1】:

这是完全可以预料的。复合组件被渲染。只有它的孩子不是。您需要将 rendered 属性移动到复合组件。

<sbic:pmsInputText name="#person.name" rendered="#person.name.visible" /> 

【讨论】:

好的,我明白了问题所在。谢谢你。我对该组件的意图是封装“渲染”和“只读”属性以提高效率并增加可读性(仅 xhtml 中的名称属性)。我接到命令用 jsf 制作一个小型 webapp 的原型,我想用简洁明了的代码打动人心,以消除由于复杂性而对 jsf 产生的疑虑。 您可能会发现复合组件 wiki 页面中的示例更有用。将鼠标放在问题下方的 [composite-component] 标签上方,等待弹出窗口显示,然后单击其中的 info 链接:***.com/tags/composite-component/info 对于标签/输入/消息组,您希望请改用简单的标记文件。你可以在这个答案中找到一个例子:***.com/questions/5713718/… 再次感谢您,BalusC。我将使用建议的标签文件。你拯救了我的一天,因为我被困在这...

以上是关于JSF 2 复合组件渲染问题的主要内容,如果未能解决你的问题,请参考以下文章

jsf 2.0 自定义组件/标签不复合

JSF 2 - 如何将 Ajax 侦听器方法添加到复合组件接口?

JSF拒绝处理深层嵌套的复合组件。不,真的:“JSF1098:[...]这浪费了处理器时间[...]”

如何在 JSF 2 中以编程方式或动态创建复合组件

JSF 2——在 f:ajax 上具有可选监听器属性的复合组件

JSF 2.2 ViewScoped Bean 被多次创建