轻量级J2EE中SSH框架的研究及其应用
扫描二维码
随时随地手机看文章
引言
时至今日,信息技术和网络技术发展迅速,轻量级J2EE平台在企业开发中占有绝对的优势,越来越多的企业使用基于J2EE的开发平台进行Web应用开发。传统的J2EE框架具有对服务器要求高、耦合度高等缺点,这样就限制了Web系统的开发效率。轻量级J2EE框架不但保留了传统的J2EE框架良好的可扩展性、可维护性、安全性等特点,并且还具有开发灵活简单、部署成本低、各层无缝集成、耦合度低、后期维护方便等优点。
本文将就J2EE框架的特点,来讨论J2EE的轻量级SSH(Struts2+Spring+Hibernate)框架,对各层的集成方案进行研究,并通过医院病房信息管理系统项目具体分析SSH框架的应用。
1轻量级J2EE中SSH框架的研究
轻量级J2EE框架是一种开源的框架,跟传统的J2EE基本框架一样。根据它的功能,将其应用分为表示层、业务逻辑层和数据持久层,各层之间以松耦合的方式耦合在一起,
收稿日期:2013-10-16各组件并不以硬编码方式耦合。SSH架构中Struts用来实现表现层,直接面向用户,响应用户的请求,并向用户提供其所需数据;Spring实现业务逻辑层,借助IoC容器和AOP实现,集中处理系统的企业级服务;Hibernate实现数据持久层,负责数据的持久化以及Java对象与关系数据库的ORM功能。
SSH框架
Struts2框架
Struts是现今Web开发技术中运用最广泛的开源框架,是最流行的MVC组件,可以实现表示层,主要用于管理用户请求、调用业务层逻辑和处理异常。Struts框架具有组件的模块化、灵活性和重要性的优点。Struts可以更清晰地把模型、控制器和视图分开,简化了基于MVC的Web应用程序的开发,使页面更加简洁,以便于后期项目的维护和升级。
在过去,Struts1是所有MVC框架中的胜利者,但随着Web技术的不断发展和Web应用的不断扩大,Struts1的缺陷和局限也逐渐显现出来。Struts2是在WebWork基础上发展来的,它使用拦截器作为处理方式,以用户的业务逻辑控制器为处理目标,创建一个控制器代理。由它负责处理用户请求,处理用户请求时回调业务控制器的execute方法,Struts2将怎
样的视图呈现到用户是由该方法的返回值决定的。
Struts2的工作流程:Web应用启动时,Struts框架加载并初始化Actionservlet,并从Struts.xml中读取存放到各种配置对象中的配置信息。当Actionservlet接收到用户请求时,执行一连串的流程,最后指向的JSP组件生成动态页面,并且返回给用户。Struts2的框架结构如图1所示。
Spring框架
Spring是用在业务层的框架,Spring致力于J2EE应用各层的解决方案,而不是仅仅只专注于某一层的解决方案。Spring始终贯穿表示层、业务逻辑层和数据持久层,它提供了管理业务对象的一致方法并且鼓励对接口编程而不是对类编程的良好习惯。Spring提供了一个细致完整的MVC框架,为模型、视图和控制器之间提供了一个非常清晰的划分,各部分耦合度极低。Spring的MVC是非常灵活的,它完全基于接口编程,真正实现了与视图无关。Spring通过IoC依赖注入、AOP应用、面向接口编程,来降低业务组件之间的耦合度,增强系统扩展性。
Spring能简化企业级开发,大部分情况下可以用简单的Javabean来代替实现复杂的EJB。在程序设计中可以充分利用Spring依赖注入的特性,当修改类的属性时不用直接修改类的代码,而只用在配置文件里面进行简单的设置。
Hibernate框架
Hibernate是一个面向Java环境的对象/关系数据库映射工具,用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中区。Hibernate不仅管理Java类别到数据库表的映射(包括Java数据类型到SQL数据类型的映射),还提供数据查询和获取数据的方法,可以大幅度缩短使用JDBC处理数据持久化的时间。
Hibernate的优势包括带有开源和免费的License,可方便在需要时研究源代码,并改写源代码,或进行功能定制;其次是采用轻量级封装,从而避免了引入过多复杂的问题,调试容易,可减轻程序员负担;第三是具有可扩展性,API开放,在功能不够用的时候,可自己编码进行扩展;同时还包括开发者活跃,产品有稳定的发展保障等。Hibernate的结构框架如图2所示。
1.2 SSH框架的整合
1.2.1 Spring与Struts2的整合
如果要达到Struts2与Spring集成的最佳效果,必须使用Spring的IoC容器进行Action的管理,并利用依赖注入为控制器注入业务逻辑组件。这种整合流程的组件协作图如图3所示。
图3 Spring与Struts的整合流程图
在图3中,Struts只是配置一个伪控制器,这个伪控制器的功能实际由Spring容器中的控制器来完成,这就实现了让核心控制器调用Spring容器中的Action来处理用户请求。
在这种整合策略下,处理用户请求的Action由Spring插件负责创建,但Spring插件创建Action实例时,并不是利用配置Action指定的class属性来创建该Action实例,而是从Spring容器中去除对应的Bean实例来完成创建的。Spring容器为控制器注入业务逻辑组件,这也是Spring和Struts整合的关键所在。
Spring与Hibernate的整合
Spring使用DAO对象通常的事务管理用来分离数据访问和事务处理,无论是在多个DAO接口还是在多方事务的情况下,Spring都能使多种DAO对象无缝地协同工作。Spring把数据源、Hibernate的会话工厂以及应用中的DAO实现类通过一致的配置管理起来,通过IoC机制自动维护它们之间
的关系。Spring与Hibernate的无缝集成为我们提供了自动的Hibernate会话管理、声明性的事务管理,极大地减小了开发时的编码量,提高了开发的效率,增强了代码实用性。
2SSH框架的应用
本文以医院病房管理系统实验室的项目为应用实例,该项目就是采用基于MVC模式的J2EE体系结构来实现B/S的多层Web应用,该项目的Web分为表示层、业务逻辑层、数据持久层以及数据库层几层。项目以MyEclipse、Dreamweare为软件工具,Mysql作为后台的数据库,选择Java、JSP、JavaScript、HTML作为应用开发工具,运用Tomcat服务器技术,项目完全基于B/S模式进行设计并实现。
图4所示是其SSH框架结构。在整个项目中,表现层的实现是基于Struts架构。Struts的核心是控制器组件ActionServlet,在设计每个模块的控制器组件时,都会定义一个配置文件struts.xml来配置业务流程。业务逻辑层的数据来源于数据持久层PersistentObject和表示层FormBean,是表示层和持久层进行数据通信的中间层。它负责封装持久层提供的数据对象,并为表现层提供功能接口,由Business组件实现。数据持久层是基于Hibernate来实现的。实现过程中,需要创建配置文件、定义持久化类、对持久化对象进行映射定义和实现持久化操作。在系统中采用XML进行定义数据库连接的各种参数以及供Hibernate管理事务、产生SQL和管理JDBC连接时所涉及的数据映射文件等,Hibernate根据这些属性来连接数据库。
图4SSH框架结构
Struts与Spring集成
对于Struts来说,所有的请求最终都会被Action所接收到,通过Action去呼叫业务逻辑层的相应业务逻辑服务对象来处理客户请求。我们需要在Action里面去实例化某个具体的业务逻辑服务对象,通过Spring来实现二者的松耦合。其具体方法如下:
把Struts2-spring-plugin和Spring相应的jar包加到项目中。
在web.xml中配置Spring监听器。
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
<!--default:/WEB-INF/applicationContext.xml--></listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
<!--<param-value>classpath:beans.xml</param-value>
-->
</context-param>
如果没有使用contextConfigLocation指定配置文件,则Spring自动查找applicationContext.xml配置Strutsactiono用SpringIoC注入弓囲的业务逻辑类实例。
在struts.xml中配置action,这样,它的class就不是一个类了,而是在applicationContext.xml中定义过的类ID。<struts>
<constantname="struts.devMode"value="true"/>
<constantname="struts.i18n.encoding"value="utf-8"/>
<packagename="hosSystem"extends="struts-default"><!--==========Doctor角色相关Action============-->
<!--显示病人-->
<actionname="inquiryDocPatient"class="com.hubu.action.InquiryDocPatientAction">
<resultname="listPatient">/doctor/allpatients.jsp</result>
<resultname="listDocPatient">/doctor/docpatients.jsp</result>
</action>
</package>
</struts>
Spring与Hibernate的集成
在Spring框架中,只要在Spring的配置文件applicationContext.xml中配置sessionFactory的bean,Spring就可以和Hibernate联系起来。配置文件中的class属性必须是真正的实现类,而不是接口。方法如下:
在applicationContext.xml中创建数据源。
在applicationContext.xml中创建sessionFactory。
修改dao包下的持久类实现,继承HibernateDaoSupport实现。
在applicationContext.xml中配置dao类。
<beanid="nurseInquireDao"class="com.hubu.dao.impl.
NurseInquireDaoImpl">
<propertyname="sessionFactory"ref="sessionFactory"/></bean>
服务层通过Spring注入引用的dao类实例。
Struts2拦截器
为了实现权限管理,这里使用Struts2拦截器,事实上,权限管理模块有一个专门的包,叫action.authority。拦截器在Struts配置文件中的配置信息如下:
<!--==========session权限检查拦截器===========-->
<interceptors>
<!--session检查-->
<interceptorname="sessionCheck"class="com.hubu.action.authority.CommonIn
terceptor"/>
<!--护士权限、session检查-->
<interceptorname="nurseAuth"class="com.hubu.action.authority.NurseAuthorit
yInterceptor"/>
<interceptor-stackname="nurseStack">
<interceptor-refname="defaultStack"/>
<interceptor-refname="sessionCheck"/>
<interceptor-refname="nurseAuth"/></interceptor-stack>
<!--医生session检查-->
<interceptorname="doctorAuth"class="com.hubu.
action.authority.CommonIn
terceptor"/>
<interceptor-stackname="doctorStack"><interceptor-refname="defaultStack"/><interceptor-refname="sessionCheck"/></interceptor-stack>
</interceptors>
3结语
在SSH架构中,Struts作为前台控制框架简化了程序的开发,使得界面开发人员和Java程序员实现了很好的分离,增强了项目的可扩展性,提升了项目的开发效率,降低了开发成本。Spring则通过控制反转,层层回调,极大地减少了业务逻辑代码。而Hibernate则极大地减少数据库相关操作代码,实现一个简单高效的持久化。
SSH框架的使用有效地缩短了系统开发周期,提高了软件开发效率,简化了程序代码,使得程序的层次结构更加清晰,提高了编程效率,实现了用户界面、业务处理和数据访问的分离。
20211117_6193dc65cdf09__轻量级J2EE中SSH框架的研究及其应用