使用Maven实施自定义JSF 2.0组件

前一段时间,我编写了自己的定制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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366327.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python2.7.5-虚拟环境搭建

virtualenv可以搭建虚拟且独立的python运行环境, 使得单个项目的运行环境与其它项目独立起来. virtualenv本质上是个python包, 使用pip安装: pip install virtualenv 在新建工作目录下创建虚拟环境: ~$virtualenv TestEnv 默认情况下, 虚拟环境中不包括系统的site-packages, 若…

CSS 高度(css height)

DIV CSS height高度知识教程篇 DIV CSS高度简介这里的CSS高度是指通过CSS来控制设置对象的高度。使用CSS属性单词height。单位可以使用PX&#xff0c;em等常用使用PX&#xff08;像素&#xff09;为html单位。 height高度目录height高度语法高度用法html原始高度设置css高度hei…

fst java_java快速序列化库FST

FST fast-serialization 是重新实现的 Java 快速对象序列化的开发包。序列化速度更快(2-10倍)、体积更小&#xff0c;而且兼容 JDK 原生的序列化。要求 JDK 1.7 支持。Maven&#xff1a;12 de.ruedigermoeller3 fst4 1.365示例代码&#xff1a;01// ! reuse this Object, it ca…

HOW-TO:带有Spring MVC的Tomcat中的自定义错误页面

默认的Tomcat错误页面看起来很可怕。 此外&#xff0c;它们可能会公开有价值的信息&#xff0c;包括服务器版本和异常堆栈跟踪。 Servlet规范提供了一种通过web.xml配置异常行为的方法。 可以配置对特定Java异常的响应&#xff0c;也可以配置对选定的Http响应代码的响应。 err…

第三代酷睿i3处理器_轻薄本CPU谁更强?英特尔21款低功耗处理器大排行!

点击上电脑爱好者关注我们对智能手机而言&#xff0c;其搭载的SoC是衡量性能强弱的唯一准绳&#xff0c;因为一颗SoC芯片内就集成了CPU(处理器)、GPU(显卡&#xff0c;包括集成的核显和独显)、ISP(影像处理器)和Modem(调制解调器)等模块&#xff0c;只要掌握了SoC的强弱关系&am…

**优化--后端**: 计数缓存counter_cache; rack-mini-profiler(2300) ; bullet(5000✨):侦测N+1query...

rack-mini-profiler 这个 gem,可以永远显示网页的加载时间。&#xff08;2300✨&#xff09;开发环境和产品环境都可以用。&#xff08;生成非常详细的报告&#xff09; development环境,直接使用gem rack-mini-profilerproduction环境&#xff0c;1. gem rack-mini-profiler,…

python学习日记(匿名函数)

匿名函数 简介 匿名函数&#xff1a;为了解决那些功能很简单的需求而设计的一句话函数。 python 使用 lambda 来创建匿名函数。 所谓匿名&#xff0c;意即不再使用 def 语句这样标准的形式定义一个函数。 1 lambda 只是一个表达式&#xff0c;函数体比 def 简单很多。 2 lambda…

列表相关元素及其属性

HTML5保留了如下几个列表相关元素&#xff1a;无序列表<ul>、有序列表<ol>、自定义列表<dl> 1、<ul>&#xff1a;定义无序列表&#xff0c;可以指定id、style、class等属性&#xff0c;还可以指定onclick等事件属性。 2、<ol>&#xff1a;定义有…

唯一的hashCodes不足以避免冲突

有一个常见的误解&#xff0c;即如果您具有唯一的hashCode&#xff08;&#xff09;&#xff0c;则不会发生冲突。 虽然唯一或几乎唯一的hashCodes很好&#xff0c;但这还不是故事的结局。 问题在于HashMap的大小不是无限的&#xff08;或大小至少为2 ^ 32&#xff09;&#x…

Spring Boot使用AOP实现拦截某个方法

1、引入.jarl文件依赖 <!-- Spring Boot Web 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!-- 从依赖信息里移除 Tomcat配置 --><exclusions><exc…

