jsf iframe使用_使用JSF架构进行设计

设计模式可帮助用户在更高级别上抽象细节并更好地理解体系结构。 如果您熟悉“四个结构”的设计模式和JavaServer Faces(JSF)框架,那么本文将帮助您深入了解JSF框架中使用的设计模式,以及它们如何深入工作。

本文探讨了JSF框架中使用的设计模式。 详细讨论的设计模式是Singleton,模型视图控制器,工厂方法,状态,组合,装饰器,策略,模板方法和观察者。

设计模式和JavaServer Faces(JSF)技术

首先,简要介绍一下模式和JSF框架。

  • 模式。 使用模式是一种抽象问题及其解决方案的普遍方法。 由于所有开发人员和架构师都认可模式,因此模式可以节省时间和精力。 用外行的话来说,模式是公认的解决已知问题的方法。 您可以重用模式,这种重用可以帮助解决方案变得强大。
  • Java Server Faces。 JSF体系结构是Web应用程序的框架。 它由Java社区流程(JCP)驱动,并有望成为Web应用程序开发人员的标准框架。 目前,有50多个用于开发Web应用程序的框架表明了对框架进行标准化的强烈需求-而JSF架构正在完成这项工作!

深入了解JSF模式

现在,让我们探索JSF架构中的各种设计模式。 我详细讨论的模式包括Singleton,Model-View-Controller,Factory方法,State,Composite,Decorator,Strategy,Template Method和Observer。 我将回顾每种模式的意图以及它在JSF框架中的功能。

单例模式

Singleton模式的目的是确保仅加载类的一个实例,并且该实例提供全局访问点。 启动具有JSF支持的Web应用程序时,Web容器将初始化FacesServlet实例。 在此阶段,FacesServlet每个Web应用程序实例化一次Application和LifeCycle实例。 这些实例代表了众所周知的Singleton模式,该模式通常仅需要一个该类型的实例。

使用JSF的Web应用程序仅需要Application和LifeCycle类的一个实例。 LifeCycle管理多个JSF请求的整个生命周期。 将这些对象作为Singleton模式是有意义的,因为它们的状态和行为在所有请求中都是共享的。 LifeCycle维护PhaseListeners,这也是Singleton模式。 所有JSF请求都共享PhaseListeners。 您可以在JSF框架中广泛使用Singleton模式,以减少内存占用并提供对对象的全局访问。 NavigationHandler(用于确定请求的逻辑结果)和ViewHandler(用于创建视图)也代表Singleton模式。

模型视图控制器(MVC)

MVC模式的目的是将模型(或数据)与数据表示形式(视图)分离。 如果您的应用程序具有多个演示文稿,则只能替换视图层,并为控制器和模型重用代码。 同样,如果需要更改模型,则视图层在很大程度上不会受到影响。 Controller处理可能导致模型更改和视图更新的用户操作。 当用户请求JSF页面时,请求将转到FacesServlet。 FacesServlet是JSF中使用的前端控制器servlet。 像许多其他Web应用程序框架一样,JSF使用MVC模式将视图和模型分离。 为了集中处理用户请求,控制器Servlet对模型进行了更改,并将用户导航到视图。

FacesServlet是所有用户请求都通过的JSF框架中的控制器元素。 FacesServlet检查用户请求,并使用托管bean在模型上调用各种操作。 支持或托管bean是该模型的一个示例。 JSF用户界面(UI)组件代表视图层。 MVC模式有助于在具有不同技能的开发人员之间划分任务,以便可以并行执行任务。 也就是说,GUI设计人员可以创建具有丰富UI组件的JSF页面,而后端开发人员可以创建托管Bean来编写业务逻辑特定的代码。

工厂方法模式

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对象。

状态模式

状态模式的目的是在表示状态的不同类之间分配特定于状态的逻辑。 FacesServlet在LifeCycle实例上调用execute和render方法。 LifeCycle与不同的阶段协作以执行JSF请求。 JSF的实现遵循State模式。 如果不使用此模式,LifeCycle实现将被很多条件(或“ if”语句)弄得一团糟。 JSF实现会为每个状态(或阶段)创建单独的类并调用步骤。 阶段是一个抽象类,为每个步骤定义通用接口。 在JSF框架中,定义了六个阶段或步骤:RestoreViewPhase,ApplyRequestValues,ProcessValidationsPhase,UpdateModelValuesPhase,InvokeApplicationPhase和RenderResponsePhase。

