经过一段时间的学习,对JSF的认识也逐渐清晰。总结了一下JSF和structs的区别,首先在于分离了请求的处理。使用事件处理机制来代替原有的 request分发。其次在页面的展示上,采用组件的概念,而不是到处散落的html标记。再有,JSF对于请求的生命周期重新进行了划分,对于每个阶段都可以派遣事件,这使得整个请求的处理比较的清晰。最后,JSF对于页面的流转使用Navigation系统来处理,这一点感觉和structs还是比较类似的,只是换了一个概念。
从JSF的规范来看,JSF整体架构还是比较清晰,各个层次分的也挺明显。从总体上看,规范主要划分了application,context, lifecycle,render,component,validator,event,el几个部分,当然少不了主要的入口Servlet。有一点不太明白,大多数的类都是抽象类而不是接口,可能是为了规定层次吧,不允许多层次继承。下面简单以下介绍各个包的功能:
1.application:从定义上就可以看出来,这是应用级的。中间包括了Application主类,这是主要的程序入口,规范中最具有重量级的类,也是用来连接各个模块的。JSF规范使用工厂的模式,来创建相应的实现类.当然如果需要Application的实现,需要从 ApplicationFactory中取得。除了Application类,其中还包括了ViewHandler,这个主要负责View的 Renderer调配工作。而实现许多JSF整体架构,如果想定义自己的行为,一般上都会使用自身的ViewHandler,如facelets。 NavigationHandler的工作,不用说已经很明显,就是用来负责页面之间的导航。包中,还包括了view状态管理类-- StateManager,主要用于恢复view,以及保存view。目前一般使用Session来保存相应的view,当然也可以使用客户端来保存。其实,对于view状态的保存,非议还是挺多的,而且问题也比较多。
2.context:包括了主要的上下文环境类,如FacesContext和ExternalContext,前者是JSF的主要Context类,包括对 message的管理,Application的取得,以及ResponseWrite的引用。后者主要类似于作为外部环境的引用类,如 ServletContext和PortletContext.ResponseWriter,主要的服务端Writer,用于输出相应的html, xml内容,所有的Renderer都需要引用此类
3.lifecycle:这是JSF最大的特色,划分了请求的相应的处理阶段。规范中,只有两个类Lifecycle和LifecycleFactory。Lifecycle管理整个JSF请求的生命周期。通过指定的顺序执行相应的阶段。
4.webapp:定义了主要的Servlet,FacesServlet,主要的请求分发类,用于转换相应得faces为实际的资源。在规范中, Servlet并不是主要的初始化类,JSF 的初始化工作主要由具体的实现完成。在RI实现中,基本上由ConfigureListener完成初始化工作。而Servlet的任务只是简单的传递请求参数而已,以及调用相应的Lifecycle而已。
这里主要讲了JSF整体架构包,下面主要分析一下JSF相关组件的包。
这次主要分析一下JSF的相关组件包,也是JSF和structs主要不同的地方。JSF 规范中,对于组件的设计,和其他组件架构一样,分离表现层和模型层。对于组件的render由具体的Renderer来处理,这也达到了Model和 View分离的原则。
◆component:所有的基本组件都在其中,如下的主要类图,对于各个组件就不一一详细介绍了。主要介绍一下几个接口:
◆StateHolder:用于表示在请求之间需要保存相应的状态信息,必须实现saveState和resotreState方法。
◆ValueHolder:用于支持本地值的保持,用于访问model数据,通过表达式,支持转换。
◆EditableValueHolder:用于表示那些可以编辑的组件值
◆ActionSource:由UIComponet实现,用于作为ActionEvent的事件源,支持默认的ActionListener调用
◆ActionSource2:这是最近的规范中增加的,提供了对于MethodExpression的支持。
◆ContextCallback:用于组件执行相应的回调
◆NamingContainer:标志接口,表示容器组件
◆convert:包括了主要的Convert接口,以及内置的Convert实现类,主要的作用用于在页面值绑定时,进行类型的转换工作
◆validator:主要的验证包,定义了通过的Validator接口,以及简单的几个验证类。默认情况下,JSF都是进行服务端验证,如果想需要客户端验证,暂时从规范中,还没有找出相应的解决方案。不过现在已经是Ajax时代了,使用异步的传输,从效果上已经接近于客户端之间验证。
◆event:主要的事件体系。个人觉得JSF的事件体系还是比较弱的。和强大的Swing事件体制相比,那简直差远了。而且JSF默认使用一个 ActionListener来委派所有的客户端动作触发。大多数的调用都是使用MethodExpression来进行。
◆model:只是加强了对于DataTable的支持,以及SelectItems。
◆render:主要的展示包,当然只是提供规范,具体由实现类提供。对于Renderer,都需要一套RenderKit.而RenderKit由 RenderKitFactory管理。ResponseStateManager,作为StateManager的帮助类,进行主要的State操作。
基本上,规范也就这么些东东。从整体来看,并不算太复杂。可惜现在的JSF实现实在太多了,而且各个实现并不一定兼容,导致了JSF世界的庞大。
【编辑推荐】