设计模式可以帮助用户在更高层次上抽象细节,更好地理解体系结构。如果比较熟悉 GoF 设计模式和 JavaServer Faces (JSF) 框架,本文可以帮助您洞察 JSF 框架中使用的设计模式,深入理解其工作原理。
本文探讨了 JSF 框架中使用的设计模式。详细讨论的设计模式包括 Singleton、Model-View-Controller、Factory Method、State、Composite、Decorator、Strategy、Template Method 和 Observer 模式。
设计模式和 JavaServer Faces (JSF) 技术
首先简要地介绍一下模式和 JSF 框架。
模式。设计模式是对问题和解决方案进行抽象的普遍适用的方法。因为模式是所有开发人员和架构师公认的,所以模式可以节约时间和资源。用外行话来说,模式就是关于某个人所共知的问题的经过验证的解决方案。模式可以重用,重用使得解决方案更健壮。
Java Server Faces。 JSF 体系结构是一种 Web 应用程序框架。它是 Java Community Process (JCP) 推动的,有望成为 Web 应用程序开发的标准框架。目前用于开发 Web 应用程序的框架有 50 多个,这说明迫切需要实现框架的标准化,这正是 JSF 框架的目标!
深入剖析 JSF 模式
现在我们来讨论 JSF 体系结构中的各种设计模式。本文将详细讨论 Singleton、Model-View-Controller、Factory Method、State、Composite、Decorator、Strategy、Template Method 和 Observer 设计模式。我将分析每种模式的用途及其在 JSF 框架中的作用。
Singleton 模式
Singleton 模式的目的是保证类只有一个实例被加载,该实例提供一个全局访问点。当启动具有 JSF 支持的 Web 应用程序时,Web 容器初始化一个 FacesServlet 实例。在这个阶段,FacesServlet 对每个 Web 应用程序实例化 Application 和 LifeCycle 实例一次。这些实例就采用众所周知的 Singleton 模式,通常只需要该类型的一个实例。
使用 JSF 的 Web 应用程序只需要 Application 和 LifeCycle 类的一个实例。LifeCycle 管理多个 JSF 请求的整个生命期。因为其状态和行为在所有请求之间共享,这些对象采用 Singleton 模式合情合理。LifeCycle 维护的 PhaseListeners 也是 Singleton 模式的。PhaseListeners 由所有 JSF 请求共享。在 JSF 框架中可以广泛使用 Singleton 模式,以减少内存占用和提供对象的全局访问。NavigationHandler(用于确定请求的逻辑结果)和 ViewHandler(用于创建视图)也是使用 Singleton 模式的例子。
Model-View-Controller (MVC)
MVC 模式的目的是从数据表示(View)中将数据(即 Model)分离出来。如果应用程序有多种表示,可以仅替换视图层而重用控制器和模型代码。类似的,如果需要改变模型,可以在很大程度上不改变视图层。控制器处理用户动作,用户动作可能造成模型改变和视图更新。当用户请求一个 JSF 页面时,请求发送到 FacesServlet。FacesServlet 是 JSF 使用的前端控制器 servlet。和其他很多 Web 应用程序框架一样,JSF 使用 MVS 模式消除视图和模型之间的耦合。为了集中处理用户请求,控制器 servlet 改变模型并将用户导航到视图。
FacesServlet 是 JSF 框架中所有用户请求都要经过的控制器元素。FacesServlet 分析用户请求,使用托管 bean 对模型调用各种动作。后台(backing)或托管(managed)bean 就是该模型的例子。JSF 用户界面(UI)组件是视图层的例子。MVC 模式把任务分解给具有不同技能的开发人员,使这些任务能够同时进行,这样 GUI 设计人员就可以使用丰富的 UI 组件创建 JSF 页面,同时后端开发人员可以创建托管 bean 来编写专门的业务逻辑代码。
Factory Method 模式
Factory Method 模式的目的是定义一个用于创建对象的接口,但是把对象实例化推迟到子类中。在 JSF 体系结构中,Factory Method 模式被用于创建对象。LifeCycleFactory 是一个创建和返回 LifeCycle 实例的工厂对象。LifeCycleFactory 的 getLifeCycle (String LifeCycleId) 方法采用 Factory Method 模式,根据 LifeCycleId 创建(如果需要)并返回 LifeCycle 实例。自定义的 JSF 实现可以重新定义 getLifeCycle 抽象方法来创建自定义的 LifeCycle 实例。默认的 JSF 实现提供默认的 LifeCycle 实例。此外,对于每个 JSF 请求,FacesServlet 都从 FacesContextFactory 得到 FacesContext。FacesContextFactory 是一个抽象类,公开了 getFacesContext API,JSF 实现提供了 FacesContextFactory 和 getFacesContext API 的具体实现。这是另外一个使用 Factory Method 模式的例子,具体的 FacesContextFactory 实现创建 FacesContext 对象。
State 模式
State 模式的目的是在表示状态的不同类之间分配与状态有关的逻辑。FacesServlet 对 LifCycle 实例调用 execute 和 render 方法。LifeCycle 协调不同的 Phrase 以便执行 JSF 请求。在这里 JSF 实现就遵循了 State 模式。如果没有使用这种模式,LifeCycle 实现就会被大量的条件(即 “if” 语句)搅得一塌糊涂。JSF 实现为每个状态(或阶段)创建单独的类并调用 step。phase 是一个抽象类,定了每个 step 的公共接口。在 JSF 框架中定义了六个 phrase(即 step):RestoreViewPhase、ApplyRequestValues、ProcessValidationsPhase、 UpdateModelValuesPhase、InvokeApplicationPhase 和 RenderResponsePhase。
在 State 模式中,LifeCycle 把 FacesContext 对象传递给 phase。每个阶段或状态改变传递给它的上下文信息,然后设置 FacesContext 本身中的标志表明下一个可能的步骤。JSF 实现在每个步骤中改变其行为。每个阶段都可以作为下一个阶段的起因。FacesContext 有两种标志 renderResponse 和 responseComplete 可以改变执行的顺序。每个步骤执行完成后,LifeCycle 检查上一阶段是否设置了这些标志。如果设置了 responseComplete,LifeCycle 则完全放弃请求的执行。如果经过某个阶段后设置了 renderResponse 标志,JSF 就会跳过剩下的阶段而直接进入 Render Response 阶段。如果这两个标志都没有设置,LifeCycle 就会按顺序继续执行下一步。
Composite 模式
Composite 模式让客户代码能够统一处理复合对象和基本对象。复合对象是基本对象的容器。在第一阶段(Restore View 阶段)和最后一个阶段(Render Response 阶段),使用 JSF UI 组件构造 UI View。UIComponentBase 就是 Composite 模式中 Component 抽象类的一个例子。UIViewRoot 是 Composite 类,而 UIOutput(比方说)就是叶子(或者基本类)。UIComponentBase 类定义了叶子和复合对象的公共方法,如编码/解码值和子节点管理函数。子节点管理函数,如 getChildren,对于叶子节点返回空列表,对于复合节点则返回其子节点。
Decorator 模式
Decorator 模式的目的是不通过子类化动态扩展对象的行为。JSF 框架有很多扩展点(即可插入机制)。JSF 实现可使用 Decorator 模式替换默认的 PropertyResolver、VariableResolver、ActionListener、NavigationHandler、 ViewHandler 或 StateManager。通常自定义实现接受通过构造函数传递给它的默认实现的引用。自定义实现仅仅改写功能的一个子集,而将其他功能委托给默认实现。如果希望实现自定义的 ViewHandler,改写默认 ViewHandler 实现的 calculateLocale 方法,可以像 清单 1 那样编写 CustomViewHandler 类:
清单 1. CustomViewHandler 片段
public class CustomViewHandler extends ViewHandler {
public CustomViewHandler(ViewHandler handler) {
super();
oldViewHandler = handler;
}
private ViewHandler oldViewHandler = null;
public void renderView (facesContext context, UIViewRoot view) {
//delegate method to oldViewHandler
oldViewHandler.renderView(context, view);
}
//custom implementation of calculateLocale
public Locale calculateLocale(FacesContext context) {
}
}
Strategy 模式
Strategy 模式的目的是封装不同的概念。JSF 框架采用 Strategy 模式使用委托实现模型呈现 UI 组件。JSF 技术支持两种呈现模型。在直接实现模型中,UI 组件对收到的请求中的数据进行解码,然后编码这些数据进行显示。在委托实现模型中,解码和编码操作委托给和组建关联的专门呈现器。后一种模型利用了 Strategy 设计模式,比直接实现更灵活。在 Strategy 模式中,将不同的算法封装在单独的对象中,从而可以动态地改变算法。JSF 实现可以用已有的 renderkit 实例注册另外的呈现器,当应用程序启动的时候,JSF 实现读取配置文件将这些呈现器和 UI 组件联系在一起。
Template Method 模式
Template Method 模式的目的是将变化的步骤推迟到子类中,而在父类中定义那些固定的算法步骤。JSF 框架通过 PhraseListeners 展现了 Template Method 模式提供的功能。采用 Template Method(或者 “hook”)使得 Web 作者可以为不同阶段之间的可选步骤提供实现,而主要阶段仍然和 JSF 框架的定义一致。JSF 框架提供了 PhaseListeners,概念上类似于 Template Method 模式中的可变步骤。JSF 框架有六个预定义的阶段,在每个阶段之间,Web 作者可以实现 PhaseListeners 来提供类似于 Template Method hook 的 hook。事实上,这种结构比 Template Method 模式更具有扩展性。可以通过注册 PhraseId 为 ANY_PHRASE 的 PhaseListener 在每个阶段后提供 hook。如果 PhaseId 是 ANY_PHASE,JSF 实现就会在每个阶段之前和之后调用该 PhaseListener。JSF 框架中的实现略有不同,因为可以根本没有 PhaseListener,但是在 Template Method 模式中,子类通常重新定义父类中抽象的可变步骤。
Observer 模式
Observer 模式的目的是当目标对象的状态改变时自动通知所有依赖的对象(即观察器)。JSF 在 UI 组件中实现了 Observer 模式。JSF 有两类内建事件:ActionEvent 和 ValueChangedEvent。ActionEvent 用于确定用户界面组件(如按钮)的激活。当用户单击按钮时,JSF 实现通知添加到该按钮上的一个或多个动作监听程序。于是该按钮被激活,或者说按钮(主体)的状态改变了。添加到按钮上的所有监听程序(即观察器)都收到通知该主体状态已经改变。类似的,当输入 UI 组件中的值改变时,JSF 实现通知 ValueChangeListener。
结束语
JSF 框架利用了 Singleton、Model-View-Controller、Factory Method、State、Composite、Decorator、Strategy、Template Method 和 Observer 设计模式。因为它的体系结构建立在已经验证的设计模式的基础上,这是一个健壮的框架,模式在 JSF 框架中得到了很好的利用。
发表评论
-
jsf1.1如何使用ValueBinding类
2007-11-20 12:40 1767java 代码 javax.faces.el.V ... -
JSF问题集锦-General Questions
2007-08-09 19:19 3356java 代码 1.如何结束session? ... -
JSF Expression Language
2007-07-27 17:18 19331.搭配 JSF 标签来使用,是用来存取数据对象的一个简易语 ... -
JSF国际化
2007-06-30 18:40 1508国际化(I18N)就是设计软件应用,在不改变它们程序逻辑的前提 ... -
Hibernate 与 MyFaces的整合
2007-06-05 21:20 1037java.ccidnet.com/art/3539/20060 ... -
JSF资源
2007-06-05 21:16 1243caterpillar.onlyfun.net/Gossip/ ... -
JSF中 如何结束session
2007-06-05 21:08 1903如何结束session 你可以使用session的 inva ... -
myfaces官方网站
2007-06-05 21:06 3522myfaces.apache.org/ -
学习JSF的一个比较好的网站
2007-06-05 21:06 1329www.js66.com -
JSF datatable 做的一个简单Demo(含分页)
2007-06-05 21:04 3969www.js66.com/java/viewthread.ph ... -
JSF Core Tags
2007-06-03 11:20 1239www.horstmann.com/corejsf/jsf-t ...
相关推荐
根据给定的内容,“JSF架构图zz”主要涉及到了JSF框架的几个关键组成部分,下面将详细介绍这些部分及其在JSF框架中的作用。 ##### 1. **表示层应用程序逻辑** 表示层是JSF框架的核心,负责展示数据并处理用户的...
这个“VisualWebJSF架构使用教程”压缩包文件包含了关于如何使用该框架的详细指导,旨在帮助初学者和有经验的开发者更好地理解和运用VisualWebJSF。 首先,我们要了解JSF是什么。JavaServer Faces(JSF)是Java平台...
本项目为EducationResources-War项目,采用JSF架构设计,主要源码文件包括175个XHTML页面、145个Java类文件、39个JavaScript文件、30个CSS样式文件、27个JPG图片文件、26个GIF动画文件,以及少量其他类型的文件,...
### 基于JSF架构的WEB应用开发研究 #### 一、引言 随着信息技术的飞速发展和社会信息化程度的加深,Web应用的需求日益增长,尤其是对于中小型企业而言,高效快捷地开发出符合需求的强大Web应用变得尤为重要。Java...
### 二、JSF架构 JSF遵循MVC模式,其中: - **Model**:代表业务数据和逻辑,通常由JavaBean实现。 - **View**:表示用户界面,由JSF组件构成的HTML页面。 - **Controller**:负责处理用户事件,协调Model和View...
JavaServer Faces(JSF)是一种基于Java的服务器端UI框架,专为简化Web应用程序开发而设计。JSF的核心理念是组件化,它提供了一个模型-视图-控制器(MVC)架构,允许开发者使用预定义的组件、事件处理和后台bean来...
6. **开发流程**:在这样的架构下,开发者通常会首先定义业务实体类(用Hibernate的注解或XML配置),然后创建Spring Bean来实现业务逻辑,接着在JSF页面上设计用户界面,通过Managed Beans与Spring Bean交互,最后...
在系统实现上,通常会结合其他技术,如JDBC用于数据库交互,AJAX实现局部页面刷新,提高用户体验,以及使用DIV+CSS进行页面布局,提升界面的美观度和易用性。通过这样的系统,不仅可以简化教务流程,还可以减轻教务...
- **组件架构**:JSF 的组件架构设计用于简化 UI 开发,它允许开发者以声明的方式定义界面的结构和行为。 - **组件支持**:JSF 提供了一系列内置组件,同时支持自定义组件,以满足不同场景的需求。 - **简单的组件...
在IT行业中,JavaScript Server Faces(JSF)是一种用于构建企业级Web应用程序的Java框架,它遵循Model-View-Controller(MVC)设计模式。JSF提供了丰富的组件库和生命周期管理,使得开发人员能够更高效地处理用户...
JSF架构** JSF的核心组件包括:视图(View)、控制器(Controller)、模型(Model)和会话管理(Session Management)。视图负责展示用户界面,控制器处理用户交互,模型承载业务逻辑,会话管理则处理用户的会话...
对于网页设计人员,JSF提供了丰富的UI组件库,如按钮、文本框、表格等,这些组件可以直接在页面上使用,通过声明式的方式配置,极大地提高了设计效率。设计人员可以通过JSF的Facelets技术来创建和布局页面,这是一种...
总之,Spring、JSF和EJB3的整合使用,为企业级应用开发提供了一种强大的解决方案。通过合理地划分和组织代码,可以构建出高可用、高性能的应用程序,同时保持良好的可扩展性和可维护性。开发者应熟练掌握这些技术,...
1. **JSF架构**:JSF由多个组件构成,包括视图、控制器、模型和事件处理。视图由UI组件组成,如按钮、输入框等;控制器负责处理用户的交互;模型则包含业务数据和逻辑;事件处理机制使得组件之间可以进行通信。 2. ...
1. **JSF架构**:JSF框架的核心组件包括视图组件、控制器、模型和渲染器。视图组件负责显示用户界面,控制器处理用户交互,模型存储和处理数据,而渲染器则将组件转化为HTML发送给客户端。 2. **UI组件**:JSF提供...
JSF架构由多个组件组成,包括视图、控制器和模型。视图由JSF UI组件构成,控制器负责处理用户交互,而模型则与业务逻辑相关联。JSF通过Facelets技术来创建视图,Facelets是一种XML方言,用于构建用户界面模板。 **2...
二、JSF架构 1. **Facelets**:JSF 2.0开始引入Facelets作为默认视图层技术,它是一种XML-based模板语言,用于创建用户界面。 2. **Managed Beans**:在JSF中,业务逻辑通常封装在Managed Beans中,它们是Java对象,...
1. **JSF架构简述** JSF是一种组件化的MVC(Model-View-Controller)框架,它提供了丰富的UI组件库和事件处理机制。开发者可以通过声明式的方式定义界面,与后端业务逻辑进行交互。 2. **创建用户登录界面** - **...
JSF 是一个用于构建用户界面的 Java 框架,它遵循 MVC(模型-视图-控制器)设计模式。JSF 提供了丰富的UI组件库,可以方便地创建表单、按钮等交互元素。开发者可以通过声明式的方式配置UI组件,使得前端代码更易于...
二、JSF的设计模式与架构:JSF遵循经典的Model-View-Controller (MVC) 设计模式,但在Web环境中进行了必要的调整。模型(Model)负责存储数据和业务逻辑;视图(View)负责展示数据;控制器(Controller)则处理用户的输入...