应用逻辑层采用的是Struts Framework中所提供的ActionServelt和Action进行应用逻辑控制,也就是说当客户端浏览器发送HTTP请求时,ActionServelt就会把请求中所包含的数据封装到ActionForm,也就是将客户端HTML页面中的表单和ActinForm进行数据绑定,然后将请求的操作依据struts-confi.xml中的配置转到相应的Action中去进行处理。由于我们采用的是SSH框架(Struts+Spring+hibernate),所以在这个时候,Action就会调用数据访问层的DAO(数据访问对象),也就是使用hibernate实现的具体业务类中的业务处理方法,当DAO将业务逻辑处理完毕后会将数据返回给Struts中的Action。这时候呢,Spring的作用就体现出来了,他很巧妙地把业务逻辑对象生命周期的控制权从Action中拿走,交由Spring容器来管理。这就是Spring的IOC机制,也就是控制反转或者是依赖注入,而从头到尾Action仅仅是充当了应用逻辑控制工具,这些具体的业务方法是怎样实现的,他根本就不会管,也不会问,他只要知道这些业务实现类所提供的方法接口就可以了。而在以往单独使用Struts框架的时候,所有的业务方法类的生命周期,甚至是一些业务流程都是由Action来控制的。
层与层之间耦合性太紧密了,既降低了数据访问的效率又使业务逻辑看起来很复杂,代码量也很多。而现在我们把应用逻辑交给Struts去处理,数据访问交给hibernate来处理,Spring容器控制所有Action对象和业务逻辑类的生命周期,由于上层不再控制下层的生命周期,层与层之间实现了完全脱耦,使程序运行起来效率更高,维护起来也方便。 数据持久层这块,我们采用的是hibernate ,把底层一些增删该查等公共方法抽象成接口,要使用这些具体的方法时,只需实现这些接口就可以了,大大提高了代码重用性,而表与表之间的关系也通过ORM映射成xml配置文件,也就是把数据库中表与表之间的管理看成对象来进行映射管理。而这些都是通过开发工具对hibernate的支持,能够自动反向生成,很方便。当然在提到接口和代码重用,我们自然会想到工厂模式,但在使用工厂模式的时候,我们的代码都是写死在类里面。这样很不好,如果我换一个子类呢,就要修改工厂方法,还有就是一个类就意味着一个生成工厂。这样的话,就会生成很多工厂类,代码重用度也不号。而现在改用Spring的IOC也就是依赖注入来管理这些接口的话,我们的Spring IOC也就是依赖注入或者是控制反转就会把这些在工厂里写死的方法的对象改变一下,由xml文件来定义。当我们需要换一个实现子类的时候只要修改xml文件就可以了,这样就可以把工厂和对象生成两者对立开来,大大提高了灵活性和可维护性。 还有就是在对数据进行增删改查操作的时候,为了提高安全性自然会用到事务,在以往JDBCTemplate中事务提交成功,异常处理都是通过Try/Catch 来完成,而在Spring中。Spring容器集成了TransactionTemplate,她封装了所有对事务处理的功能,包括异常时事务回滚,操作成功时数据提交等复杂业务功能。这都是由Spring容器来管理,大大减少了程序员的代码量,也对事务有了很好的管理控制。Hibernate中也有对事务的管理,hibernate中事务管理是通过SessionFactory创建和维护Session来完成。而Spring对SessionFactory配置也进行了整合,不需要在通过hibernate.cfg.xml来对SessionaFactory进行设定。这样的话就可以很好的利用Sping对事务管理强大功能。避免了每次对数据操作都要现获得Session实例来启动事务/提交/回滚事务还有繁琐的Try/Catch操作。这些也就是Spring中的AOP(面向切面编程)机制很好的应用。一方面使开发业务逻辑更清晰、专业分工更加容易进行。另一方面就是应用Spirng AOP隔离降低了程序的耦合性使我们可以在不同的应用中将各个切面结合起来使用大大提高了代码重用度。
数据库访问层和业务层的区别:
用SSH框架做一个用户模块:
1、假设现在你做这个功能会用到user表和权限表,那么你前台的页面访问action,action再去调用用户模块service,用户模块service判断你是操作user表还是权限表,如果你操作的是user表则service的实现类就去调用userDAO。如果是操作的是权限表则调用权限的DAO
2、也就是说DAO一定是和数据库的每张表一一对应,而service则不是。明白的没?其实你一个项目一个service和一个DAO其实也一样可以操作数据库,只不过那要是表非常多,出问题了,那找起来多麻烦,而且太乱了
3、好处就是你的整个项目非常系统化,和数据库的表能一致,而且功能模块化,这样以后维护或者改错比较容易,性能也高一些。
目前大部分android应用都要客户端与服务端交互。自己开始边写边做服务端。
1, 设计数据库表。数据库选用mysql,这里可以使用工具NavicatforMySQL来方便的创建数据库表。编码选择utf-8。
2,服务端最常用的框架是SSH框架。需要先搭建SSH框架。
Myeclipse里新建web工程,选择javaEE5.0。添加struts框架。 右键工程-MyEclipse-add Struts capabilities- finish. 勾选struts2-spring libraries.
此时web.xml中自动添加了启动struts的过滤器。
3,创建struts.xml配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name=" " namespace="/" extends="struts-default">
<action name=" " class=" ">
</action>
</package>
</struts>
4,创建整个工程的包目录
dao:持久层
service:业务层代码,实现业务拦截,代码增强。
action:控制层代码
model:数据模型,实体类,以及映射文件
util:其它工具类
5,添加spring框架
选择 spring core ,spring AOP ,spring Persistence * , testing support , web library,选择copy checked Libraries content to 。
在web.xml中添加
<!-- 指定以Listener的方式启动Spring容器,手动配置 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener </listener-class>
</listener>
6,添加Hibernate框架
首先要在Myeclipse中添加数据库驱动。
添加Hibernate框架,选择Hibernate Core,Hibernate annotations, Spring persistences Libraries
选择Spring configuration ,existing spring configuration files.
7, 对myeclipse中数据库的表选择逆向生成。Hibernate Reserve Engineering, 选择com.hl.model, 选择native。逆向工程完成后,可以在model中看到生成的实体类和Hiberate映射的配置文件。
在applicationContext.xml中添加代码,可以在控制台输出SQL语句。
<prop key = "hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">true</prop>
<!-- 设置Hibernate是否在控制台输出SQL语句,开发调试阶段通常设为true -->
<!-- 设置Hibernate一个提交批次中的最大SQL语句数 -->
<prop key="hibernate.jdbc.batch_size">50</prop>
8, 对数据库文件反编译
id generator 选择 native
这样就把SSH框架配好了。下篇开始实例使用。