1.1. 综述:考虑到性能,安全性,灵活性以及编程的方便等原因,系统采用目前网络编程流行的模式MVC。架设架构的主体技术采用Spring,Struts 作为核心,同时织入iBATIS,Log4j,JNDI,JMS,Acegi 等组件,完善框架。
1.1.1. Spring和Struts是成熟的框架,其轻量级的设计,以及其简化J2EE系统开发的目标正好符合我们的设计需求。它们两个核心特征分别是反向控制(IoC)和面向切面编程(AOP)。IoC实现了系统对象间的松耦合关联,使得代码更加清晰,更加容易管理,更容易测试,为以后的维护提供方便。AOP使得很容易的织入其他组件,并且使得各个组件的合作简便,也同样简化编程,方便维护。
1.2. 反向控制:
1.2.1. IoC:全名Inversion of Control
1.2.2. 问题的引入:在程序设计时,总会有这样的情况:由于应用程序需要某个功能需求时,直接执行了下一层的方法。情况如下图:
1.2.2.1. 这导致了高层应用程序依赖于低层模块的API,假设今天将应用程序移植至另一个平台上,而该平台使用USB磁盘存储,则这个应用程序无法直接重用,必须加以修改才行,在这个例子中,由于低层模块的存储介质变更,造成了高层模块也必须跟着变更,这不是一个好的设计方式,在设计上希望模块都依赖于模块的抽象,这样才可以重用于高层的应用程序设计。
1.2.3. IoC这个概念的引入,解决了这样的困境。IoC的Control是控制的意思,其实其背后的意义也是一种依赖关系的反转。依赖关系的反转即是控制关系的反转,将控制权由实现的一方移至抽象的一方,让抽象方拥有控制权,可以获得组件的可重用性。IoC要求的是容器不应该(或尽量不要)侵入应用程序,也就是不应该出现于容器相依的API,应用程序本身可以依赖于抽象的接口,容器可以透过这些抽象接口将所需的资源注入至应用程序中,应用程序不向容器主动要求资源,故而不会依赖于容器的特定API。这样的设计,可以随时将应用程序从容器中脱离,转移至其他容器或框架而不用做任何的修改。
1.2.4. IoC模式基本上是一个高层的模式概念,Martin Fowler谈到,实现IoC有两种方式:Dependency Injection于Service Locator,Spring所采用的是Dependency Injection来实现IoC,中文翻译为依赖注入。
1.2.4.1. 未实现反向控制的示例如下:
数据的获得是通过主动取得的,使其耦合紧密,侵入性强,不易于维护,管理等。
1.2.4.2. 采用了反向控制,数据取得方式如下:
此时,控制反向了。巧妙的利用面向对象的设值注入,使得注入信息方式灵活。在Struts+Spring做核心的架构里,可以配合xml配置文件,协调java语言的设置注入。而实际上,Spring最重要的核心概念就是IoC(Inversion of Control),反向控制。
1.3. 面向切面编程:
1.3.1. AOP:全名Aspect-oriented programming
1.3.2. 问题的引入:在应用程序的各个业务模块中,通常会调用到与业务无关的系统服务,而这些系统服务逻辑并不是业务逻辑的主要组成部分。对系统服务的调用经常分散在各个业务逻辑里,业务逻辑与系统逻辑的交互使得关系复杂化。一方面编写代码时,有一些非对象本身的职责的相关动作也混如了对象之中(例如权限检测,日志记录等等),会使得对象的负担进一步加重,甚至混淆了对象本身该负有的职责,对象本身的职责所占的程序代码,或许还小于这些与对象职责无关的动作或服务的程序代码;另一方面,若有朝一日不需要某些服务,那么我们就需要修改所有留下记录的程序代码,编程代码量剧增,应用程序也变得难以维护。
1.3.2.1. 未引入AOP概念的情况下,业务服务与系统服务的交互如下图。
1.3.2.2. 引入AOP概念的情况下,业务服务与系统服务关系如下图。
系统服务覆盖了它影响到的组件。框架的设计在于,将散落于各个业务对象之中的系统服务处理动作(Cross-cutting concerns)收集起来,设计各个独立可重用的未实例化的对象(Aspect),然后,把这些类的具体实现(Advice)根据某个定义(Pointcut)的指定时机(Joinpoint)应用到目标对象(Target)上。该过程就是织入的过程(Weave)。这样的编程模式,编写业务服务的代码,不会感觉到系统服务的存在,不必受到系统服务实现的干扰,而实际上系统服务已经被织入业务服务中。如图,AOP的名词用图片来表示如下:
2 命名规则:
2.1 源包路径及类命名规则:
2.1.1 根目录: com.scnu.xsboa..
2.1.2 模块: 前台模块:mod,后台模块:modb
2.1.3 formbeans:formbeans.mod.xxxFormbean
2.1.4 actions:actions.mod.xxxAction
2.1.5 services:services.mod.xxxService
2.1.6 daos:daos.mod..
2.1.6.1 ..xxxDao
2.1.6.2 ..xxxDaoImpl
2.1.7 sqlbeans:sqlbeans.mod...
2.1.7.1 ..xxxSqlbean
2.1.7.2 ..xxxSqlEx
2.2 页面目录命名规则:
2.2.1 根目录:/
2.2.2 模块:
2.2.2.1 前台模块:
2.2.2.1.1 /mod/..
2.2.2.1.2 /mod/forward/..
2.2.2.2 后台模块:
2.2.2.2.1 /modb/..
2.2.2.2.2 /modb/forwards/..
2.2.3 模板头尾:/public/HeaderAndFooter/..
2.2.4 导航菜单:/public/menu/..
2.2.5 各模块导航栏:/public/mod/..
2.2.6 图片:
2.2.6.1 /images/public/..
2.2.6.2 /images/mod/..
2.2.7 javascript:/js/..
2.2.8 css:/css/..
2.3 页面文件相关命名规则:
2.3.1 jsp页面:mod + 动词 + 宾语
2.3.2 actionpath:相关action的名字,形如:com.scnu.oa.action.mod.xxxAction.shtml