基于JSF框架技术的Web应用系统开发
2012-12-19河南人民广播电台映像网黄星辰
河南人民广播电台 映像网 黄星辰
一、Web应用程序开发阶段
1.利用Servlet阶段,使用request和response对象接收和反馈客户端的请求。它是开发Web应用程序的基石,在Web应用程序中,Servlet 是一个基本的Web 组件,开发Web 应用的许多技术,如JSP及一些Web层的框架都是建立在其基础之上。Servlet的缺点是在Java 代码中兼有业务和逻辑,不利于程序设计和界面开发。
2.JSP技术阶段,JSP是在标记语言中以<%@…%>的形式嵌入Java代码,使得页面会话可以调用后台Bean来处理事件,但是仍然没有将表示层和业务层分割开来,往往是互相嵌套,这就要求美工人员要懂技术,技术人员要懂美工,不利于程序的维护。随后JSP引入了标签库,来分离业务逻辑,经过SUN公司的标准化之后,就形成了JSTL(Java Standard TabLibrary)。JSTL 对于页面显示以及显示逻辑的弱耦合已经实现,方便了Web 的开发。但随着Web应用程序规模的不断扩大,如今现有的JSTL技术已越来越无法满足开发者的需求,复杂的业务流程和页面之间的交互都需要程序员自己编写代码实现,加大了开发难度。
3.框架开发阶段,所谓框架就是可重用的,半完成的应用程序,可以用来产生专门的定制程序。为了适应新的开发环境,一个中间件厂商开发出了像Struts、Spring、Hibernate以及后来出现的JSF 等框架。这些框架为Web 应用程序开发提供了模板,开发人员只要配置好相应的参数就可以完成对Web应用程序的开发。更重要的是,这些框架在不长的时间内相互融合,现在的Web应用程序开发都用到了一种或多种框架。
基于JCP制定的Web应用框架标准而开发的JSF框架技术,采用了模型—视图—控制器(MVC)的设计模式,凭借良好定义的请求处理生命周期和丰富的组件层次结构,大大提高了基于Java的Web用户界面开发的简易性。MVC框架模型如图1所示。
图1 M VC 框架模型
JSF技术提供了一个表现和行为彻底隔离的能力,使得先前只有在客户端UI 体系(DOM)下完成的细粒度隔离移到了服务器端,客户端只需解释标准的HTML语法,从而达到了完全瘦客户端的目标。JSF另一个主要特点在于,JSF利用熟悉的UI组件和Web 级概念,并不把开发者局限在某种特定的脚本技术或标记语言。JSF提供了一个JSP标签库,实现与JSP的绑定,但开发者完全可以用另外的表现技术,因为它直接依赖于JavaServletAPI。以用户界面组件为主的JSF与以页面为中心的Struts框架不尽相同,它对应用程序的各个部分划分得比较清晰。利用JSF实现的MVC结构如图2所示。
图2 利用JSF 实现的M VC 结构
由图1,图2可知,JSF的控制器部分,由FacesServlet、动作处理方法、动作监听器方法和Faces 配置文件组成。JSF 的视图部分基于用户界面组件,组件构成组件树,用户界面组件具有快速应用程序开发工具的特征,优于Struts。此外,JSF具有事件粒度细化的新特性,每个用户界面组件可以触发事件,不像Struts 只有在提交页面时才能触发一个事件,JSF中事件的粒度细化为组件级别,而不是表单级别。JSF的核心部件如图3所示。
图3 JSF 核心部件
图3中用户界面组成组件树,构成JSF视图。用户在与视图上的组件相互交映时触发了事件,事件通过事件监听器处理,在处理事件的过程中访问应用程序的模型对象,最后,导航系统根据这个逻辑结果来选择下一个应该呈现的视图,呈现视图的任务可以由组件自身直接完成,也可委派给专门的呈现器来完成。但有时碰到的特殊情况,仅用上面的步骤是无法完成的。如在要求输入字符串的文本框中输入数字或日期,或者输入的是字符串,却是无效数据等,于是在JSF中引入了转换和验证机制,来协助用户组件更好的完成任务。在数据类型转换、验证及处理事件的过程中一旦发生错误,便产生相应的消息,并显示给用户,提示用户下一步的策略。
JSF的事件监听器Listener是建立在JavaBean的事件处理机制上的,与JavaBean 的事件模型一样,JSF 框架中有强类型的事件类和监听器接口,应用程序可以通过类Listener 和Event 来处理UI组件生成的事件。当用户与用户界面组件交互时会触发某种类型的事件,事件监听器根据组件上的EL表达式的值来确定待处理的事件。
当一个对象A 依赖于B,则对象B 对A 有控制权,如若B 发生变化,对象A 也一定随之发生变化。而控制反转IOC 就是让这种对象间的依赖关系发生转移。它要求“程序不应依赖实现,而是依赖接口”。也有人把IOC 称为依赖注入。为了达到控制反转的目的,容器或者框架需要引入一个装配者对象,在JSF中就是托管Bean的任务。对象依赖关系如图4所示。
图4 对象依赖关系
Backing Bean 不再依赖业务服务的具体实现对象,而是被托管Bean所依赖,此时托管Bean还依赖于具体的业务实现。将Backing Bean和具体的业务服务实现配置在faces文件中供托管Bean使用,无须对托管Bean代码做更改,Backing Bean具体的业务服务的实现无须再改动其代码了,而是更改相应的配置文件,大大降低了程序的耦合度。依赖注入分为接口注入、设值注入和构造子注入3种类型。实际应用中,后两种出现较多。
二、JSF 框架技术的优势
1.UI 组件。JSF 的UI 组件是真正意义上的UI 组件,能极大地简化程序员的工作,如,在页面上放置一个文本输入框,这个输入框立即具备了数据填充、界面更新、事件侦听、动作触发、有效性检查和类型转换的功能。更为重要的是,程序员只需根据业务逻辑编写核心业务代码,JSF会保证代码在合适的时候被执行,完全不用考虑代码与代码之间该如何来配合。
2.事件驱动模式。事件是面向对象方法的重要组成部分,对象之间通过事件进行沟通和交流,使得一个或多个对象能够对另一个对象的行为作出响应,共同合作去完成一项业务逻辑。通常,编写Web 程序时,程序员要为对象之间的沟通设计机制,编写代码。虽然沟通的内容属于业务逻辑,但沟通的机制显然与业务没有太大关系,程序员因此为业务逻辑之外的功能浪费了时间。JSF改变了这种状况。JSF的事件和侦听模式与大家熟悉的Javabean 的事件模式类似,有Java 基础的程序员并不需要学习任何新的东西。JSF的UI组件可以产生事件,如,当页面上一个文本输入框的内容被修改时,会发出一个“值改变事件”。另一个对象如果对“值改变事件”感兴趣,只需注册为该对象的侦听者,并编写处理例程,即可命令JSF在事件发生时自动调用处理例程。JSF做了所有该做的事,留给程序员的只有业务逻辑代码的编写。
3.用户界面到业务逻辑的直接映射。如,表单提交是Web编程最常见的任务,也是最复杂的任务之一。当用户在网页上点击“确定”按钮时,浏览器将生成一个HTTP请求,发往服务器端的某个Servlet,执行该Servlet 的service 方法。在service 方法中,HTTP请求需要经历解码、类型转换、有效性验证、状态保存、数据更新等环节,处理这些环节的所有细节,对程序员来说是沉重的负担。在JSF下,这些工作的很大一部分都由框架承担了,在程序员看来,这个过程是透明的,用户界面端的HTTP请求可以直接映射到后端的一个事件处理例程,JSF起到了承前启后的作用。
4.程序员和网页设计人员的分工。在JSP中,程序员和网页设计人员的工作有时是互相交织、无法区分的。这是因为JSP页面中掺入了网页设计人员所不熟悉的一些JSP标签,甚至是晦涩的Java代码。要求网页设计人员理解这些标签和代码是不现实的,不符合分工合作的原则。在JSF中,框架为网页设计人员提供了一套标准的UI组件,在工具的支持下,可以通过拖放简单地添加到网页上,然后设置某些显示属性来满足视觉要求。网页设计人员不需要知道UI组件背后的复杂代码,而程序员也不需要再处理任何与视觉相关的细节,程序员所做的只是给UI组件绑定类的属性或方法。虽然程序员和网页设计人员需要修改同一份文件,但他们各司其职,各得其所,互不干扰。程序员和网页设计人员工作的明确划分,是JSF在易用性方面迈出的一大步。
5.请求处理生命周期的多阶段划分。虽然都是建立在Servlet基础之上,但JSF的生命周期要比JSP复杂得多。JSP的生命周期非常简单,页面被执行时,HTML标记立即被生成了,生命周期随即结束。而一个完整的JSF请求—处理生命周期被精心规划为6个阶段,典型的JSF请求需要经历所有阶段,某些特殊的请求也可以跳过一些阶段。阶段的细分,显然引入了更多的处理,但JSF框架会管理这一切,所以,程序员在获得更多控制能力的同时,工作量并没有增加。
6.全面的用户自定义支持。JSF为程序员提供了很多默认的组件和类,通常情况下,JSF 的这些默认组件和类足以满足Web开发的需要。但是,考虑到在某些应用场合,框架的默认行为也许不符合业务的要求,JSF特别允许程序员编写自己的组件和类,来满足客户的特殊需求。例如,程序员可以编写自己的UI组件,甚至可以创建自己的EL解释器,来支持非标准的EL表达语言。
三、结论
JSF 技术是基于MVC 模式的开发框架,它提供了丰富的用户组件UI,较完美地将JSP,Servlet,JavaBeans 结合起来,提高了开发效率。并且JSF实现了一个开放的架构,允许开发人员创建自己的组件,或者在现有的组件上继承,开发功能更强大的组件,体现了JSF的灵活性和可延展性。相信随着JSF技术的不断完善,基于JSF 框架的Web 应用将会越来越多,JSF 的运用范围也会更加广泛。