Author: 江南白衣
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,继承于BaseController。BookManageController,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到自己项目中。
/core/plugins/security/ 封装了对URL和Manager方法进行基于角色的使用数据库存储配置的权限控制;基于规则引擎的ACL控制;页面内容控制的taglib及验证码JCaptcha的整合等基类。
/bookstore/plugins/security/ 中则存放了一系列Acegi相关的配置文件及一个Web界面的权限管理系统及。
XFire 使用窄接口导出的BookManager的服务器端,Groovy写的客户端,以及WSS4J安全认证和普通密码认证的的演示,无须启动Tomcat的客户端服务端单元测试代码的演示。
代码及配置文件均见bookstore\src\plugins\xfire
在书店首页的“WEB服务”连接里,通过Ajax调用Webservice客户端进行演示。两种验证方法的客户端代码在测试用例中。
另还有从WSDL->JAXB2 Java客户端代码的Ant target(build.xml)。
在xfire的ApplicationContext-webservice-client.xml中,演示了如何在ApplicationContext中定义Groovy写的Web Service Client Bean,
在书店首页的"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
用户下订单时,将会以推技术在管理后台顶部通知管理员。
bookstore\webapp\store\orderFinish.jsp 发起推送的动作,bookstore\webapp\admin\top.jsp负责接收,而bookstore\src\...\plugins\dwr\orderNotice.java及其配置文件负责被orderFinish.jsp的javascript调用,反向调用top.jsp中javascript。
在书店首页和Web服务页,使用Prototype的${}, Element系列简化了JavaScript的编写,并且保证JS代码兼容各种浏览器。
另采用event系列将Ajax改成观察者模式,保持对搜索引擎的friendly。
在书店后台订单销售报表演示了Birt的报表及饼状图功能。
SpringSide在/core/src/plugins/birt中扩展了Birt与Spring的结合BirtView。
而且扩展了可以在Java Manager类里统一进行报表查询后,再将查询结果放入报表引擎的方式。而不是默认的直接在报表模版里写SQL。
销售报表的统一查询使用了JDBC Template。因为避免破坏hibernate的二级缓存,JDBC Template只作查询用途。
在书店前台销售过程中会将满100元的订单打9折。见orderManager的pricing()函数
使用Drools 3.0的DSL 定义功能,以领域语言(DSL)编写计价规则。
规则见bookstore\resources\rules\pricing。
SpringSide对Drools调用过程结合Spring进行了封装,只需调用一个函数即完成整个规则运算,见/core/src/../jbossrules/。
在顾客下订时,将异步发信通知给管理员。Tomcat+ActiveMQ嵌入式Broker+Jenck JCA的体系,使用Spring的JMS Template进行发送信息,使用POJO接收信息。另demo了lingo的用法。
定时扫描缺货图书,发信通知管理员,只需在Spring中编写配置文件,即可定时调用POJO的某个方法。
使用Compass,只需在商业对象上加上少量annotation, 即会将商业对象--图书的书名,描述,作者转换到Lucene的全文搜索引擎,并会随Hibernate对图书的改动而更新索引。anootation注释见Book.java和Category.java
书店前台首页的图书搜索,由Compass提供Spring MVC Controller ,SpringSide进行了高级搜索的扩展,提供高级搜索的界面,并以"拼SQL"的方式转为Lucene Query语句。
后台的建立索引,也由Compass提供Spring MVC Controller
可选的书店管理后台。在后台的top.jsp有链接选项。
AOP+Ehcache在书店管理后台首页 缓存缺货图书等方法的结果。不过现在cglib不能二次proxy,BookManager改动时不能更新索引。
在图书管理界面,使用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。
在图书管理界面及订单管理界面,演示extremeTable及其分页,排序,导出Excel,合计,i18N表头等特征。
前台书店首页的图书分类,最新图书等更新不频繁的区块使用OSCache进行缓存。
使用SiteMesh渲染书店前台我的帐号下的各个页面,动态加入用户菜单。
sitemesh2.1版存在UTF-8 bug及其他问题,springside采用的是CVS中的版本。配置文件在bookstore\webapp\WEB-INF\decorators.xml,为了根据URL参数来决定装饰,SpringSide提供了一个新的mapper。
OutLook Style的动态菜单,根据用户权限展示,并编写了一个角色-菜单项配置界面。
在图书管理页面(bookstore\webapp\admin\listBook.jsp/editBook.jsp)演示了I18N的使用,在整个项目都使用了UTF-8。
在图书管理界面 将log记录异步写入数据库,通过MDC自动记录操作员id的演示。(参考文档 )
使用Junit + EasyMock + Spring进行测试,SpringSide对Dao,Controller,WebService的测试基类进行了封装,见core/src/core/test。
bookstore/test/unit 下演示了对Dao,Controller,WebService的典型测试方式。
交互式的Ant 脚本完成 编译,测试,打包war,生成IDE项目文件等任务,并演示了Ant中的编程型脚本的书写(参考文档 )
由Ant调用的Maven2 library管理机制。(参考文档 )