Spring架构

2024-05-14

Spring架构(通用3篇)

Spring架构 篇1

0 引言

对于任何一个完整的应用系统而言,认证授权机制是必不可少的。在基于Spring框架的Web应用中,可以使用Acegi Security(简称Acegi,根据其官方网站http://www.acegisecurity.org的论述)作为安全架构的实现。Spring框架是一个优秀的多层JAVA_EE系统框架,它为企业级应用提供了一个轻量级的解决方案,大大地降低了应用开发的难度与复杂度,提高了开发的速度。但现有的Spring框架本身并没有提供安全相关的解决方案。而Acegi安全框架为实现基于Spring框架的Web应用的安全控制提供了一个很好的解决方案。

1 Acegi在Web应用程序中能实现的工作

通过Acegi几乎可以完成一个企业应用程序所需要的安全措施的所有工作。具体来说,有以下几点:

1.1 在用户访问受保护资源之前提示用户登录。

1.2 鉴别用户是否是系统的合法用户。

1.3 鉴别合法用户是否具有访问受保护资源的权限。

1.4 通过认证并对已授权的用户导向相应的受保护的资源。

1.5 当认证用户成功登陆系统后,Acegi会在服务器端表示该用户已通过认证,并且在客户端放置一个安全Cookie,这样,系统的下一个认证过程就可以直接使用该Cookie。

1.6 用户注销或退出系统的时候,Acegi负责销毁服务器端保存的Session。

1.7 Acegi负责与不同的数据源交互,以完成对用户信息的认证功能。

2 Acegi安全框架体系结构

2.1 Acegi安全框架组件类型。

Acegi安全框架包含四种类型的安全组件:managers、filters、providers、handlers。其中filters主要提供高层次安全服务,实现认证处理、操作Session以及注销操作。managers和providers对上述高层操作进行具体实现,也就是说,managers和providers具体实现认证处理和注销操作。在实现过程中providers来完成底层的安全认证服务,providers与不同的数据源(通常是关系型数据库)交互,而managers根据实际情况来选择相应的providers。Handlers是完成相应安全操作的处理程序,例如完成注销操作就需要两个handler,一个销毁HTTP Session,另一个handler用来销毁Cookie。

2.2 控制反转技术。

Acegi需要安全组件之间的相互配合来完成安全认证以及授权功能,Acegi安全框架使用了控制反转来注入安全组件之间的依赖关系。控制反转即Io C(Inversion of Control),它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器。比如一个filter需要调用一个manager来选择一个provider。

2.3 XML配置文件。

Acegi安全框架使用Spring框架提供的Io C实现来注入Acegi安全组件之间的依赖关系,并且用XML配置文件来描述安全组件之间的依赖关系。

上面XML代码中,authentication Processing Filter安全组件需要依赖于authentication Manager安全组件,经过这样的配置,Spring的Io C容器就可以自动的将后者注入前者之中了。

3 安全过滤器

Acegi安全框架使用安全过滤器来为Web应用程序提供认证以及授权服务。常用的安全过滤器为:

3.1 Session Integration Filter。

Acegi的Session Integration Filter(SIF)创建了一个安全上下文对象,用于保存相应安全(权限)有关信息。

3.2 Authentication Processing Filter。

Acegi使用Authentication Processing Filter(APF)进行安全认证过程。比如从客户机请求中提取用户名和密码,从后端用户库中读取用户参数,以及使用这些信息对用户进行身份验证。

3.3 Logout Processing Filter。

Acegi使用一个Logout Processing Filer(LPF)来管理注销处理。当客户机发来注销请求时,将使用LPF进行处理。它标识了来自由客户机所调用URL的注销请求。

3.4 Exception Translation Filter。

Exception Translation Filter(ETF)处理认证和授权过程中的异常情况,比如授权失败。在这些异常情况中,ETF将决定如何进行操作。

3.5 Interceptor Filter。

Acegi安全框架使用Interceptor Filter对用户进行授权操作。

4 Web应用程序中集成Acegi安全框架解决方案

在Web工程项目中使用Acegi安全框架,首先要将Acegi相应的JAR包下载,导入到工程中。配置web.xml,将Sping的Ioc容器装载到Servlet Context中,并且配置Filter To Bean Proxy过滤器。接下来配置Spring的配置文件acegisecurity-config.xml文件,最后部署并运行项目即可。本文由于篇幅限制省略了具体代码。

摘要:对于一个Web应用系统来说,完善的认证授权机制是十分重要的。本文就Spring框架下的Acegi安全架构技术进行了分析、探讨,并给出了相应的解决方案。

关键词:Acegi,IoC,Spring

Spring架构 篇2

关键词:软件开发,框架,耦合度,复用性

随着Java技术应用的增多,采用Java技术开发的项目也越来越多了,一种实用高效的软件开发框架正成为软件开发人员的必备工具。在众多框架中,Struts、spring、Hibernate的组合正成为Java企业级开发的主流选择,这是因为它可以很好地实现MVC模式、快速地开发数据库应用、以及对中间层对象有一种良好的管理等。在实际应用中,人们通常将这三种框架的组合称为SSH(Struts、Spring、Hibernate),由于这三种框架技术都是开源的,更是受到众多软件企业的追捧,使其市场占有率达到一定水平,是广大Java爱好者必学的技术之一。

1 SSH的特点

在B/S项目开发过程中,对于视图层、业务层和数据访问层的一些处理往往会是一些程序员感到一些困惑,找不到一种合适的方法来进行分层,可能会导致项目的架构混乱,同时项目的代码复用、升级以及测试等都会出现一些困难,下面就分别对Struts、Spring和Hibernate进行介绍,期望能够为Java的SSH架构这提供一些参考。

1.1 Struts的特点

Struts和Tomcat、JBoss等诸多项目一样,是开源软件,这是它的一大优点。使开发者能更深入的了解其内部实现机制。Struts开放源码框架的创建是为了使开发者在构建基于Servlet和JSP技术的Web应用时更加容易。Struts框架为开放者提供了一个统一的标准框架,通过使用Struts作为基础,开发者能够更专注于应用程序的商业逻辑。Struts框架本身是使用Java Servlet和JSP技术的一种Model-View-Controller(MVC)实现。

具体来讲,Struts的优点有:

1)实现MVC模式,结构清晰,使开发者只关注业务逻辑的实现。

