在上一篇文章中,我们讨论了Mojarra 2.0.0 PR中令人烦恼的问题,即空属性被渲染到最终的HTML代码中。这个问题被发布到Mojarra项目: https://javaserverfaces.dev.java.net/issues/show_bug.cgi?id=940
现在,它已经修复了。让我们看看Mojarra 2.0.0的新版本。这不是PR版本,而是2008年1月27日的SNAPSHOT。
SNAPSHOT有两个惊喜。
首先,我们可以使用c:if来进行条件插入。我们在第2部分讨论了这个问题。
其次,已经没有了composite:insertChildren标签。这个标签被替换为composite:renderUsingPageChildren。它在语义上更正确,但需要一些时间来记忆。
好的,这是组件的工作代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:composite="http://java.sun.com/jsf/composite">
<head>
<title>panel</title>
</head>
<body>
<composite:interface>
<composite:attribute name="style" required="false"/>
<composite:attribute name="styleClass" required="false"/>
<composite:attribute name="headerClass" required="false"/>
<composite:attribute name="bodyClass" required="true"/>
</composite:interface>
<composite:implementation>
<h:outputStylesheet name="rich/css/panel.css" />
<div class="rich-panel #{compositeComponent.attrs.styleClass}"
style="#{compositeComponent.attrs.style}"
onclick="#{compositeComponent.attrs.onclick}"
ondblclick="#{compositeComponent.attrs.ondblclick}"
onkeydown="#{compositeComponent.attrs.onkeydown}"
onkeypress="#{compositeComponent.attrs.onkeypress}"
onkeyup="#{compositeComponent.attrs.onkeyup}"
onmousedown="#{compositeComponent.attrs.onmousedown}"
onmousemove="#{compositeComponent.attrs.onmousemove}"
onmouseout="#{compositeComponent.attrs.onmouseout}"
onmouseover="#{compositeComponent.attrs.onmouseover}"
onmouseup="#{compositeComponent.attrs.onmouseup}">
<c:if test="#{! empty compositeComponent.facets.header}">
<div class="rich-panel-header #{compositeComponent.attrs.headerClass}">
<composite:insertFacet name="header"/>
</div>
</c:if>
<div class="rich-panel-body #{compositeComponent.attrs.bodyClass}" >
<composite:renderUsingPageChildren />
</div>
</div>
</composite:implementation>
</body>
</html>
这是一个部署的示例: http://livedemo.exadel.com/richfaces4-panel-4a/home.jsf
如果您查看结果HTML代码,您会看到不再插入空属性。