Custom
优质
小牛编辑
131浏览
2023-12-01
JSF为开发人员提供了强大的功能来定义自己的自定义标记,可用于呈现自定义内容。
在JSF中定义自定义标记分为三个步骤。
步 | 描述 |
---|---|
1a | 创建一个xhtml文件,并使用ui:composition标签在其中定义内容 |
1b | 创建标记库描述符(.taglib.xml文件)并在其中声明上面的自定义标记。 |
1c | 在web.xml中注册标记libray描述符 |
步骤1a:定义自定义标签内容:buttonPanel.xhtml
<h:body>
<ui:composition>
<h:commandButton type = "submit" value = "#{okLabel}" />
<h:commandButton type = "reset" value = "#{cancelLabel}" />
</ui:composition>
</h:body>
步骤1b:定义标记库:xnip.taglib.xml
正如名称所提到的,Tag库是一个标签库。 下表描述了标记库的重要属性。
S.No | 节点和描述 |
---|---|
1 | facelet-taglib 包含所有标签。 |
2 | namespace 标记库的命名空间应该是唯一的。 |
3 | tag 包含单个标记 |
4 | tag-name 标签的名称 |
5 | source 标签实施 |
<facelet-taglib>
<namespace>http://xnip.cn/facelets</namespace>
<tag>
<tag-name>buttonPanel</tag-name>
<source>com/xnip/buttonPanel.xhtml</source>
</tag>
</facelet-taglib>
步骤1c:注册标记库:web.xml
<context-param>
<param-name>javax.faces.FACELETS_LIBRARIES</param-name>
<param-value>/WEB-INF/xnip.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 = "http://xnip.cn/facelets">
步骤2b:使用自定义标签:home.xhtml
<h:body>
<tp:buttonPanel okLabel = "Ok" cancelLabel = "Cancel" />
</h:body>
例子 Example Application
让我们创建一个测试JSF应用程序来测试JSF中的模板标签。
步 | 描述 |
---|---|
1 | 在cn.xnip.test包下创建一个名为helloworld的项目,如JSF - First Application一章中所述。 |
2 | 在WEB-INF目录下创建com文件夹。 |
3 | 在WEB-INF > com目录下创建xnip文件夹。 |
4 | 在WEB-INF > com > xnip文件夹下创建buttonPanel.xhtml文件。 按照以下说明修改它。 |
5 | 在WEB-INF文件夹下创建xnip.taglib.xml文件。 按照以下说明修改它。 |
6 | 修改WEB-INF文件夹下的web.xml文件,如下所述。 |
7 | 修改home.xhtml ,如下所述。 保持其余文件不变。 |
8 | 编译并运行应用程序以确保业务逻辑按照要求运行。 |
9 | 最后,以war文件的形式构建应用程序并将其部署在Apache Tomcat Webserver中。 |
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>
xnip.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>http://xnip.cn/facelets</namespace>
<tag>
<tag-name>buttonPanel</tag-name>
<source>com/xnip/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/xnip.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 = "http://xnip.cn/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 - First Application章节中那样编译和运行应用程序。 如果您的应用程序一切正常,这将产生以下结果。