Как создать композит из существующих компонентов в JSF?
Я хотел бы знать, можно ли составить мой собственный компонент (или назвать его виджетом, объектом).
Я имею в виду, а не (например) с помощью h:panelGroup
и h:outputLabel
внутри него сделайте мой собственный h:panelMarkzzz
, как состав panelGroup и outputLabel.
возможно ли это на JSF?
2 ответов
да, можно создать композицию из существующих компонентов, как это.
Kickoff пример:
/resources/foo/group.xhtml
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:cc="http://xmlns.jcp.org/jsf/composite">
<cc:interface>
<cc:attribute name="label" type="java.lang.String" required="true" />
</cc:interface>
<cc:implementation>
<h:panelGroup>
<h:outputLabel value="#{cc.attrs.label}" />
<cc:insertChildren />
</h:panelGroup>
</cc:implementation>
</html>
/test.xhtml
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:foo="http://xmlns.jcp.org/jsf/composite/foo">
<h:head>
<title>Test</title>
</h:head>
<h:body>
<foo:group label="Label value">
<h:outputText value="This will appear after label inside the panelgroup" />
</foo:group>
</h:body>
</html>
The /foo
имя папки свободно на ваш вкус, и вы можете ссылаться на него в пространстве имен XML как http://xmlns.jcp.org/jsf/composite/XXX
. XHTML-кода filename-имя тега.
тем не менее, составные компоненты имеют последствия для производительности, и они должны использоваться только тогда, когда функциональное требование не достижимо с помощью простого include или tagfile. В вашем конкретном случае вам лучше использовать tagfile вместо этого. Составной компонент достоин только тогда, когда он вам действительно нужен для <cc:interface componentType="...">
.