DB 数据同步到数据仓库的架构与实践

背景 在数据仓库建模中&#xff0c;未经任何加工处理的原始业务层数据&#xff0c;我们称之为ODS&#xff08;Operational Data Store&#xff09;数据。在互联网企业中&#xff0c;常见的ODS数据有业务日志数据&#xff08;Log&#xff09;和业务DB数据&#xff08;DB&#xf…

起名与选择器~(总结类、持续更新系列)

废话没有&#xff0c;直接干活 一、起名方式&#xff1a;1.元素自身的标签名&#xff1b; 2.利用 class 属性自定义名称&#xff1b; 3.利用 id 属性自定义名称。共三种&#xff0c;其中class使用居多。 起名规范:不能用汉字起 第一个字母不能是特殊符号 第一个字母必须是英文字…

java log.error_Logger.error打印错误异常的详细堆栈信息

一、问题场景使用Logger.error方法时只能打印出异常类型&#xff0c;无法打印出详细的堆栈信息&#xff0c;使得定位问题变得困难和不方便。二、先放出结论Logger类下有多个不同的error方法&#xff0c;根据传入参数的个数及类型的不同&#xff0c;自动选择不同的重载方法。当e…

笔记本电脑怎么清理灰尘_手机声音越用越小怎么办?一段黑科技音波就能清理扬声器灰尘...

大家好&#xff0c;欢迎收看科技狐&#xff0c;我是小狐。我们都知道&#xff0c;随着手机的使用时间越来越长&#xff0c;手机扬声器里面会积赞一些灰尘。因此手机的声音就会变得越来越小。有时候连电话铃声都听不清楚&#xff0c;说实话我就是这个样子&#xff0c;为此我困扰…

Java方法中的参数太多,第8部分:工具

在我的系列文章的前七篇文章中&#xff0c;有关处理Java方法中期望的参数过多的内容集中在减少方法或构造函数期望的参数数量的替代方法上。 在本系列的第八篇文章中&#xff0c;我将介绍一些工具&#xff0c;这些工具可帮助您确定可能存在过多参数的情况&#xff0c;并在出现这…

Java _类 相关知识

成员变量java对象的属性就是成员变量,其实成员变量就是指普通的变量,可以设置初始值,也可以不设置.当不设置时,会被设置为默认值.(当成员变量前面有private关键词时,说明定义了一个私有成员) java中使用class关键词定义一个类, 成员方法java语言中使用成员方法来对应于类对象的…

linux操作系统好吗_国内可以通过安卓+termux打造出适用手机平板和电脑全平台最好的操作系统...

我觉得国内可以基于安卓上的termux要搞一个termux软件商店&#xff0c;用户可以从termux软件商店里安装c,c,java,python,vim,jupyter notebook,php&#xff0c;R等软件&#xff0c;并在安卓手机和安卓平板桌面上生成这些软件的图标&#xff0c;用户可以直接点击这些python,vim,…

java it_关于 Java Iterator(迭代器)学习笔记

相信 “迭代” 对于Java程序员来说并不陌生(当然&#xff0c;其他语言的程序员也是如此)&#xff0c;在处理数据时&#xff0c;不可避免地会存在对数据的大量遍历操作。对于我自己而言&#xff0c;学习使用Java语言两年时间&#xff0c;对于“迭代”的概念还停留在 for:each,fo…

scss-!optional

optional翻译成汉语具有"可选的"的意思。顾名思义&#xff0c;!optional标记前面的扩展不必须生成一个新的选择器。看一段SCSS代码片段&#xff1a; p{color:red;extend .notice } 由于并不存在一个名为notice的样式类&#xff0c;所以上述代码会报错。代码修改如下&…

Http(s)与后台交互方式

前言 Http(s)是前后端交互的主要方式之一&#xff0c;交互技术主要有:Ajax(XMLHttpRequest)、Fetch、地址跳转(window.open、location.href)。Http(s)与后台交互传递数据的部分有:请求网址、请求头、请求主体、响应头、响应主体 请求网址 请求网址是通过pathname或search进行传…