基于springside构建:
包结构说明:
Utils中存放系统公用类,其中SysConstants类存放系统常量。
Workflow包存放与工作流相关的信息,包含jpdl文件,流程授权类,流程监听类等。
系统整体层次结构:
POJO:采用注解形式,具体可以参照系统中已有的entity中的注解。
DAO :处理与数据库交互的功能 所有DAO的基类为HibernateDAO
SERVICE:事务管理,业务过程,系统核心业务逻辑所在 由spring 管理事务 使用spring注解将其注册为bean,所有类名上面加上:
@Service
@Transactional
为了减少类的数量,通常是一种业务过程对应一个Manager,比如系统的安全模块对应一个Manager,而不是一个业务实体对应一个Service,当然,这由你自己根据实际进行决定。
仍然采用IoC的形式获取其它的bean,只需要将你的bean 加上注解:@autowired即可。 spring会根据类的类型进行注入。 通常情况下Service也不需要接口。
Action:MVC采用struts2,所有Action的基类为CrudActionSupport
注意:所有action方法的返回结果值通常情况下是一致的:比如
查询(方法名为list )跳转返回 SUCCESS
添加或者修改 (方法名为input)跳转返回 INPUT;
添加或修改(方法名为SAVE)成功或者delete(方法名为delete)后返回RELOAD
同样Action中对manager的注入是采用 @autowired 不需要get/set方法。
注意:为了保证代码的一致性,请不要在Action中直接注入DAO 而且DAO是不在事务管理中的。
系统查询功能的实现:
系统查询的功能由springside实现,可以不限字段,不限条件,而且不需要自己拼写SQL语句:具体方法为:
在查询页面上写查询字段,比如 filter_EQS_name” value="${param[' filter_EQS_name ']}" >
关键是这个name:filter_EQS_name 其中filter为固定前缀,EQ表示equals,代表SQL语句中的”=” ,当然还有LIKE,LT,GT,LE,GE。”S”代表你的这个字段为String类型,还可以写I(Integer),N(Double),D(Date)等,注意:Double类型为N!最后为你的字段在hibernate POJO中的字段名。 如果你想这个查询框既可以根据字段1模糊查询,也可以根据字段2模糊匹配,你可以这么写:name=”filter_LIKES_NAME_OR_EMAIL_OR_LOGINNAME”
在Action中你需要写:
List
调用你Manager中的search方法,你的search方法大约会是这个样子:
@Transactional(readOnly = true)
public Page
final List
return userDao.findPage(page, filters);
}
这个方法连分页也包含了。
系统分页功能的实现:
在查询页面上你需要写上:
查询form的name为:mainForm
在form中写入:
<input type="hidden" name="page.pageNo" id="pageNo" value="${page.pageNo}"/>
<input type="hidden" name="page.orderBy" id="orderBy" value="${page.orderBy}"/>
<input type="hidden" name="page.order" id="order" value="${page.order}"/>
然后
通常在form的结束之前导入:<%@ include file="/common/pages.jsp" %>
页面部分即结束:
在Action中加入全局变量:
private Page
如果你想在查询之前根据某字段进行排序,你可以在查询之前写上:
if (!page.isOrderBySetted()) {
page.setOrderBy("id");
page.setOrder(Page.ASC);
}
然后在查询时将page对象传入即可。
未完待续....