2)有丰富的tag可以用,Struts的标记库(Taglib),如能灵活动用,则能大大提高开发效率。另外,在Struts中对Ajax的支持更是提升了UI界面的用户体验,符合当前富客户端的开发主流思想。

3)页面导航。页面导航将是今后的一个发展方向,事实上,这样做,使系统的脉络更加清晰。通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。尤其是当另一批开发者接手这个项目时,这种优势体现得更加明显。

4)提供Exception处理机制。

5)数据库链接池管理。

6)支持I18N。

7)灵活方便的配置式的用户验证。

1.2 Spring的特点

Spring是一个开源的框架,目前非常流行;它是基于Io C(Inversion of Control,反向控制)和AOP(面向切面编程)的J2EE系统的框架,但它不强迫你必须在每一层中必须使用Spring,因为它模块化的很好,允许你根据自己的需要选择使用它的某一个模块;它对不同的数据访问技术提供了统一的接口,采用Io C使得可以很容易的实现bean的装配,提供了简洁的AOP并据此实现事务管理等等。

优点:

1)Spring能有效地组织你的中间层对象。如果你仅仅使用了Struts或其他为J2EE的API特制的framework,Spring致力于解决剩下的问题。

2)通过容器来管理Spring的Bean。Spring通过配置文件来实现对Bean的依赖注入(DI),从而使Bean之间的耦合度降低,减少对其它类的依赖。

3)能够很好地实现面向接口编程,其代价几乎减少到没有,Spring能够促进养成好的编程习惯。

4)Spring被设计成一种非侵入式的编程方式。使Spring应用中的大多数业务对象不依赖于Spring。

5)Spring帮助你解决许多问题而无需使用EJB。Spring能提供一种EJB的替换物,它们适用于许多web应用。例如,Spring能使用AOP提供声明性事务管理而不通过EJB容器,如果你仅仅需要与单个数据库打交道,甚至不需要一个JTA实现。

6)Spring为数据存取提供了一个一致的框架,不论是使用的是JDBC还是JPA还是Hibernate等。

1.3 Hibernate的特点

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用面向对象编程思想来操纵数据库。

