鲍 陈,王海涛,陈 阳
安徽工程大学现代教育技术中心,安徽芜湖,241000
基于 ExtJS和 S2SH的 Web开发框架研究与应用
鲍 陈,王海涛,陈 阳
安徽工程大学现代教育技术中心,安徽芜湖,241000
针对传统的 Web应用系统开发模式中的响应速度慢、层次耦合度高和软件复用度低等缺陷,研究了目前主流的基于 J2EE的 S2SH轻量级开源框架技术和基于 Ajax技术的 ExtJS框架,并结合分层解耦的设计思想,提出了一种基于 ExtJS+ S2SH的整合框架 E-S2SH。该整合框架,选择采用以 ExtJS作为视图层,Struts2作为控制层,Spring作为业务逻辑层,持久层采用 Hibernate技术。基于该整合框架,可以极大地提高 Web应用系统的软件开发质量和软件的复用性,同时也提高了Web应用程序的响应速度和用户体验。最后,为了验证 E-S2SH的性能,将该框架应用于网络相册系统的设计与实现中,从系统的运行测试看,该框架的应用前景广阔。
ExtJS框架;富客户端;JSON;S2SH框架;事务管理;网络相册
Struts2、Spring、Hibernate(以 下简称 S2SH)是目前主流的 J2EE开源框架,它提供了完整的、轻量级的 J2EE软件开发模型,可用于构建高质量的Web应用平台[1]。然而,基于 S2SH框架的 Web应用平台在响应速度和用户体验上越来越不能满足用户的需求。随着 Web2.0概念的提出,在用户需求的推动下,基于 Ajax技术[2]构建富客户端的 Web应用成为 J2EE开发研究的热点。Ext JS主要用于创建前端用户界面,是一个与后台无关的前端 Ajax框架,利用 Ext JS JavaScript UI组件库,实现无刷新的富客户端应用。本文根据 J2EE分层解耦的设计思想,通过整合 S2SH轻量级开源框架和 Ext JS技术,构建出一个适合 J2EE的 Web应用开发领域的整合框架 E-S2SH(ExtJS+S2SH)。该框架利用 ExtJS JavaScript UI组件库,提高页面的响应速度和用户体验;利用 Struts2实现视图、业务模型和控制器的分离;利用 Spring IoC容器实现组件之间的松散耦合,提高组件的可移植性;通过 Spring AOP实现事务管理和日志服务等功能,提高系统的内聚性;利用Hibernate实现数据持久化操作;同时,使用 JSON作为数据交互格式,在 Controller层中将返回浏览器的数据以 JSON格式写入 Response。E-S2SH框架降低了系统各层的耦合度,提高了 Web应用系统软件开发质量和软件的复用性,同时也提高了 Web应用程序的响应速度和用户体验[3]。最后,为了验证E-S2SH的性能,将该框架应用于网络相册系统的设计与实现中,从该系统的应用中充分体现了该框架的应用前景。
ExtJS主要用于创建前端用户界面,是一个与后台无关的前端 Ajax框架,它拥有华丽的JavaScript UI组件库,并具有 Web2.0的特性,可用于构建基于 Ajax技术的富客户端应用平台。Ext JS框架基于纯 HTML/CSS和 JavaScript技术,除了提供丰富的 UI组件外,还提供了一套强大的事件处理机制,采用 XML/JSON为数据解析和交换,使服务器端表示层的负荷减轻,无需安装任何插件即可在常用浏览器中创建出绚丽的富客户端应用平台,并能解决多级动态树形结构菜单、分页显示等复杂的 UI操作,从而实现富客户端应用。
针对传统的 Web应用系统开发模式中的响应速度慢、层次耦合度高和软件复用度低等缺陷,本文根据 J2EE分层的设计思想,通过整合 S2SH轻量级开源框架,并利用 Ext JS的 JavaScript UI组件库,构建出一个适合 J2EE的 Web应用系统开发领域的、可复用的分层实现框架 E-S2SH(ExtJS+S2SH)。该框架分为以下 5层来设计与实现:表现层(View)、控制层 (Controller)、业务逻辑层 (Service)、数据访问对象层(DAO)、持久化对象层(POJO)。该系统架构如图 1所示。
图1 E-S2SH整体架构图
(1)View层:用 JSP和 Ext JS框架技术来实现与用户的交互 ,使用 ExtJS JavaScript UI组件,构建美观、统一的用户交互界面,提升页面的表现力和用户交互体验。
(2)Controller层:由 Struts2中核心控制器 FilterDispatcher和业务逻辑控制器 Action负责视图层和业务逻辑层的交互,根据用户的请求,调用合适的Action,回调 Action的 execute方法。该方法获取用户的请求参数,并调用业务逻辑,同时以 JSON作为数据交互格式,在 Controller层中,将返回浏览器的数据以 JSON格式写入 Response,并将结果数据返回更新视图层。
(3)Service层:负责实现业务逻辑处理操作,每个模块对应一个 Service组件类。在这一层,向上提供业务逻辑处理操作,向下调用 DAO获取所需要的业务数据。应用 SpringIOC控制反转来创建、配置和管理业务逻辑,减少组件之间的依赖,使用 Setter Injection来完成相应属性值的依赖注入;采用Spring AOP技术,为容器中的对象提供事务管理和日志等服务,提高系统内聚性。该层应用 Spring框架对 Action层和 DAO层整合。
(4)DAO层:提供读写数据库中的数据,并通过接口提供对外服务,程序的其他模块可以通过 DAO来访问数据库。该层使用 Hibernate框架访问数据库,并封装了 Hibernate的 CRUD操作,完成对数据的访问操作,与数据库的交互操作,实现持久化操作。
(5)POJO层:主要提供给系统供持久化的对象以及对象到关系的映射文件。
1.3.1 Ext JS与 Struts2框架整合
视图层主要采用 JSP+ExtJS技术来实现。通过引入 JSON相关的 jar包,struts2-json-plugin-2.1.8.1.jar和 json-lib-2.1.jar,并配置 struts.xml文件,完成 Ext JS与 Struts2的整合。 struts.xml文件配置该业务逻辑控制器 Action,并配置其 Result的 type类型的 JSON,为了能够配置 JSON类型的 Result,必须配置包继承 json-default。在 JSP页面中,通过 ExtJS.Ajax.request作普通的异步请求,发送 Action请求,ExtJS的 Ajax引擎开始进行监听,Action以 POST的方式捕获 JSP发过来的请求,并调用业务逻辑处理,处理完后返回给 Action,后台Action返回 JSON格式的数据给请求页面,请求页面利用 Ext JS的 UI组件处理返回的 JSON格式的数据,并呈现给用户。其整合模型图,如图 2所示。
图2 ExtJS与 Struts2整合模型图
1.3.2 Struts2与 Spring框架整合
Struts2允许用户自己开发 Struts2的关键类,并将其配置到配置文件中来使用该关键类。com.opensymphony.xwork2.Object Factory类提供了这样的扩展点,用于 Struts2框架中创建 action、interceptor实例。Spring插件 struts2-spring-plugin.jar提供了一个实现类 StrusSpringObjectFactroy,该实现类继承了 ObjectFactory基类。可以将 Action交由Spring来进行创建管理,Spring容器将负责管理Action的生命周期,为其注入依赖对象。在 struts.xml文件中配置的业务逻辑控制器 Action,其中class属性并不是 Action类的实际处理类,而是对应的 Spring容器中的 Bean实例。
1.3.3 Spring与 Hibernate框架整合
Spring作为一个开源框架,在数据库访问层上,对主流的 ORM框架 Hibernate进行了很好的集成[6]。在 Spring的应用上下文中,完成数据源 data-Source和 SessionFactory的初始化,从而实现 Hibernate的依赖注入,将数据源的 DataSource实例注入LocalSessionFactoryBean的 dataSource属性中,获得SessionFactroy实例。Spring对 Hibernate的 DAO实现提供了支持,其中 Spring提供的 HibernateTemplate模板类提供了对数据的 CRUD操作。 HibernateDaoSupport类封装了 HibernateTemplate类的操作。在 DAO实现中,可以使 DAO类继承 HibernateDaoSupport类,通过 Spring的应用依赖 Session-Factory,最后使用 getHibernateTemplate()方法来获得 HibernateTemplate对象。 Spring与 Hibernate集成的优势主要体现于 Spring对事务的管理。 Spring采用 Annotation(注释)和 XML两种方式,提供声明式事务管理,针对 Hibernate框架,通过 Session-Factory实现事务管理。本文选择使用 XM L方式进行配置事务,可利用通配符一次完成多个方法添加事务。
网络相册系统是基于 E-SSH框架设计与实现的。该系统的功能是在数据库中将图片以文件方式存放到服务器上,并将与图片相关的信息和路径存入相应的数据表中。系统采用 MyEclipse8.5为开发工具,Mysql5为数据库,Tomacte6.0为服务器。该系统包括用户登录模块、图片数据管理模块、图片数据浏览模块。系统登录后的后台界面如图 3所示。
图3 网络相册系统登录后台界面图
2.1.1 多级动态树页面
多级动态树页面采用了 ExtJS框架实现,如图3所示。通过 Ext.Ajax.request,作普通异步请求,通过 Ext.tree.TreeLoader加载树形结构,服务器端必须返回 JSON形式数据。
Ext JS树[7]加载器 Ext.tree.TreeLoader提供子节点的延时加载功能,它请求指定的 dataUrl业务逻辑 menuLoader.action,并接收服务器返回的JSON[8]数据格式如下:[{id:1,text:"一级节点",leaf:false,children:[{id:101,text:"二级节点",leaf:true,children:[]}]}]。其中,id属性的值用来标记树节点,text属性的值用来标记该节点的名称,leaf属性的值用来标记该树节点是否有子节点,如果为false,则代表有子节点,反之代表没有子节点。针对这些 JSON字段属性,笔者在数据库中设计了 Item表(表 1),用来接收服务器端 JSON数据。多级动态树层级关联是通过上层节点 id与下层 fatherid之间进行关联的。
表1 Item表字段设计
根据上述多级动态树设计思路,其实现从以下三步展开,具体描述如下。
第一步,根据节点的 fatherid和 leaf属性,加载数据库 Item表中所有的节点。下文所述 Menu类是简单的 POJO,包括以下属性:String id、String text、String leaf、 List