去年实验室的一个项目是一个android端的餐饮查询推荐、社交平台开发,我主要是负责系统后台的功能设计与实现。
我们的后台采用的是ssh架构,架构模板据说来源于百度的项目。开发起来非常快,模板果然很强大。
下面分别从struts、hibernate、spring、数据库四个方面,从前端到后端依次介绍。
struts:我们规定系统前后台的数据交互格式是json,这样前后台数据交互十分方便,扩展性也很好。但是有个问题就是前后台的变量名必须得完全一致,一旦不一致前台将无法正确解析后台传递的数据。而且我们前后台是独立的项目,因此必须十分小心来统一定义变量,否则出现问题后前后台联调很难发现问题出在哪里。所以下一步就是让前后台使用同一个类定义,这样就不会出现变量名不一致的情况了。
hibernate:我们采用hibernate来做ORM,极大地方便了我们的开发,只需要将数据库中表通过hibernate 的配置文件映射到类中,就可以直接在Dao中对类进行操作从而实现对数据库中的表进行操作了,而且通过使用模板类BaseDao,将Dao中大部分操作在父类中实现,大大简化了Dao中的操作。而且我么避免了在hibernate的配置文件中使用级联操作,级联操作确实可以维护外键的一致性,但是会使得表类变得复杂,我们决定抛弃级联操作,手动编码维护外键的一致性。
spring:不得不说spring真的太强大了。项目中的Dao类,Service类,都是通过spring的依赖注入进行托管的,事务也是由spring进行托管的。我们只需要在配置文件中完成待依赖注入的类扫描文件路径配置。对于类、数据库连接等资源管理,spring全部都帮我们做了,而且spring采用的是注解方式的依赖注入,用起来十分方便。spring采用的面向切面的编程方式(AOP),我们在实现业务处理逻辑时可以首先只将注意力集中在接口实现上面,从而专注于业务的表达而不是具体的实现上。定义完接口后,整个项目的框架也有了,之后才是关注实现的细节。
数据库:数据库的方面,我们首先是在Mysql Workbench设计类图,E-R图,设计时要注意不要添加外键连接,否则生成表后要修改会很麻烦。通过model synchronization,直接就可以在数据库中生成相应的表,而且E-R图可直接作为数据库文档中的设计图。在数据库表设计方面,我们的表名全部采用实际意义的英文单词小写,下划线连接,列名也是如此。每张表必须有一个整型主键,并且该主键不对应实际意义。
总的来说,ssh框架分层十分清晰,action,interface,service,dao,各司其职。 但这也是ssh框架一个很大的弊端,我们只能从上往下调用,而不能进行层间调用,比如说我一个service不能调用另外一个service的功能实现。解决这个问题方法,一个是我们可以将该功能放在utils包中,作为通用类使用。其二就是如果功能设计分工合理,还是可以避免很大一部分这种问题的出现。我已经将该项目的框架模板剥离出来了,可以直接使用来实现快速开发,我会将其放在我的github上 (框架地址)。