Hibernate可以应用在任何使用JDBC的场合,既可以在Java的C/S项目中应用,也可以在B/S中使用。

大多数开发机构经常采取创建各自独立的数据持久层。一旦底层的数据结构发生改变,那么修改应用的其余部分使之适应这种改变的代价将是十分巨大的。Hibernate适时的填补了这一空白,它为Java应用提供了一个易用的、高效率的对象关系映射框架。hibernate是个轻量级的持久性框架,功能非常丰富。

优点:

1)Hibernate使用Java反射机制而不是字节码增强程序来实现透明性。

2)Hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。

3)它支持各种关系数据库,从一对一到多对多的各种复杂关系。

2 SSH的分层模型

在进行B/S项目开发过程中,当我们使用SSH作为项目的架构时,通常我们将其构建成如图1所示的模型。

在图1中,可以清晰地看出,Struts充当的是视图处理的角色,而Hibernate充当的是数据库维护的角色,Spring则是连接Struts和Hibernate的纽带,主要的业务逻辑则是在这里完成。

Struts是一个典型的MVC模型,在Struts的Model中,是一个POJO类,它可以是一个数据库表的模型,也可以是一个JSP页面的模型,起到了数据封装的作用;JSP是一个视图文件,是直接和用户打交道的文件;Action则起到控制器的作用,可以起到页面转发、数据传递等作用。在Hibernate的DAO类中,主要是一些增、删、改、查的方法,并且使用Hibernate来提供全功能的ORM所具有的功能,如缓存、延迟加载和期望获取等。在Spring的Service类中则是按照具体的业务需求来“组合”一些方法,同时使用Spring的依赖注入等来实现模块间的解耦合。

通过SSH的分层可以很好使开发人员更加关注自己的业务逻辑,同时提高代码的复用性,降低了模块之间的耦合,有利于系统的升级和测试。

3 SSH的集成

3.1 Spring和Hibernate集成

Spring和Hibernate集成可以使用Hibernate模板或使用Hibernate Dao Support,但是不管怎么样都需要在Spring配置文件appli-cation Context.xml文件中配置Session工厂,且流程差不多。下面就以Hibernate Dao Support为示例来进行介绍。具体集成参照图2所示。

Data Source是Hibernate连接数据库的配置,不同的数据库和不同的连接方式都会有不同的配置,下面是连接到Sql Server的一种配置方式。

对于每一个可能用到的DAO类都必须在这里进行配置,这里的DAO类必须是继承了Hibernate Dao Support类,因此该类也继承了父类的一个属性session Factory,该属性的值必须在这里进行注入。

接下来是进行事务处理,主要是使用代理来完成。首先配置一个transaction Manager,然后配置被代理的Service对象,再次进行代理类的配置,代码如下:

3.2 Spring和Struts集成

Spring和Struts集成比较简单,首先添加Struts、Spring的支持库:struts2-spring-plugin2-2-1.jar;然后在web.xml文件中添加一个监听:第

4 总结

在SSH框架中,Struts用来解决MVC中显示、请求控制部分,Spring主要负责访问数据库DAO类的事务控制以及它被人称誉的IOC思想在业务类中的恰当运用,Hibernate主要是充当数据访问层组件。由于Spring对Hibernate的良好支持,在DAO类主要由Spring来完成,Hibernate更多关注的应是O/R影射文件上的配置,如级联关系,延迟加载等如何设置才能使效率更高。

参考文献

[1]比庆红.Spring in Action[M].北京:人民邮电出版社,2010.

[2]马召.Struts 2实战[M].北京:人民邮电出版社,2010.

[3]冯锐.SSH权威指南[M].北京:中国水力出版社,2003.

Spring架构 篇3

ITIL (ITInfrastructureLibrary, IT基础架构库) 作为IT服务管理领域事实上的行业标准, 得到了越来越多的应用。服务台作为ITIL服务支持流程中一项关键性职能, 在IT部门和整个IT服务管理流程运作中扮演着极其重要的角色。服务台的一项主要任务是确保用户请求得到有效的处理, 协调用户和IT部门之间的关系, 为IT服务运作提供一线支持, 从而提高用户的满意度。可以说, 它是IT部门服务运作的“前台”。

