架构及旅游指南

   Author: 江南白衣 

1.SpringSide架构概述

SpringSide最基本的架构:

Spring 2.0 + Hibernate 3 + Spring MVC Multi-Action + JSP2.0 + SpringSide Core  

Model层: SpringSide Core提供了基于Spring/Hibernate的BaseHibernateDao,Manager类一般会直接继承于它,no dao, no interface,非常紧凑。到了真正需要的时候,才在Manager内部拆分dao,抽取interface,原因见Why Not 分册

CategoryManager代表那种直接继承基类而拥有全部CRUD方法的业务类。BookManager、OrderManager则进行了扩展。

Controller层:Spring MVC的Multi-Action Controller使得可以用一个Controller响应一组相关的Action,使用URL参数或者URL智能映射来确定所调用的函数。Spring MVC的最大的特点是非常的Servlet。

BookstoreController 是普通的Multi-Action,继承于BaseControllerBookManageController,OrderManageController则因为CRUD的特质比较明显,继承于BaseManageController

View层:使用JSP2.0,提倡使用CSS排版,并尽量使用Ajax和Rich Widgets。

代码的大致划分:

/springside-core 放可重用的springside基类.里面core代表比较常用的基类,plugins代表对开源项目的封装和扩展。

/springside-bookstore 放的是书店示例的代码,里面又分为commons代表公共,admin 、store代表前台和后台两个模块,plugins 代表附加feature的演示。

/springside-template 用户可以此目录生成新的Project.将陆续把各项feature整理出来,方便大家直接copy到自己项目中。

2.Features介绍

2.1 Acegi 安全控制

   /core/plugins/security/ 封装了对URL和Manager方法进行基于角色的使用数据库存储配置的权限控制;基于规则引擎的ACL控制;页面内容控制的taglib及验证码JCaptcha的整合等基类。

   /bookstore/plugins/security/ 中则存放了一系列Acegi相关的配置文件及一个Web界面的权限管理系统及。

2.2 XFire exported WebService POJO

 XFire 使用窄接口导出的BookManager的服务器端,Groovy写的客户端,以及WSS4J安全认证和普通密码认证的的演示,无须启动Tomcat的客户端服务端单元测试代码的演示。

   代码及配置文件均见bookstore\src\plugins\xfire 

   在书店首页的“WEB服务”连接里,通过Ajax调用Webservice客户端进行演示。两种验证方法的客户端代码在测试用例中。

   另还有从WSDL->JAXB2 Java客户端代码的Ant target(build.xml)。

2.3 Spring与Groovy等动态脚本的结合

在xfire的ApplicationContext-webservice-client.xml中,演示了如何在ApplicationContext中定义Groovy写的Web Service Client Bean,

2.4 DWR exported Ajax Service层

 在书店首页的"Web服务"连接里,提供了Ajax版的图书查询功能,用js访问远程服务器的商业逻辑层--在本处是一个Web Service Client。
   并演示用JSTemplate将返回的POJO渲染成复杂的页面。
      用Script.aclous的Dom Builder把POJO渲染成简单页面。

 DWR的配置文件在bookstore/webapp/WEB-INF/dwr.xml,使用的页面在bookstore\webapp\plugins-demo\dwr

2.5 DWR2.0的JS推技术

  用户下订单时,将会以推技术在管理后台顶部通知管理员。

  bookstore\webapp\store\orderFinish.jsp 发起推送的动作,bookstore\webapp\admin\top.jsp负责接收,而bookstore\src\...\plugins\dwr\orderNotice.java及其配置文件负责被orderFinish.jsp的javascript调用,反向调用top.jsp中javascript。

2.6 Prototype.js

在书店首页和Web服务页,使用Prototype的${}, Element系列简化了JavaScript的编写,并且保证JS代码兼容各种浏览器。

另采用event系列将Ajax改成观察者模式,保持对搜索引擎的friendly。

2.7 BIRT report

  在书店后台订单销售报表演示了Birt的报表及饼状图功能。 
       SpringSide在/core/src/plugins/birt中扩展了Birt与Spring的结合BirtView。
       而且扩展了可以在Java Manager类里统一进行报表查询后,再将查询结果放入报表引擎的方式。而不是默认的直接在报表模版里写SQL。     