与状态模式一样,LifeCycle将FacesContext对象传递到阶段。 每个阶段或状态都会更改传递给它的上下文信息,然后在FacesContext本身中设置标志以指示下一步。 JSF实现会在每个步骤中更改其行为。 每个阶段都可以负责下一个阶段。 FacesContext具有两个标志-renderResponse和responseComplete-用于更改执行顺序。 执行完每个步骤后,LifeCycle会检查上一阶段是否设置了这些标志之一。 如果设置了responseComplete,则LifeCycle将完全放弃请求的执行。 如果在某个阶段之后设置了renderResponse标志,则JSF实现将跳过其余阶段,并直接进入渲染响应阶段。 如果两个标志都未设置,则LifeCycle将执行序列中的下一步。

复合图案

Composite模式允许客户统一处理复合对象和原始对象。 复合对象是原始对象的容器。 在第一阶段(“还原视图”阶段)和最后一个阶段(“渲染响应”阶段),使用JSF UI组件构建UI视图。 UIComponentBase表示Composite模式中的抽象Component类。 UIViewRoot是Composite类,而UIOutput例如是叶子(或原始)。 UIComponentBase类为叶对象和复合对象定义了通用方法,例如编码和解码值以及子级管理功能。 子级管理功能(例如getChildren)为叶节点返回空列表,为复合节点返回子级。

装饰图案

Decorator模式的目的是动态扩展对象的行为而无需子类化。 JSF框架具有许多扩展点或可插入性机制。 JSF实现可以使用Decorator模式替换默认的PropertyResolver,VariableResolver,ActionListener,NavigationHandler,ViewHandler或StateManager。 通常,自定义实现接收通过其构造函数传递的默认实现的引用。 定制实现仅覆盖功能的一个子集,并将其余功能委托给默认实现。 如果要实现一个自定义ViewHandler,它从默认ViewHandler实现中覆盖了calculateLocale方法,则可以编写CustomViewHandler类,如清单1所示

清单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) {
}
}

策略模式

策略模式的目的是封装一个变化的概念。 JSF框架采用策略模式来使用委托的实现模型来呈现UI组件。 JSF技术支持两种渲染模型。 在直接实现模型中,UI组件自己对传入请求中的值进行解码,并对要显示的值进行编码。 在委托的实现模型中,将解码和编码操作委托给与该组件关联的单独的渲染器。 后一种模型比直接实施更为灵活,并利用了策略设计模式。 在“策略”模式中,您将一个变化为单独对象的算法封装在一起,以便可以动态变化该算法。 JSF实现可能会在现有的renderkit实例中注册其他渲染器,并且在应用程序启动时,JSF实现会读取配置文件并将这些渲染器与UI组件相关联。

模板方法模式

模板方法模式的目的是将变异步骤推迟到子类上,而父类定义算法的不变步骤。 JSF框架通过PhaseListeners提供了Template Method模式提供的功能。 实现了模板方法(或“挂钩”),因此Web作者可以为阶段之间的可选步骤提供实现,而主要阶段与JSF框架所定义的相同。 JSF框架提供的PhaseListener在概念上类似于Template Method模式的变体步骤。 JSF框架具有六个预定义的阶段,并且在每个阶段之间,Web作者都可以实现PhaseListeners来提供类似于Template Method钩子的钩子。 实际上,这比Template Method模式更可扩展。 通过注册具有ANY_PHASE值的PhaseId的PhaseListener,可以在每个阶段之后提供挂钩。 如果PhaseId为ANY_PHASE,则JSF实现在每个阶段之前和之后调用PhaseListener。 JSF框架中的实现略有不同,因为一个人根本不能拥有PhaseListener,但是在Template Method模式中,子类通常重新定义在父类中抽象的变体步骤。

观察者模式

观察者模式的目的是当主题中的状态发生变化时自动通知所有从属对象(或观察者)。 JSF框架在UI组件中实现了Observer模式。 JSF技术具有两种内置事件:ActionEvent和ValueChangedEvent。 ActionEvent在确定用户界面组件(例如按钮)的激活时很有用。 当用户单击按钮时,JSF实现会通知一个或多个添加到按钮的动作侦听器。 按钮被激活,或者按钮(主体)的状态改变。 通知所有侦听器(或观察者)有关添加到按钮的主题状态的更改。 同样,当输入UI组件中的值更改时,JSF实现会通知ValueChangeListeners。

结论

JSF框架利用了Singleton,Model-View-Controller,Factory方法,State,Composite,Decorator,Strategy,Template Method和Observer设计模式。 它是一个健壮的框架,因为它的体系结构基于业已证明的设计模式,在JSF框架中很好地利用了该模式。


翻译自: https://www.ibm.com/developerworks/java/library/wa-dsgnpatjsf/index.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值