Web项目架构之接口骨架设计

今天开始更新上学期项目的总结,再不更新马上都忘了,同时也和CSDNer分享一下,和大家交流关于系统设计的方法,欢迎大家拍砖、扔砖、泼凉水。。。

1.Spring+Hibernate+Struts2架构图

1.架构分析图

直接上图吧,有图有真相很容易分析
技术分享


上面的架构中采用了MVC三层架构的方式,其中M:Model模型层 V:View视图层 C:Control控制层,其中模型层有各种JavaBean来担当,View视图层是有JSP(Struts2标签)充当,控制层有Struts2的Action来充当。上面是架构的角度来分的,如果用工程的思想进行实现就是Action-->Service-->DAO

2.各个实现技术分析

a.Struts2:首先解释一下Struts2和Struts1并没有多大的关系,Struts2是虽然是WebWork和Struts1发展过来的,但是从源码上来看60%的核心都是从WebWork继承过来的。Struts2的Action为每次的请求都分配一个实例对象,因为不会产生线程安全的问题,但是如果和Spring集成必须要注意线程安全的问题,由于Spring的IOC容器在管理POJO的时候是采取单例的,所以必须给Action设置为prototype(scope:singleton|prototype|request|session|global session)类型。
Struts2的优势
* 基于Filter设计的(耦合度低)
* 原生Servlet API
* 拦截器的大量使用(责任链模式)

b.Hibernate:负责DAO层,使用连接池来提供数据库连接,虽然这些都是有Spring来管理,但是Hibernate在web中的地位是非常重要的。持久化层的框架其实不止Hibernate同时还有MyBatis、Toplink等等,但是只有Hibernate和MyBatis用的比较多,如果把Hibernate比作全自动洗衣机的话那么MyBatis就是手动洗衣机。虽然使用Hibernate比较方便不用使用一条SQL就可以进行查询,但是在实际项目不推荐这种方式,还是需要使用原生的SQL进行操纵效率相对较高,同时手写SQL可以优化查询效率。

c.Spring :怎样对Spring描述呢?其实Spring在Web开发中的位置太重要了,如果用一个比喻来说,可以这样理解,“Spring相当于一个电饭煲,而Hibernate、Struts2、MyBatis、Spring MVC等框架相当于里面的各种食物,全都依赖于电饭煲,大家才能吃上美味。”Spring的诞生也就是Java的春天的到来,哈哈哈。。。其实Spring为了管理这些框架采用了很有名的IOC(Inversion of Control)控制反转的思想,改变以往Java程序中用到什么对象就new一个,现在使用IOC就是使这种思维发生了转变,对象都在Spring容器中被托管了,程序需要的时候我就可以给你提供,用完了就可以进行回收,整个对象的生命周期全部都有Spring容器全程负责。我们只需要负责业务的实现,这样极大的方便了开发。

同时Spring还使用了一个非常重要的思想AOP(Aspect Oriented Programming )面向切面思想,这是个什么东东呢?请看下图:
技术分享


图中表示一个程序的执行流程,其中红色方框中的方法表示程序本身要执行的业务方法,AOP可以在这个方法执行之前、之后可以切入要执行的方法,这样可以将程序的低耦合思想发挥到机制。举个非常简单的案例:红色方框相当于取钱的方法,在到ATM机取钱之前ATM机器要启动日志方法、安全性检查,取钱完毕方法执行完毕后要进行拔卡操作等等,其中启动日志方法、安全性检查就相当于用AOP切入的方法。AOP面向切面编程的实现原理就是动态代理,而动态代理是从静态代理发展过来的,弄清楚了静态代理也就很容器的搞懂AOP是怎么回事了,目前实现主流的代理有JDK代理和Cglib代理,其中JDK代理是基于接口的所以很有优势扩展性比较好,而Cglib是final类型的,表现不是很好。下面的一讲中会将代理模式,具体剖析AOP实现的原理。

2.基础架构中灵活接口的设计

1.实体关系设计

设计模式中非常重要的一个原则就是开闭原则:对修改关闭对扩展开放。一个好的设计是非常难得的,需要不断的改进和进化。下面是基于一个权限系统案例进行分析,实体关系图如下:
技术分享


用户和角色是一对多的关系,角色和权限是多对多的关系,权限和资源链接之间是一对多的关系。在有的系统中权限设计中只有用户、角色和资源。这个设计多了个权限实体是因为在大型系统中角色权限分的比较详细,所以这样有助于对权限的管理和操作。

2.系统接口设计
技术分享


上图中展示了系统的接口设计,其中将DAO中通用的方法抽象到了CommonDAO< T >中同时采用泛型设计可以适合于多种实体,然后在抽象方法CommonDAOImpl(抽象类)中具体实现。这样其他DAOImpl可以直接继承CommonDAOImpl这样就非常清晰了,以后扩展DAOImpl直接继承通用的实现类就可以了。对于Service接口库的设计,统一抽象到CommonService< T >中,然后让CommonServiceImpl(抽象类)进行实现,每个ServiceImpl可以实现自己的接口同时继承CommonServiceImpl这样就可以实现,自由的扩展,同样的道理将Action中的实体实例化放到了父类CommonAction进行实现,子类Action直接继承就可以了。这种设计方法和门面模式差不多,只不过改良的太多了。

3.项目流程分析

下面讲解一下具体的项目框架搭建的过程:
1.创建web项目设置项目编码为UTF-8
2.创建项目包结构


技术分享


3.编写配置文件整合框架顺序如下
Struts2–>Hibernate–>Spring
struts.xml–>web.xml–>hibernate.cfg.xml–>applicationContext.xml–>web.xml
4.编写测试实体
5.用JUnit4编写测试用例,看到绿条线就整合成功了

到此所有的WEB项目基础框架搭建成功了,下一节总结一下代理模式中的静态代理和动态代理,诠释AOP原理的实现方式。


非常高兴和大家交流学习
自由转载,创意许可,请注明文章来源,来自这里
(http://blog.csdn.net/unikylin)

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。