2.8 Spring JDBC Template

销售报表的统一查询使用了JDBC Template。因为避免破坏hibernate的二级缓存,JDBC Template只作查询用途。

2.9 JBossRules Rule Engine

  在书店前台销售过程中会将满100元的订单打9折。见orderManager的pricing()函数

  使用Drools 3.0的DSL 定义功能,以领域语言(DSL)编写计价规则。

  规则见bookstore\resources\rules\pricing。

  SpringSide对Drools调用过程结合Spring进行了封装,只需调用一个函数即完成整个规则运算,见/core/src/../jbossrules/。

2.10 ActiveMQ+Jencks JMS POJO

 在顾客下订时,将异步发信通知给管理员。Tomcat+ActiveMQ嵌入式Broker+Jenck JCA的体系,使用Spring的JMS Template进行发送信息,使用POJO接收信息。另demo了lingo的用法。

2.11 Quartz exported Task POJO

  定时扫描缺货图书,发信通知管理员,只需在Spring中编写配置文件,即可定时调用POJO的某个方法。

2.12 Compass + Lucene 全文搜索引擎 

使用Compass,只需在商业对象上加上少量annotation, 即会将商业对象--图书的书名,描述,作者转换到Lucene的全文搜索引擎,并会随Hibernate对图书的改动而更新索引。anootation注释见Book.java和Category.java

书店前台首页的图书搜索,由Compass提供Spring MVC Controller ,SpringSide进行了高级搜索的扩展,提供高级搜索的界面,并以"拼SQL"的方式转为Lucene Query语句。

后台的建立索引,也由Compass提供Spring MVC Controller

3.其他特征

3.1 Webwork

可选的书店管理后台。在后台的top.jsp有链接选项。

3.2 AOP+Ehcache

AOP+Ehcache在书店管理后台首页 缓存缺货图书等方法的结果。不过现在cglib不能二次proxy,BookManager改动时不能更新索引。

3.3 Commons-validator

    在图书管理界面,使用Spring-modules的Commons-validator整合,在client、server两端同时进行数据校验。

    在/bookstore/resources/conf/validator中定义validate的元数据,在总的application-context.xml中被载入
         在bookstore\webapp\admin\editBook.jsp中演示了客户端根据元数据自动生成js校验的效果
         在bookstore\src\org\springside\bookstore\admin\web\controller\BookManageController中演示了整合Spring MVC Validator的Commons Validator。

3.4 ExtremeTable Taglib

   在图书管理界面及订单管理界面,演示extremeTable及其分页,排序,导出Excel,合计,i18N表头等特征。

3.5 OSCache

  前台书店首页的图书分类,最新图书等更新不频繁的区块使用OSCache进行缓存。

3.6 SiteMesh

 使用SiteMesh渲染书店前台我的帐号下的各个页面,动态加入用户菜单。

sitemesh2.1版存在UTF-8 bug及其他问题,springside采用的是CVS中的版本。配置文件在bookstore\webapp\WEB-INF\decorators.xml,为了根据URL参数来决定装饰,SpringSide提供了一个新的mapper。

3.7 动态Menu

OutLook Style的动态菜单,根据用户权限展示,并编写了一个角色-菜单项配置界面。

3.8 I18N与 UTF-8

在图书管理页面(bookstore\webapp\admin\listBook.jsp/editBook.jsp)演示了I18N的使用,在整个项目都使用了UTF-8。

3.9 Log4j高级用法

  在图书管理界面 将log记录异步写入数据库,通过MDC自动记录操作员id的演示。(参考文档 )

3.10 Dao,Controller,WebService Test

使用Junit + EasyMock + Spring进行测试,SpringSide对Dao,Controller,WebService的测试基类进行了封装,见core/src/core/test。

bookstore/test/unit 下演示了对Dao,Controller,WebService的典型测试方式。

3.11 交互式的Ant 脚本及Maven管理jar

       交互式的Ant 脚本完成 编译,测试,打包war,生成IDE项目文件等任务,并演示了Ant中的编程型脚本的书写(参考文档 )

       由Ant调用的Maven2 library管理机制。(参考文档 )