JSF - 自定义标签



JSF 为开发者提供了强大的能力来定义自己的自定义标签,这些标签可用于呈现自定义内容。

在 JSF 中定义自定义标签是一个三步过程。

步骤 描述
1a 创建一个 xhtml 文件,并使用ui:composition标签在其中定义内容
1b 创建一个标签库描述符(.taglib.xml 文件),并在其中声明上述自定义标签。
1c 在 web.xml 中注册标签库描述符

步骤 1a:定义自定义标签内容:buttonPanel.xhtml

<h:body>
   <ui:composition> 
      <h:commandButton type = "submit" value = "#{okLabel}" />
      <h:commandButton type = "reset" value = "#{cancelLabel}" /> 
   </ui:composition>
</h:body>

步骤 1b:定义标签库:tutorialspoint.taglib.xml

顾名思义,标签库是一个标签库。下表描述了标签库的重要属性。

序号 节点及描述
1

facelet-taglib

包含所有标签。

2

namespace

标签库的命名空间,必须唯一。

3

tag

包含单个标签

4

tag-name

标签名称

5

source

标签实现

<facelet-taglib>
   <namespace>https://tutorialspoint.com/facelets</namespace>
   <tag>
      <tag-name>buttonPanel</tag-name>
      <source>com/tutorialspoint/buttonPanel.xhtml</source>
   </tag>
</facelet-taglib>

步骤 1c:注册标签库:web.xml

<context-param>
   <param-name>javax.faces.FACELETS_LIBRARIES</param-name>
   <param-value>/WEB-INF/tutorialspoint.taglib.xml</param-value>
</context-param>

在 JSF 中使用自定义标签是一个两步过程。

步骤 描述
2a 创建一个 xhtml 文件并使用自定义标签库的命名空间
2b 像使用普通的 JSF 标签一样使用自定义标签

步骤 2a:使用自定义命名空间:home.xhtml

<html xmlns = "http://www.w3.org/1999/xhtml"   
   xmlns:h = "http://java.sun.com/jsf/html"
   xmlns:ui = "http://java.sun.com/jsf/facelets">
   xmlns:tp = "https://tutorialspoint.com/facelets">

步骤 2b:使用自定义标签:home.xhtml

<h:body>
   <tp:buttonPanel okLabel = "Ok" cancelLabel = "Cancel" /> 		
</h:body>

示例应用程序

让我们创建一个测试 JSF 应用程序来测试 JSF 中的模板标签。

步骤 描述
1 创建一个名为helloworld的项目,放在com.tutorialspoint.test包下,如JSF - 第一个应用程序章节所述。
2 WEB-INF目录下创建com文件夹。
3 WEB-INF > com目录下创建tutorialspoint文件夹。
4 WEB-INF > com > tutorialspoint文件夹下创建buttonPanel.xhtml文件。按如下说明修改它。
5 WEB-INF文件夹下创建tutorialspoint.taglib.xml文件。按如下说明修改它。
6 按如下说明修改WEB-INF文件夹下的web.xml文件。
7 按如下说明修改home.xhtml。保持其余文件不变。
8 编译并运行应用程序以确保业务逻辑按要求工作。
9 最后,将应用程序构建成 war 文件并将其部署到 Apache Tomcat Web服务器。
10 使用最后一步中说明的适当 URL 启动您的 Web 应用程序。

buttonPanel.xhtml

<?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:ui = "http://java.sun.com/jsf/facelets">
   
   <h:body>
      <ui:composition> 
         <h:commandButton type = "submit" value = "#{okLabel}" />
         <h:commandButton type = "reset" value = "#{cancelLabel}" /> 
      </ui:composition>
   </h:body>
</html>

tutorialspoint.taglib.xml

<?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>https://tutorialspoint.com/facelets</namespace>
   
   <tag>
      <tag-name>buttonPanel</tag-name>
      <source>com/tutorialspoint/buttonPanel.xhtml</source>
   </tag>
</facelet-taglib>

web.xml

<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
   <display-name>Archetype Created Web Application</display-name>
   <context-param>
      <param-name>javax.faces.PROJECT_STAGE</param-name>
      <param-value>Development</param-value>
   </context-param>	
   
   <context-param>
      <param-name>javax.faces.FACELETS_LIBRARIES</param-name>
      <param-value>/WEB-INF/tutorialspoint.taglib.xml</param-value>
   </context-param>
   
   <servlet>
      <servlet-name>Faces Servlet</servlet-name>
      <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
   </servlet>
   
   <servlet-mapping>
      <servlet-name>Faces Servlet</servlet-name>
      <url-pattern>*.jsf</url-pattern>
   </servlet-mapping>
</web-app>	

home.xhtml

<?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:ui = "http://java.sun.com/jsf/facelets"
   xmlns:tp = "https://tutorialspoint.com/facelets">
   
   <h:head>
      <title>JSF tutorial</title>			
   </h:head>
   
   <h:body>
      <h1>Custom Tags Example</h1>
      <tp:buttonPanel okLabel = "Ok" cancelLabel = "Cancel" />
   </h:body>
</html>

完成所有更改后,让我们像在 JSF - 第一个应用程序章节中那样编译并运行应用程序。如果您的应用程序一切正常,这将产生以下结果。

JSF custom tag
jsf_facelets_tags.htm
广告