文中构建的IT服务台系统, 整合了轻量级的Struts 2、JPA、Spring 2框架。在保留了JavaEE架构良好性能和可扩展性、可维护性的基础上, 简化了开发, 降低了部署成本。

1系统采用的JavaEE框架

传统基于EJB的JavaEE的应用有代码依赖容器、启动缓慢、部署复杂、资源占用高、对服务器要求高等缺点。各种轻量级框架的出现使我们有了新的解决问题的方法。轻量级框架简化了编程模型, 从而加快了JavaEE应用的开发。

1.1 Struts 2框架

Struts 2是一个Pull类型的MVC框架, 它与传统类型的MVC框架不同之处就在于在Struts 2中, Action既是模型, 又是业务控制器。视图直接从Action里拉取所需的数据, 而不是另外还需要一个单独的模型对象存在。在Struts 2中, MVC模式通过五个核心组件来实现———Action、拦截器、值栈/OGNL、结果类型和结果/视图技术[1]。架构如图1所示。

控制器通过分发Servlet过滤器来实现, 模型通过Action实现, 视图则通过结果类型和结果组合实现。值栈/OGNL提供了公共的线程和链接, 并使得不同组件可以相互集成。当客户端提交请求后, FilterDispatcher负责接收来自客户端的请求, 然后根据请求决定调用合适的Action。Struts 2的拦截器链自动对请求应用通用功能, 例如验证、文件上传等功能。Action处理结果可以通过多种视图技术如JSP、FreeMarker返回给客户端[2]。

1.2JPA框架

JPA (Java Persistence, API) 是Java EE 5标准中ORM的规范, 在充分吸收现有ORM框架的基础上, JPA是一个易于使用、伸缩性强的ORM规范。JPA作为Java EE 5标准之一, 因此任何符合JPA标准的框架都遵循同样的架构, 提供相同的访问 API, 这保证了基于 JPA 开发的企业应用能够经过少量的修改就能够在不同的JPA框架下运行, 现主流的ORM框架如Hibernate都提供了对JPA的实现[3]。

1.3Spring 2框架

Spring是Java SE/EE应用一站式的轻量级开源框架, 以IoC (Inverse of Control:控制反转) 和AOP (Aspect Oriented Programming:面向切面编程) 为内核, 提供了表示层Spring MVC和持久层Spring JDBC以及业务层事务管理等众多的企业级应用技术, 并能方便地整合各种第三方的框架和类库, 降低其他框架的使用难度。使用Spring可以实现低侵入设计, 代码污染极低;依赖注入机制降低了业务对象替换的复杂性;方便程序的测试。 Spring 2又添加了新的功能:①引入XML Schema格式, 简化了配置文件编写, 增强配置文件的扩展性;②AOP的增强, 集成AspectJ可以管理容器外对象, 提供了领域模型的依赖注入;③持久层的增强, 增加了对JPA的支持, 降低使用JPA的难度;④支持动态语言JRuby、Groovy、Beanshell[4]。Spring的广泛使用, 已成为Java企业级应用开发的事实标准。

2IT服务台系统的设计

2.1IT服务台系统的功能设计

IT服务台系统划分为服务登记、问题分派、问题处理、问题确认、问题跟踪、查询统计和问题知识库管理七个子模块, 通过记录服务请求, 处理过程, 对问题进行跟踪确认, 建立问题处理知识库, 来提高问题/请求处理水平、处理速度、降低处理难度。查询统计的功能是对IT系统中的各类问题和相应的服务状况进行全面掌握和了解。通过实施服务台达到了如下要求:规范了运维流程, 加强了上级管理人员对问题处理的监控, 加强了知识管理, 提高了运维质量, 还为考核员工绩效提供了依据。

2.2系统的架构设计

系统采用Java EE的三层结构, 分为表现层、业务逻辑层和数据服务层。三层体系将业务规则、数据访问等工作放到中间层处理, 客户端不直接与数据库交互, 而是通过控制器与中间层建立连接, 再由中间层与数据库交互。

