前一段时间,我编写了自己的定制JSF组件。 但是在那个时候,JSF 1.0仍然是最新的,并且该项目没有使用maven作为构建系统。 因此,我一直想用maven编写一个自定义JSF2组件。 因此,让我们开始:

首先,我们设置一个带有两个模块的Maven项目。 这是父项目的pom.xml文件:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>martins-developer-world</groupId><artifactId>jsf-component</artifactId><packaging>pom</packaging><version>0.0.1-SNAPSHOT</version><name>jsf-component Maven Webapp</name><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><dependency><groupId>javax.faces</groupId><artifactId>jsf-api</artifactId><version>2.1</version><scope>provided</scope></dependency><dependency><groupId>com.sun.faces</groupId><artifactId>jsf-impl</artifactId><version>2.2.0</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jsp-api</artifactId><version>2.0</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version><scope>provided</scope></dependency></dependencies><build><finalName>jsf-component</finalName></build><modules><module>jsf-component-webapp</module><module>jsf-component-impl</module></modules>
</project>

如您所见,我们在顶级pom.xml中添加了JSF依赖关系,以便我们在子模块中继承它们。 因为我们将使用JBoss Application Server测试我们的Web应用程序,所以我们必须设置要提供的Maven依赖项的范围,以便我们的war文件和组件jar不会部署它们。 我们组件的实现将驻留在jsf-component-impl中,因此我们选择jar作为此模块的包装类型:

<?xml version="1.0"?>
<projectxsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><modelVersion>4.0.0</modelVersion><parent><groupId>martins-developer-world</groupId><artifactId>jsf-component</artifactId><version>0.0.1-SNAPSHOT</version></parent><artifactId>jsf-component-impl</artifactId><name>jsf-component-impl</name><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies></dependencies>
</project>

现在,让我们实现一个扩展UIOutput的Java类。 之所以选择UIOutput是因为,第一步,我只想实现一个简单的helloWorld标签,该标签将在span元素中打印作为属性给出的名字和姓氏。 由于此组件未收到任何输入,因此UIOutput适当:

package martins.developer.world.jsf.component.impl;import java.io.IOException;import javax.faces.application.ResourceDependencies;
import javax.faces.application.ResourceDependency;
import javax.faces.component.FacesComponent;
import javax.faces.component.UIOutput;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;@ResourceDependencies({ @ResourceDependency(name = "css/jsf-component.css", target = "head") })
@FacesComponent("HelloWorld")
public class HelloWorldComponent extends UIOutput {private static final String COMPONENT_FAMILY = "martins.developer.world.jsf.component.helloWorld";private enum PropertyKeys {firstName, lastName};@Overridepublic String getFamily() {return COMPONENT_FAMILY;}@Overridepublic void encodeBegin(FacesContext context) throws IOException {ResponseWriter writer = context.getResponseWriter();writer.startElement("span", this);writer.writeAttribute("class", "helloWorldClass", "");writer.writeText(String.format("Hello %s %s!", getFirstName(), getLastName()), "");writer.endElement("span");}public String getFirstName() {return (String) getStateHelper().eval(PropertyKeys.firstName, "???firstName???");}public void setFirstName(String firstName) {getStateHelper().put(PropertyKeys.firstName, firstName);}public String getLastName() {return (String) getStateHelper().eval(PropertyKeys.lastName, "???lastName???");}public void setLastName(String lastName) {getStateHelper().put(PropertyKeys.lastName, lastName);}
}

getFamily()方法是我们必须实施的唯一方法。 这里有趣的是encodeBegin()方法。 这是我们实现span标签的地方。 因为它应该具有CSS类属性,所以我们使用Writer的writeAttribute()方法添加它。 使用getter和setter方法将所得JSF标记的两个属性建模为简单属性。 这些getter和setter的实现使用JSF 2.0中提供的StateHelper。 在encodeBegin()中,我们使用吸气剂来检索用户给定的值。

有趣的是@ResourceDependencies注释。 有了这个注释,我们可以告诉JSF框架,我们有一些依赖的文件。 在这种情况下,这是一个CSS文件,位于文件夹src / main / resources / META-INF / resources / css中。
注释@FacesComponent在JSF框架的引导过程中注册了此组件。 给定名称在taglib文件中用于引用此类:

<?xml version="1.0"?>
<facelet-taglib xmlns="http://java.sun.com/xml/ns/javaee"><namespace>http://martinsdeveloperworld.wordpress.com</namespace><tag><tag-name>helloWorld</tag-name><component><component-type>HelloWorld</component-type></component></tag>
</facelet-taglib>

在src / main / resources / META-INF下的这个taglib文件中,我们定义了可用的组件,这里仅是helloWorld标签。 标签的属性是从Java类的属性派生的。

最后,我们要测试我们新创建的组件。 为此,我们设置了一个简单的JSF2 webapp项目,并将以下代码段添加到web.xml中,以声明我们要使用自定义组件:

<context-param><param-name>facelets.FACELETS_LIBRARIES</param-name><param-value>/META-INF/jsf-component.taglib.xml</param-value></context-param>

现在,我们可以编写一个简单的JSF页面,该页面引用我们的新标记:

<!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://java.sun.com/jsf/core"xmlns:h="http://java.sun.com/jsf/html"xmlns:mdw="http://martinsdeveloperworld.wordpress.com">
<h:head>
<title>Hello JSF 2!</title>
</h:head>
<h:body><h2>Hello World!</h2><mdw:helloWorld firstName="Martin" lastName="Developer"/>
</h:body>
</html>

当我们将此应用程序部署到JBoss Application Server并调用相应的URL时,我们将获得以下HTML输出:

