1. 概述
Java Server Faces是一个针对java web 应用的UI Framework,它被设计为简化java web应用的开发和维护。JSF通过下面的方法提供易用性:
(1) 通过复用UI 组件,可以简单快速地构件UI
(2) 帮助管理UI组件的状态,这些状态可以跨越多个server requests
(3) 提供一个简单的事件模型以开发事件处理程序
(4) 允许简单地开发和复用定制组件
JSF建立了一个标准,它即可以满足偏爱工具的开发者、也可以满足喜好framework和APIs的开发人员的需要。
1.1 JSF解决的问题
JSF的核心架构是独立于特定的协议和标记语言的。但是它也解决了很多采用java servlet/JSPs以及HTML的web应用开发中的很多公共问题:
(1) 跨越多个请求管理UI组件的状态
(2) 对不同的标记语言、browser和client进行封装,屏蔽掉它们的差异。
(3) 支持form 处理
(4) 提供强大的类型化事件处理模型,以允许开发独立于HTTP的server端事件处理程序(event handlers),这些事件是由client端生成的
(5) 校验request数据,并且提供适当的error reporting
(6) Enabling type conversion when migrating markup values (Strings) to and from application data objects (which are often not Strings)
(7) 处理错误和异常,用人可读的形式报告错误(Handling error and exceptions, and reporting errors in human-readable form back to the application user)
(8) 处理页面导航,以响应UI事件和model interactions
1.2 JSF涉及到的角色
1.2.1 Page Authors
Page author的主要职责是为web应用创建user interface。他们必须熟悉标记语言(比如:HTML) 和脚本语言(比如:JavaScript),另外还需要了解rendering 技术(比如:Java Server Pages)。
Page author的主要焦点是美工设计和“人机工程”,他们大都不熟悉程序语言(比如:java)。
1.2.2 组件开发者
组件开发者的主要职责是创建可复用的UI组件,这些UI组件支持下面的功能:
(1) Convert the internal representation of the component’s properties and attributes into the appropriate markup language for pages being rendered (encoding).
(2) Convert the properties of an incoming request—parameters, headers, and cookies—into the corresponding properties and attributes of the component (decoding)
(3) Utilize request-time events to initiate visual changes in one or more components,
followed by redisplay of the current page.
(4) Support validation checks on the syntax and semantics of the representation of
this component on an incoming request, as well as conversion into the internal
form that is appropriate for this component.
(5) Saving and restoring component state across requests
1.2.3 应用开发者
应用开发者的主要职责是为web应用提供server-side功能性,他们并不直接于UI相关。应用开发者主要覆盖的职责包括:
(1) 定义/确定基于JSF的web应用所需要信息的持久存储机制(比如:在RDBMS中创建schemas)
(2) 创建相应的Java Objects表达持久存储的信息(比如:Entity EJB),并且当需要的时候调用相应的beans以执行应用数据的持久化操作。
(3) 用Java Objects封装引用的功能性或业务逻辑,这些Java Objects可以在web应用或非web应用中被复用(比如: Session EJB)。
(4) 输出数据表达(data representation)和功能逻辑对象,这些对象将通过JSF进行利用。这一项是直接同JSF相关的,下面的一些步骤将履行这个职责:
(4.1) 以对象的形式输出user interface layer所需要的数据,这些对象可以从web tier (比如:Servlet API中的request、session的属性) ,通过“value reference expressions”进行引用。
(4.2) 为事件提供应用级(与应用级对应的是组件级) 事件处理程序(event handlers),这些事件是在请求处理周期中(request processing lifecycle)被JSF UI组件生成的,并且采用队列化的形式由JSF框架管理。
1.2.4 JSF工具提供者
工具提供者的主要职责是创建辅助JSF-based应用开发的工具。
1.2.5 JSF的实现者
JSF实现者的主要职责是提供运行时环境,以实现JSF规范的所有要求。典型情况下,JSF的实现者也是J2EE应用服务器的提供者。
1.3 JSF APIs简述
1.3.1 javax.faces包
它包含了JSF API的top level classes。在这个包中最重要的类是FactoryFinder。
1.3.2 javax.faces.application包
它包含了连接业务逻辑对象到JSF的API,也包含了便利的可插拔机制以管理基于JSF的应用。在这个包中主要的类是Application抽象类。
注:Application有些向某些MVC框架的Controller
1.3.3 javax.faces.component包
它包含了基础的UI Component APIs。
注:component和它的renderer是分离的。
1.3.4 javax.faces.component.html包
它包含了每一个component + renderer联合的具体base classes。(This package contains concrete base classes for each valid combination of component+ renderer)
1.3.5 javax.faces.context包
它包含了定义“per-request state”信息的类和接口。这个包中的主要类是FacesContext,它是所有per-request信息的访问点,也包含了到其它几个helper classes的gateway。
1.3.6 javax.faces.convert包
它包含了定义converters的类和接口。这个包中的主要类是Converter。
1.3.7 javax.faces.el包
它包含了求值(evaluating)和处理(processing)引用表达式(reference expressions)的类和接口。
1.3.8 javax.faces.lifecycle包
它包含了定义生命周期管理的类和接口。这个包中的主要类是Lifecycle,它是执行“请求处理生命周期”的网关(gateway)。
1.3.9 javax.faces.event包
它包含了描述“事件”和“事件监听器”的接口,以及具体的事件实现类。所有组件级的事件必须继承“FacesEvent”类,并且所有组件级的监听器(listeners)必需继承“FacesListener”类。
1.3.10 javax.faces.render包
它包含了定义rendering model的接口和类。这个包的主要类是“RenderKit”,它包括了一组Renderer实例。Renderer为特定的client设备类型提供rendering能力。
1.3.11 javax.faces.validator包
它包含了定义validator模型(validator model) 的接口和一些具体的validator的实现类。