您可以定义复合组件。它是使用 xhtml+ jsf 命名空间定义的,但在您的情况下,它是不必要的支持组件,它是 java 类,为每个复合组件的使用实例化。
在复合组件接口中,您可以定义属性,从而改变其行为。然后在实现中,您可以插入所需的 primefaces 组件,其中包含一些硬编码属性和一些从您的复合组件调用传递的属性。
考虑这个教程:https://docs.oracle.com/javaee/6/tutorial/doc/giqzr.html
示例
复合组件是资源,所以我们把它放在/resources文件夹下面。让我们创建子文件夹/resources/myCompositeComponents 并在那里创建xhtml 文件myCalendar.xhtml。这将是我们的复合组件。基本上,它是带有额外命名空间xmlns:cc="http://java.sun.com/jsf/composite" 的xhtml 文件。这是代码。您可以注意到两个元素:<cc:interface> 和 <cc:implementation>。而<cc:interface> 中的<cc:attribute> 元素是我们复合组件的输入。
<?xml version="1.0" encoding="UTF-8"?>
<!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:f="http://xmlns.jcp.org/jsf/core"
xmlns:cc="http://java.sun.com/jsf/composite"
xmlns:p="http://primefaces.org/ui" xmlns:h="http://java.sun.com/jsf/html">
<cc:interface>
<cc:attribute name="label" default="Decision Date"/>
</cc:interface>
<cc:implementation>
<h2>#{cc.clientId}</h2>
<h:outputLabel
id="Label"
value="#{cc.attrs.label}"/>
<p:calendar id="Calendar"
effect="explode"
yearRange="2000:2100"
pattern="MM/dd/yyyy"
navigator="true" display="inline"
value=""
label="Label"
maxlength="10"
size="20">
<f:convertDateTime pattern="MM/dd/yyyy" />
</p:calendar>
</cc:implementation>
</html>
那么,让我们使用它。为了能够声明我们全新的组件,我们将在使用页面中添加额外的命名空间:xmlns:my="http://java.sun.com/jsf/composite/myCompositeComponents"。命名空间 uri 的最后一部分对应于 /resources 下的文件夹,复合组件所在的位置。给它任何你喜欢的前缀。这是源代码:
<?xml version="1.0" encoding="UTF-8"?>
<!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:my="http://java.sun.com/jsf/composite/myCompositeComponents">
<h:head>
<title>Simple JSF Facelets page</title>
</h:head>
<h:body>
<my:myCalendar id="LetsUseIt" label="MyLabel"/>
</h:body>
</html>
注意属性“label”——即在“interface”元素中声明的属性。
这是非常基本的用例,尽管它会在您的情况下有所帮助。更复杂的场景包括传递类型属性和实现支持组件 - java 类,每次使用组件时都会实例化。