<!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">
<head><title>Hello JSF 2!</title><link type="text/css" rel="stylesheet" href="/jsf-component-webapp/faces/javax.faces.resource/css/jsf-component.css" />
</head>
<body><h2>Hello World!</h2><span class="helloWorldClass">Hello Martin Developer!</span>
</body>
</html>

显然,我们可以看到带有CSS类和输出的span标签。 CSS文件在HTML文档的开头引用。

  • 整个项目的资源可以在GitHub上找到: https : //github.com/siom79/jsf-component 。
参考:在Martin's Developer World博客上,我们的JCG合作伙伴 Martin Mois 使用maven实现了自定义JSF 2.0组件 。

翻译自: https://www.javacodegeeks.com/2013/11/implementing-a-custom-jsf-2-0-component-with-maven.html

使用Maven实施自定义JSF 2.0组件相关推荐

  1. 开发自定义JSF组件(4) 保存状态与恢复状态

    2019独角兽企业重金招聘Python工程师标准>>> 完整的教材: 开发自定义JSF组件(1) HelloWorld 开发自定义JSF组件(2) 使用Render渲染器 开发自定义 ...

  2. android弹窗不能手动关闭_vue3.0系列:Vue3自定义PC端弹窗组件V3Layer

    今天给大家分享的是Vue3系列之自定义桌面端对话框组件v3layer. V3Layer 基于vue3.0构建的多功能PC网页端弹窗组件.拥有超过10+种弹窗类型.30+种参数配置,支持拖拽(自定义拖拽 ...

  3. web.xml.jsf_面向初学者的JSF 2.0教程

    web.xml.jsf 1.什么是JSF? JSF是Java Server Faces的首字母缩写. 它是一种服务器端处理技术,它允许将服务器端代码嵌入到网页中. 由于可以将服务器端处理和渲染代码嵌入 ...

  4. 面向初学者的JSF 2.0教程

    1.什么是JSF? JSF是Java Server Faces的首字母缩写. 它是一种服务器端处理技术,它允许将服务器端代码嵌入到网页中. 由于可以将服务器端处理和呈现代码嵌入网页本身,因此使项目的整 ...

  5. pluto.ctl_Apache Pluto,Portlet Bridge和JSF 2.0集成示例教程

    pluto.ctl In the previous Developing Portlets Using JSP & Servlet we clarified you how can we us ...

  6. web.xml.jsf_使用JSF 2.0可以更轻松地进行多字段验证

    web.xml.jsf 开发应用程序表单时最常见的需求之一是多字段验证(或跨字段验证,但我没有使用此术语,因为当我将其放在Google上时,实际上得到了一些战后图片). 我正在谈论的情况是,我们需要比 ...

  7. jsf 自定义属性_必填字段的自定义JSF验证器

    jsf 自定义属性 实现EditableValueHolder接口的JSF组件具有两个属性" required"和" requiredMessage" –一个标 ...

  8. 使用JSF 2.0可以更轻松地进行多字段验证

    开发应用程序表单时最常见的需求之一是多字段验证(或跨字段验证,但我没有使用此术语,因为当我将其放在Google上时,实际上得到了一些战后图片). 我正在谈论的情况是,我们需要比较初始日期是早于结束日期 ...

  9. 必填字段的自定义JSF验证器

    实现EditableValueHolder接口的JSF组件具有两个属性" required"和" requiredMessage" –一个标志,指示用户需要输入 ...

最新文章

  1. typedef与#define宏区别
  2. python编程有用吗-分享8点超级有用的Python编程建议
  3. arrays中copyof复制两个数组_数组,及二维数组
  4. 左神算法:猫狗队列(通过给不同实例盖时间戳的方法实现)
  5. BZip2Codec压缩、Map端压缩控制、Reduce端压缩控制……都在这份Hadoop整合压缩知识点里了!...
  6. 通过社交网络进行OWIN OAuth2身份验证
  7. 菜鸟裹裹电脑版_天猫淘宝“基本盘”放缓,阿里云、菜鸟爆发,马云迎来拐点?...
  8. 【JS教程】100+常用JS函数(方法)
  9. ZJOI2007时态同步
  10. 第二阶段:4.商业需求文档MRD:5.PRD-原型图
  11. 学生信息管理系统源码
  12. 图森未来高层动荡:CEO侯晓迪被突然免职 公开喊冤
  13. P3376 【模板】网络最大流( Edmonds-krap、Dinic、ISAP 算法)
  14. 大前端学习笔记--持续随缘更新
  15. 许路平:Gvoice千万在语音输入的那些事
  16. 院校情报福州大学计算机考研分析,福州大学情报学考研
  17. 领英大数据:经济寒冬,“全思维IT工程师”成企业新宠
  18. 近3万个斗图头像图片大全ACCESS\EXCEL
  19. 利用stm32高级定时器的重复计数实现输出精确个数的pwm波
  20. jenkins构建项目报错:java:[17,37] package xx.xx.xxx does not exist

热门文章

  1. centos7 切换中文输入法 无需安装
  2. 第9步 spring 配置 springmvc配置
  3. springboot接收浏览器发送delete请求( method not allowed 405解决方法)
  4. XML——生成 XML 文档(读入 XML的反向过程)
  5. 2021年最新springcloud配置中心不生效的版本原因
  6. java使用:: 表达式_Java 12:开关表达式
  7. jpa批量保存,事务没提交_在事务外自动保存托管JPA实体
  8. 混合多云架构_混合多云每个人都应避免的3个陷阱(第1部分)
  9. 因此,Oracle杀死了java.net
  10. java 挥发注解_Java的挥发性修饰符