《Java EE 7精粹》—— 3.3 复合组件

3.3 复合组件

JSF使用Facelets的功能和资源的处理来定义复合组件,定义在Facelets标记文件中的一个或多个JSF组件组成了一个复合组件。这个.xhtml文件存储在资源库中,可以从页面的任意区域创建一个可重用的组件。

复合组件在定义页面中定义,在使用页面中使用。定义页面使用定义元数据(或参数),使用<cc:implementation>定义实现,其中cc是http://xmlns.jcp.org/jsf/composite/命名空间的前缀。JSF规范的未来版本可能会放宽对指定元数据的规定,因为它可以从实现本身派生。

可以使用JSF1.2定义一个复合组件,但这需要对JSF的生命周期有更深入的了解,并且需要编写多个文件。JSF2只用一个XHTML文件即可实现,简化了复合组件的定义。

例如,在一个Facelet中有如下代码片段来显示登录表单:

这段代码将呈现一个两行三列的表,如图3-1所示。

第一列显示要输入的字段的提示,第二列显示文本输入框,数据可以输入其中,第三列(它开始是空的)用于显示对应字段的消息。第一行的输入值绑定到User.name字段,第二行中的输入值绑定到User.password字段。还有一个命令按钮,单击该按钮将调用UserService的Bean的Register方法。

如果这个登录表单要被显示在多个页面,那么应当将这段代码片段转换成一个复合组件而不是到处复制这段代码。这需要将代码片段复制到一个.xhtml文件中,该文件位于标准资源目录的一个库中。基于约定优于配置的思想,这段代码片段会自动分配一个命名空间和一个标签名。

比如,前述的片段被复制到resources/mycomp目录下的login.xhtml文件中,其定义的页面所示如下:

在这段代码中,cc:interface用于定义描述组件特性的元数据,如支持的属性、facet和事件监听的连接点。cc:implementation包含代替复合组件的标记。

复合组件的命名空间是把http://xmlns.jcp.org/jsf/composite/和mycomp连接起来。标签名是不带.xhtml后缀的页面文件名:

比方说,这段代码片段在不同页面中单击提交按钮时,需要传递不同的值表达式(而非#{ user.name })并调用不同的方法(而不是#{ userService.register})。定义的页面可以传递的值如下:

在这段代码中,所有的参数都显式地在cc:interface中被指定。第三个参数有一个目标属性指向ccForm:loginButton。

在cc:implementation中:

  • h:form有一个id属性是必需的,以便在表单内的按钮可以明确地引用。
  • h:inputText现在使用#{cc.attrs.xxx}代替#{ user.xxx }。#{ cc.attrs }是一个默认的EL表达式,对复合组件的作者可用,提供访问当前复合组件的属性。在本例中,#{ cc.attrs}有name和password属性。
  • actionListener是一个事件监听器的连接点。它被定义为一种方法签名并描述了该方法签名。
  • h:commandButton有一个id属性,以便它可以在h:form内被明确指定。

用户名、密码和actionListener传递使用页面中需要的属性:

现在,使用页面可以传递不同的backing bean,在点击提交按钮时,可以调用不同的业务方法。

总而言之,复合组件提供了以下好处。

  • 遵循了不重复自己(DRY)的设计模式,代码一处保存,到处重用。
  • 允许开发人员不使用任何Java代码或XML配置编写新的组件。
时间: 2024-11-10 11:53:28

《Java EE 7精粹》—— 3.3 复合组件的相关文章

《Java EE 7精粹》—— 导读

前言 Java EE 7平台建立在以前的版本之上,侧重于提高生产力和拥抱HTML5.本书面向的是想快速概览这个平台和回来复习基础知识的读者. 本书提供了Java EE 7平台中关键规范的概述(每章一个规范).本书绝不是一本介绍不同规范中每一个概念的详尽指南或教程,而是通过简单的代码示例来解释不同规范的主要概念.阅读本书,无需具备Java EE平台早期版本的知识,但你需要对Java有一些基本了解,以便理解代码. 这本书的重要部分来自<Java EE 6 Pocket Guide>(O'Reill

《Java EE 7精粹》—— 第3章 JSF 3.1 Facelets

第3章 JSF JSF是基于Java的Web应用程序开发的服务器端用户界面(UI)框架.使用JSF可以实现: 使用遵循模型-视图-控制器(MVC)设计模式的可重用的UI组件集合来创建网页. 绑定组件到服务器端模型,允许UI与应用程序数据双向移动. 处理UI事件响应和模型交互中的页面导航. 管理跨服务器请求的UI组件状态. 提供从客户端生成的事件到服务器端应用程序代码的简单模型. 轻松地构建和重用自定义UI组件. JSF应用程序包括: 置于UI组件的布局中的一组网页. 一组托管的Bean,包括绑定

《Java EE 7精粹》—— 1.2 可交付成果

1.2 可交付成果 Java EE 7平台是遵从JCP 2.9作为JSR 342而开发的.JCP过程对每一个JSR定义了以下三个主要可交付成果. 1.2.1 规范(Specification) 描述了被提议的组件及其功能的一份正式的文件. 1.2.2 参考实现(RI) 对被提议的规范的二进制实现.参考实现有助于确保被提议的规范能以一个二进制形式实现,并为规范过程提供不断的反馈. Java EE的参考实现建立在GlassFish社区中. 1.2.3 技术兼容包(TCK) 用于验证参考实现是否符合被

《Java EE 7精粹》—— 3.5 Ajax

3.5 Ajax JSF原生支持添加Ajax功能到网页.JSF允许局部视图的处理,其中只有视图中的一些组件用于处理该响应.JSF可以摘选页面上的某些组件,渲染局部页面,而不是整个页面. 有以下两种方法可以启用这种支持. 以编程方式使用JavaScript资源. 以声明的方式使用f:ajax组件. 编程方式的Ajax集成是通过资源处理机制启用的.jsf.js是在javax.faces库中预定义的资源.该资源包含用于Ajax和JSF页面交互的JavaScript API.可以在页面中使用output

《Java EE 7精粹》—— 3.12 Passthrough属性和HTML5友好的标记

3.12 Passthrough属性和HTML5友好的标记 HTML5为现有的HTML元素增加了一系列的新属性.这些属性包括input元素的type属性,可以支持例如电子邮件.网址.电话.数量.范围和日期类型的值: 这段代码可以让浏览器检查输入的文字是否为电子邮件格式. 此外,自定义数据属性,也被称为data-*属性,可以被定义为存储页面或应用程序私有的自定义数据.每个HTML元素可能有指定的任意数量.任何值的自定义数据属性: 这段代码引入了数据长度data-length为自定义数据属性. 这些

《Java EE 7精粹》—— 3.4 请求处理生命周期阶段

3.4 请求处理生命周期阶段 JSF定义了标准的请求处理生命周期阶段.应用程序开发人员并不需要知道生命周期的详细信息,但在某些情况下我们可以从中得到帮助,比如何时验证,何时转换,通常在何时处理事件,怎样改变事件的处理方式和时间. 一个JSF页面是由被称为视图的UI组件树来表示的.当客户端向该页面发起请求时,开始一个生命周期.在生命周期中,JSF的实现必须建立视图,同时考虑保存此前提交页面的状态.当客户端提交页面时,JSF的实现必须执行一些任务,比如验证视图中组件的数据输入,将输入数据转换为服务器

《Java EE 7精粹》—— 3.7 服务器和客户端扩展点

3.7 服务器和客户端扩展点 转换器.验证器和监听器是服务器端的附属对象,用于为页面上的组件添加更多的功能.行为是客户端的扩展点,可以使用行为定义的脚本增强组件的渲染内容. 3.7.1 转换器 转换器用于把组件中输入的数据从一种格式转换为另一种格式(例如,string到number).JSF提供了几种内置的转换器,如f:convertNumber和f:convertDateTime.他们可应用于任何可编辑的组件: 在这段代码中,文本框中输入的文本将被转换为一个整数,如果文本不能转换,则抛出一条错

《Java EE 7精粹》—— 3.2 资源处理

3.2 资源处理 JSF定义了处理资源的标准方式,如图片.CSS或JavaScript文件.这些资源都需要通过组件来正确呈现. 这些资源可以被打包在Web应用程序的/resources目录中或classpath的/META-INF/resources目录中.资源也可以被本地化.版本化,以及整理到库中. 资源可以在EL表达式中被引用: 在这段代码中,header.jpg位于标准的资源目录中. 如果资源位于一个名为corp的库(打包资源的文件夹)中,那么就可以使用library属性访问: JavaS

《Java EE 7精粹》—— 3.8 验证数据

3.8 验证数据 除了使用JSF内置的验证器和创建自定义的验证器,还可以使用Bean验证为一个backing bean定义指定的约束. 试想在一个简单的Web应用程序中有一个页面,其表单内包含多个文本字段: 假设每个文本字段绑定到一个托管Bean的属性,且该属性至少有一个相关的Bean验证约束注解: 每个h:inputText元素是由一个UIInput组件支持的,包含一个验证器实例,它的id和javax.faces.Bean相关联.与用户指定的验证约束关联的验证器的validate方法,在处理验