摘 要 本文分析了传统Web信息系统的缺点,详细阐述了MVC设计模式思想,剖析了当前被广泛应用的开源设计框架:Struts和Hibernate的工作原理,基于以上分析提出将二者结合起来实现优势互补共同开发遥感信息发布系统的思路,最后结合了DAO和工厂设计模式实现了具有良好可扩展性、实用性和可维护性的遥感信息发布系统。
关键词 遥感数据分发;MVC设计模式;Struts框架;Hibernate映射工具
0 引言
随着Internet技术的飞速发展,Web信息系统被广泛应用。遥感信息发布系统,就是指基于Web的遥感数据信息发布系统。随着时间的推移,传统的Web信息系统暴露了很多问题,如页面逻辑、业务逻辑和数据逻辑杂糅在一起,系统的耦合性高,修改、维护困难,扩展性差。为克服以上问题,新的开发方法也不断被提出来,如软件分层思想,MVC设计模式等等。
本文就如何构建弱耦合性,可维护和可扩展的遥感信息发布系统等问题展开探讨。根据当前Web技术的发展,提出了采用Java环境下实现MVC设计模式的Struts框架和实现数据持久化的Hibernate框架结合起来开发遥感信息发布系统,提高系统的实用性、灵活性,克服传统Web系统的缺点。
1 MVC设计模式和开源框架
1.1 MVC设计模式
MVC设计模式是一种著名的用户界面软件开发设计模式,它是模型-视图-控制器(Model-View-Controller)缩写。
MVC设计模式最早由Xerox在20世纪八十年代为Smaltalk-80语言发展提出的,但是这种设计思想并没有局限于该语言,而是被广泛地应用到了其他面向对象的编程语言中。
图1 MVC模型组件关系图
在MVC设计模式中,它把应用程序分成了3个核心部分,原理图如图1所示。
⑴ 模型(Model)
模型封装了用户数据和处理数据的业务逻辑,体现了应用程序的当前状态,而且可以将用户数据状态的变化提供给多个显示该数据的视图共用。模型是应用程序的核心。
⑵ 视图(View)
视图提供了用户界面,是用户和应用程序的交互的窗口,既接受用户输入,也把模型数据状态显示给用户,但是视图不负责任何业务逻辑处理,仅仅是将用户输入数据传递给控制器或将模型数据显示给用户。
⑶ 控制器(Controller)
控制器连接了模型和视图,根据用户请求判断将请求交给哪个模型来完成,然后调用视图来显示模型处理后的用户请求结果。
MVC设计模式将应用程序进行了分层,视图和模型通过控制器连接,从而减少了用户界面和业务逻辑之间的耦合,使程序设计更加清晰、灵活,也提高了软件的可扩展性、可维护性。
1.2 Struts框架
Struts框架是Apache开源软件联盟(www.apache.org)的一个开源项目——Jakarta Struts Framework。Struts框架继承了MVC设计模式的特性,遵守了J2EE的Servlet、JSP等技术规范,并且根据J2EE的特点做了相应的变化和扩展,是J2EE体系架构的一种轻量级实现。作为一款优秀的Java
Web应用程序的开发框架,Struts框架凭借其清晰性、灵活性,成为当前最为广泛应用的轻量级Java Web 开发框架。
Struts框架实现了MVC设计模式,其工作原理图如图2所示:
图2 Struts框架原理图
⑴ 控制器的实现
Struts框架中采用了ActionServlet和Action类以及Struts-config.xml配置文件作为控制器的实现。
其中,Struts-config.xml配置文件配置了不同用户请求及对应的具体业务逻辑组件来供ActionServlet类查询。
ActionServlet类是中心Servlet,负责处理所有的用户请求。当用户提出请求,ActionServlet类最先对请求进行处理,它将根据Struts-config.xml配置文件将用户请求映射到具体的Action类;而当Action类调用模型组件处理好用户请求,并返回了处理结果后,仍然由 ActionServlet类根据Struts-config.xml配置文件将结果转发到视图提供给用户,或者转发另外一个Action做进一步处理。
Action类实现了具体的业务逻辑,它接受用户的输入,然后调用具体的模型组件来完成用户请求。
⑵ 视图的实现
Struts构架主要采用了JSP作为视图的实现,它提供了丰富的JSP标签库支持应用程序的开发,而且引入了ActionForm组件(实质为JavaBean)作为用户表单的封装来完成数据的传输。
⑶ 模型的实现
Struts框架对模型——即复杂的数据持久化层没有提供太多的支持,但是这也就是说开发人员有更多自由来选择合适量级的持久化技术,比如Hibernate、EJB等等。
Struts框架实现了MVC设计模式,但是它是典型的表现层框架,对模型的实现是不足的,所以有必要引入其他架构加强对模型的实现。
1.3 Hibenate框架
Hibernate框架是开放源代码的对象关系映射工具(Object-Relational Mapping),是一款基于Java环境的优秀的对象持久化开发框架。它根据O/R(对象/关系)映射技术思想,对JDBC进行了轻量级封装,使开发人员可以使用一种面向对象的方式来操纵和管理关系数据库,所以从技术本质上来说该框架是一种提供面向对象的数据库服务中间件。
Hibernate框架位于应用程序的业务化和持久化层,在运行时的体系结构如图3所示:
SessionFactory接口,是一个数据库映射关系的内存映像,它是线程安全的,所以可以为多个线程同时调用产生Session,是Session的工厂,另外它为事务之间可以重用的数据提供了可供选择的二级缓存。
图3 Hibernate运行时体系结构图
Session接口,是Hibernate框架的运行中心,它被用户程序调用,提供与持久化相关的诸多操作,如加载、添加、查询、更新和删除持久化对象,是实现用户程序持久化工作的主要接口,所以Session被称为持久化管理器。
Transaction接口,是用来指定原子操作的单元范围,它通过对底层具体的JDBC、JTA等事务进行封装和抽象,形成一个统一的事务操作界面。
此外,Hibernate还有两个重要的核心接口:Configuration接口和Query和Criteria接口。Configuration接口是用来对Hibernate配置和启动。Query和Criteria接口是用来执行对数据库的查询,且支持HQL、SQL多种查询方式,其中HQL是一种面向对象的查询语言。
2 遥感信息发布系统的设计
遥感信息发布系统是基于地面站遥感数据信息的发布系统,包括了用户信息模块,数据浏览模块,数据订购模块等。
2.1 系统的体系机构设计
根据前面介绍可以看到Hibenate架构只具备数据持久化设计能力,而Struts架构则在模型设计方面能力薄弱,所以将二者结合起来使用,共同搭建系统结构实现MVC模型设计,可以达到二者优势互补,从而使系统设计具备低耦合性以及较高的可维护性和可扩展性。本系统的体系结构设计如图4所示:
图4 系统体系结构图
本系统具有多个模块,但是各个模块的设计原理相同,其中用户登录设计典型地利用了Struts框架和Hibernate框架的设计,体现了两种架构结合的特点,下面以此实现为代表进行具体阐述。
2.2 用户登录模块设计
用户登录模块,即用户从浏览器输入个人信息,由系统在数据库中检索数据,然后验证用户信息,如果验证成功登陆到系统界面,否则,提示用户信息出错。
2.2.1 数据持久层设计
数据持久层基于Hibernate架构,采用了DAO设计模式。在持久层设计中,包括了以下三个重要设计步骤:
首先,把用户信息封装为VO(Value Object)。VO是一组值对象,只包含了一些属性和getter/setter方法的POJO(Plan
Old Java Bean)。典
型设计如下:
public class OrAdmin implements
Serializable{
private String adminname;
public String getAdminname()
{ return adminname; }
Public void setAdminname(String adminname)
{ this.adminname = adminname; }
……
} |
其次,采用了DAO设计模式和抽象工厂设计模式,完成了 DAO工厂和Hibernate 数据库操作的具体实现,典型设计如下:
public abstract class DAOFactory
{
public static DAOFactory getInstance() {}
public abstract AdminDAO createAdminDAO();
}
public class AdminDAOImpl implements AdminDAO {
public OrAdmin getAdmin(String adminName) {
try {
Session s =HibernateUtil.currentSession();
Query query = s.createQuery("from OrAdmin as
oa whereoa.adminname='"+adminName+"'");
}……
return null; } } |
最后,利用了Hibernate的配置文件完成从应用程序到数据库的映射,典型设计如下:
<session-factory >
<property name="connection.driver_class">
org.postgresql.Driver </property> <property
name="connection.url">
jdbc:postgresql://127.0.0.1:5432/DBInfo </property>
<property name="dialect">
org.hibernate.dialect.PostgreSQLDialect </property>
<mapping resource="OrAdmin.hbm.xml" />
…… </session-factory> |
在该层的设计中,VO的信息封装体现了面向对象设计编程思想;DAO的设计模式和抽象工厂模式减弱了上层调用和具体实现之间的耦合;Hibernate配置实现了数据库高移植性,只需要改变Hibernate配置文件,不用修改程序设计就可以完成不同数据库之间的更换。
2.2.2 业务逻辑层设计
业务逻辑层包含了供客户端程序调用的业务逻辑规则,以帮助客户端完成业务操作。该层采用了业务代理、DAO和抽象工厂设计模式,典型设计如下:
public class ManagerFactory
{
public static AdminManager
createAdminManager(){
return new AdminManagerImpl();
}}
public interface AdminManager {
OrAdmin getAdmin(String username);
}
public class AdminManagerImpl implements
AdminManager{
private AdminDAO dao =
DAOFactory.getInstance().createAdminDAO();
public OrAdmin getAdmin(String username)
{ return this.dao.getAdmin(username); }
} |
在该层的设计中,业务代理、DAO和抽象工厂设计模式的使用,使业务逻辑更加灵活,如果具体业务发生变化,在表示层和数据持久化层改变很小就可以完成改变,这种设计增强了系统的可维护性和灵活性。
2.2.3 表示层设计
表示层基于Struts框架,采用了JSTL标签库技术。在表示层的设计中,主要包括了以下三个重要设计步骤:
首先,建立用于用户浏览的JSP视图页面,其中最重要的是设计出封装用户表单信息的ActionForm。ActionForm是Struts架构的重要组件,是包含了一些属性和getter/setter方法的POJO,典型设计如下:
public class AdminActionForm
extends
ActionForm {
private String adminname;
public String getAdminname()
{ eturn adminname;}
public void setAdminname(String adminname)
{ his.adminname = adminname; }
……
} |
其次,搭建用户请求和业务逻辑之间的桥梁——Action组件,该组件负责把用户信息和具体的业务逻辑处理联系在一起,典型设计如下:
public class AdminAction
extends Action {
AdminActionForm adminActionForm =
(AdminActionForm) actionForm;
adminname=adminActionForm.getAdminname();
adminpasswd=adminActionForm.getAdminpd();
AdminManager adminManager=
ManagerFactory.createAdminManager();
OrAdmin orAdmin=
adminManager.getAdmin(adminname);
if(orAdmin == null||!orAdmin.
getAdminpasswd().equals(adminpasswd)){
servletRequest.getSession().setAttribute("loginfail","Invalid
name or password. Login failture");
return actionMapping.findForward("logout");
}else{
servletRequest.getSession().setAttribute("adminname",adminname);
return actionMapping.findForward("success");
}} |
最后,通过Struts配置连接ActionForm和Action,完成一个业务设计,典型配置如下:
<form-beans>
<form-bean name="adminActionForm" type="co
m.rice.web.struts.from.AdminActionForm" /> </form-beans>
<action-mappings> <action name="adminActionForm"
path= "/adminAction" scope="session"
type="com.
rice.web.struts.action.AdminAction"
validate="false"> <forward name="success"
path= "/manager/main.jsp" /> <forward
name="logout" path= "/manager/index.jsp"
/> </action> </action-mappings> |
该层设计中,JSTL标签的使用简化了JSP页面,使页面设计和表示层业务逻辑分离,提高了应用程序的可维护性;Struts架构的引入,使应用程序实现了MVC设计模式,结构清晰,提高了系统的可扩展性。
3 总结
本文介绍了MVC设计模式以及Struts和Hibernate框架的工作原理,利用了他们的优点互补,有机地将Struts+Hibernate框架结合起来构建了一个遥感信息发布系统,克服了传统Web信息系统的缺点,提高了系统的可维护性、可扩展性,降低了系统地耦合性。 |