假设我有以下构造在很多地方污染了我的JSF代码的简单性:
<p:calendar id="decisionDate"
effect="explode"
yearRange="2000:2100"
pattern="MM/dd/yyyy"
navigator="true" display="inline"
value=""
label="Decision Date"
maxlength="10"
size="20">
<f:convertDateTime pattern="MM/dd/yyyy" />
</p:calendar>
可以看出,它有九(9)个属性和一个嵌套标签。这是用你的眼睛消耗的大量乏味细节。
我是否可以通过与PrimeFaces
类似的方式重复使用CSS
代码:将复杂的代码定义保存为<px:myCalendar/>
,并使用上述参数减去ID值,这应该是尽管如此,为每个使用实例设置,其中px
将是我的命名空间,然后每次我需要调用它时,我只会说<px:myCalendar id="uniqueCalID"/>
和...... BOOM ......那就是所有的反复杂乱?
POST ANSWER EDIT:查看this tutorial
答案 0 :(得分:1)
您可以定义复合组件。它是用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:attribute>
中的<cc:interface>
元素是我们复合组件的输入。
<?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类,每次使用组件时都会实例化。