UI组件用于与最终用户之间的交互。VB有组件,Swing也有,那么这些前端组件之间有什么区别吗?比如Swing组件是建立在JavaBean基础上的。这意味着他有属性,方法和事件,并且可以以插件的形式集成到IDE当中。与Swing不同JSF中的UI组件被设计为Web应用程序的一部分,他存在与服务端,而不是客户端。这一点非常重要,因为大多数Web应用不是以组件方式输出的,而是以标记形式,比如HTML。
打包的UI元素被当作组件(比如工具栏、日历组件等),这样非常有利于开发,因为核心函数被封装成了一段可以重用的代码。比如如果你使用一个日历组件,你不必从头开发包含html,css,图片等等一系列负责的元素。你可以只设置一些简单的属性,比如颜色、缺省日期等,其他负责的操作已经被组件开发人员封装起来了。把这个组件集成到你的应用中无需写太多的代码,只要与一个支持Bean(随后将介绍)的JavaBean属性关联就可以了。
仔细想想可能有多种不同的日历形式。通常情况下是每次在一个框内显示一个月的每一天。当然一个日历也可以由三个下拉框组成,分别是年、月、日。到底如何显示要取决于这个组件如何被装饰(renderded)。
不管日历被如何装饰,他都有相对固定的一套属性,比如颜色、缺省日期和你要显示的日期范围。一个日历组件展示了一个日历是如何工作的而不是如何显示。这种特性被成为装饰中立行,因为不管这个日历被如何装饰,这些属性是固定不变的。在你使用Java开发一个组件的时候这一特性是非常关键,而如果你是一个界面或应用程序开发人员,你得到已经是一个专为某个客户端环境(比如html格式的)制作好了的组件。
Web应用程序和桌面应用程序组件之间一个关键的区别在于,web应用程序的创建者不会和客户计算机直接交互。如果是在客户端程序中你输入了不正确的数据并按下了“OK”按钮,程序告诉你错误是什么,所有你录入的信息还摆在原来的位置而不会重新显示。而在web应用程序中,程序总是重显错误消息,但是毕竟我们需要应用程序看起来没有重显。也就是说组件必须记住自己原来的值或者状态。JSF组件对此为你提供了自动控制的功能。
前端组件之所以可以记住两次请求之间的值,是因为整个架构控制了页面上一系列的UI组件。这一系列组件组成了“视图”部分,他们是JSF在页面部分的核心内容,这些组件允许父子关联,比如一个窗体可以包含一个标签和一个文本框,比个panel可以包含一组按钮。
组件树中的每一个组件都通过组件标签来唯一标识。组件标签由开发人员设置,如果没有设置系统将自动生成一个。UI组件同时还支持“快捷”属性,通过这一属性可以使最终用户更便捷的操作组件。
UI组件建立了更高的抽象,他把web应用的开发提高到了更高的一个层次。JSF中创建的UI组件将更加聚合,配置组件比使用不同的技术写冗长的代码更简单。所有这些组件都可以通过代码或者GUI设计器来控制。当前已经包含了一些标准的组件,比如:标签,文本框、超链接、列表框多选框,单选框,数据网格等等。我们将在后面的逐渐讲述,同时还会讲解自定义组件的开发。