Facelet自定义组件 - 防止渲染

时间:2010-12-03 16:40:20

标签: jsf facelets icefaces rendered-attribute custom-component

阅读this answer之后,我仍然感到难过。我同意应该避免使用JSTL,并了解其评估是如何在错误的阶段进行的。但是,根据facelets开发网站上的documentation<ui:fragment>标记似乎仅支持两个属性idbinding。因此,即使某些实现支持rendered,您似乎也很想要使用它。另一个建议是使用<h:panelGroup>,在响应中插入<div>元素可能会导致不良副作用(例如将内容从内联更改为阻止)。有没有人知道这方面的方法?特别是,我正在尝试以下方法:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns:ice="http://www.icesoft.com/icefaces/component" 
  xmlns:f="http://java.sun.com/jsf/core"
  xmlns:ui="http://java.sun.com/jsf/facelets">
  <ui:composition> 
    <ice:selectOneListbox binding="#{binding}" rendered="#{modeExisting}">
      <f:selectItems
        value="#{binding.allTagsSelectItems}" />
    </ice:selectOneListbox>
    <ice:inputText binding="#{binding.name}" />
    <ice:inputText binding="#{binding.description}" />
  </ui:composition> 
</html>

这基本上是一个列表框,用于选择具有名称和描述的元素,选中该元素后,用户可以编辑它们。我可以在块周围放置<ice:panelGroup>,并使用它的渲染属性,但同样,可能会有注入额外div的副作用。有没有办法让这项工作?

此外,值得一提的是我使用上面的自定义组件与此facelet-taglib配对:

<?xml version="1.0"?>
<!DOCTYPE facelet-taglib PUBLIC 
"-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" 
"http://java.sun.com/dtd/facelet-taglib_1_0.dtd"> 

<facelet-taglib>
  <namespace>http://www.mitre.org/asias/jsf</namespace>
  <tag>
    <tag-name>configurationTagEditor</tag-name>
    <source>../component/configurationTagEditor.xhtml</source>
  </tag>
  <tag>
    <tag-name>configurationTagSelector</tag-name>
    <source>../component/configurationTagSelector.xhtml</source>
  </tag>
  <tag>
    <tag-name>configurationTagRegexTable</tag-name>
    <source>../component/configurationTagRegexTable.xhtml</source>
  </tag>
</facelet-taglib>

允许我在我的jsf xhtml中使用它:

...
<ice:panelTab label="Existing" styleClass="configurationTagsExisting">
  <m:configurationTagEditor tag="#{configuration.existingTag}" />
</ice:panelTab>
...

1 个答案:

答案 0 :(得分:0)

  

另一个建议是使用<h:panelGroup>,但在响应中插入<div>元素

<h:panelGroup>默认情况下不会呈现<div>。它只会在您添加layout="block"时呈现。对于所有其他HTML属性(例如idstyleClass等),它只会呈现<span>。如果不存在layout属性且缺少所有其他HTML属性,则会呈现 nothing