表现层使用JSP, 禁用Java脚本, 避免将业务逻辑混杂在表现层, 使用Struts 2标签来显示数据, 生成页面显示效果。中间层采用了Struts 2+Spring 2+JPA这三个框架, 为了分离控制层与业务逻辑层, 又细分为:①WEB层, 负责表现层与业务逻辑层之间的交互, 调用业务逻辑层, 并将业务数据返回给表示层显示。②业务逻辑层, 负责实现业务逻辑, 对DAO对象进行Facade模式的封装。③DAO层 (数据访问对象层) , 负责与持久化对象交互, 封装了数据的增、删、查、改操作。④PO层 (持久化对象层) , 通过实体/关系映射工具将关系数据库的数据映射成对象, 实现以面向对象方式操作数据库, 用JPA作为O/R Mapping框架。数据服务层使用MySQL数据库存放数据。

系统的IoC容器使用Spring 2框架, Spring 2框架负责管理系统中的控制器组件、业务逻辑组件和DAO组件, 容器中的组件以松耦合的方式组合在一起, 组件与组件之间的依赖通过Spring 2的依赖注入来管理, 这样降低了系统异构的代价。系统的总体架构如图2所示。

3基于Struts 2+JPA+Spring 2架构的IT服务台系统的实现

现以IT服务台系统中用户服务登记子模块为例, 来描述基于Struts 2、Spring 2和JPA架构的系统实现。用户服务登记的业务流程为:用户登录IT服务台系统, 输入服务的基本信息如申报人姓名、部门、联系方式、服务类型、事件相关描述等, 递交给服务台系统后返回系统首页, 查看相应的反馈信息。在服务登记模块里主要用到的数据表为:PROBLEM (故障登记表) 。

系统实现的开发工具为Myeclipse 6.5。应用服务器为Tomcat 6.0.18。

3.1Web层的实现

Web层对应系统MVC结构中的控制器层, 控制器层由Struts 2的Action实现, Action通过调用系统的业务逻辑方法来处理用户请求, 并将结果放入Struts 2的ValueStack, 在JSP页面里通过Struts 2的标签库来显示处理结果。

Struts 2的Action是一个带有execute方法的POJO类, 不需要继承任何基类和实现父接口, 因此有很好的复用性。Action的属性直接绑定用户请求的表单数据, 属性名与JSP表单中对象名保持一致, Struts 2的拦截器通过Action属性的setter方法, 会自动将用户的表单数据设置成Action的对应属性。Action完成业务操作后, 根据execute方法返回的字符串转向相应的视图, Action的定义通过struts.xml进行配置。struts.xml里method属性的设置还可以使一个Action实现类对应用户请求的多个逻辑Action。

这里给出了服务登记模块中, 多个逻辑Action对应的struts.xml配置, 如下:

index和refer这两个逻辑Action都是由IndexAction类来实现, 对应method属性指定的实现类不同方法, result属性指定Action执行完后转向的视图资源。如refer.action通过IndexAction类调用refer方法来实现, 执行完后转向jsp/submit.jsp页面。

通过上面Struts 2 Action实现, 可以看出Struts 2的Action相比Struts 1有很大改进, 如完全基于POJO, 无须实现任何接口或继承任何类型, 更容易复用与测试。也不需要用大量的ActionForm类来封装用户的请求参数。

3.2DAO层与PO层的实现

DAO层负责封装系统所有的持久层访问, 所有的持久层访问都通过系统的DAO组件来实现, 避免了业务逻辑组件与持久化访问的耦合。每个DAO组件对一个数据库表完成基本的CRUD等操作。PO层则完成持久化操作, 通过JPA将PO映射成数据库里的数据表。

3.2.1 PO层实现

JPA PO由两部分组成:持久化类与注释, 通过持久类上的注释负责把持久化类映射到数据表, 并将持久化类的属性映射到数据列。用Myeclipse的逆向工程可以很方便地用已有数据表自动生成持久化类和映射到数据库的注释[5]。如把PROBLEM表用Myeclipse生成Problem类和相应注释。部分代码如下:

JPA PO的持久化类就是POJO类, 属性和数据表的列一一对应。注释采用“at”标记形式 (@) , 后面是注释名称。属性映射可以在持久化类的属性getter方法上进行标记[6], 如在Problem类的id 属性getter方法上标记@Id, 定义了持久化类的主键信息, @GeneratedValue标记用来制定主键的生成策略。相对于别的ORM框架传统模式的xml文件配置, 注释有不少优点, 如描述符大量减少、编译期校验等。

JPA与数据库的连接通过persistence.xml文件进行配置, 包括连接数据库所用的连接池、用户名和密码等信息。

3.2.2 DAO层实现

DAO组件实现包括DAO接口与接口的实现类, 如操作Problem实体类的DAO组件定义了ProblemDAO接口和相应的实现类ProblemDAOImpl, 接口里声明基本的增加、删除、修改、以及查询方法。DAO组件由Spring 2容器管理, 这样DAO组件持久化访问所需的数据库连接和事务管理器由Spring 2的IoC容器依赖注入。

DAO接口实现类通过继承Spring 2提供的JPA支持类JpaDaoSupport而建立, JpaDaoSupport封装了JPATemplate, JPATemplate是Spring 2提供的DAO模板, 将通用的操作放在模板里完成, 而对于特定的操作, 通过回调接口完成。DAO接口实现类使用JPQL来查询对象, ProblemDAOImpl中查找所有Problem对象的代码, 如下:

3.3 业务逻辑层的实现

业务逻辑组件用于业务逻辑的实现, 也采用接口和实现分离的规则, 让业务逻辑组件接口定义组件包含的功能, 实现类提供组件的实现。这样Action实例并不直接与业务逻辑组件的实现类耦合, 而仅依赖于业务逻辑组件执行接口, 降低了系统重构的代价。服务登记模块中, 定义了一个接口LoginDelegate及接口的实现类LoginDelegateImpl。

业务逻辑组件实现同时依赖于系统的DAO组件来进行数据库的操作。在系统中, Spring 2容器负责完成DAO组件的实例化, 并将DAO组件实例注入业务逻辑组件, 从而实现了业务逻辑组件和DAO组件的高度解耦。业务逻辑组件注入DAO组件的实现通过在实现类LoginDelegateImpl中提供相应的setter方法, 并在Spring 2的配置上下文文件applicationContext.xml中配置相关的依赖关系。在Spring 2容器配置业务逻辑组件之后, 还必须为业务逻辑方法增加事务控制。因为用户的业务逻辑方法对应用户的一次业务请求, 而用户的每次业务请求都是逻辑不可分的, 因此应该为业务逻辑方法增加相应的事务控制。借助于Spring 2的声明式事务管理, 业务逻辑组件的方法内无需事务管理代码, 所有的事务管理都放在Spring 2的applicationContext.xml配置文件中。

4结束语

使用了轻量级Java EE架构Struts 2+Spring 2+JPA, 并分析了各个层次的关键技术。通过框架的整合, 充分发挥了各自的优点。并用此架构成功地构建开发了IT服务管理中服务台系统。实践证明, 该架构使得项目开发简洁、结构清晰, 并使系统具有良好的复用性、扩展性和可维护性。

摘要:在Jave EE应用开发中, 使用优秀的框架可以提高系统的开发效率、更稳定的性能、同时有利于后期的维护和更新。通过整合Struts 2、JPA、Spring 2三个框架, 构建了一种轻量级Java EE架构。该架构以Spring 2为核心, 整合JPA进行持久化访问;整合Struts 2以MVC模式控制。并利用此架构设计开发了基于ITIL的IT服务管理中服务台系统。实践证明, 该架构使得项目开发简洁、结构清晰, 并具有良好的复用性、扩展性和可维护性。

关键词:服务台,框架,Struts 2,JPA,Spring 2

参考文献

[1]Roughley I.Starting Struts2. (2007) http://www.infoq.com/mini-books/starting-struts2.[2008-06-12]

[2]李刚.Struts2权威指南———基于WebWork核心的MVC开发.北京:电子工业出版社, 2007

[3]肖菁.使用Apache OpenJPA开发EJB3.0应用. (2007) http://www.ibm.com/developerworks/cn/java/j-lo-openjpa1/[2008-06-12]

[4]陈雄华.精通SPRING2.X:企业应用开发详解.北京:电子工业出版社, 2007

[5]窦东阳, 赵英凯, 许文稼.利用Myeclipse简化基于Hibernate的数据库访问.计算机工程与设计, 2007; (2) :773—774

上一篇:高职软件技术专业下一篇:时尚化途径