Spring+Struts+Hibernate CRUD开发
1. Domain 设计
1. 设计并建立数据库。
2. 生成entity class 和hibernate hbm映射文件。
可以使用springside带的hibernate tools ,从数据库生成hbm 和 pojo文件。
也可以手工编写,或者使用自己喜欢的工具如MyEclipse自动生成。
3. 为hibernate绑定hbm文件。
在Spring的dataAccessContext.xml 文件的<sessionFactory>节点,加入location属性指向hbm的目录。
<property name="mappingDirectoryLocations">
<list>
<value>classpath*:/org/springside/helloworld/model/hbm/</value>
</list>
</property>
2. 业务层设计
建议项目开始时DAO与Manager可以合一,且不需要Interface。
2.1 编写Manager类
一般继承于HibernateEntityDAO
。基类里已存在默认的CRUD函数,子类只要用泛型语法声明自己管理的Entity类型即可。代码如下:
public class UserManager extends HibernateEntityDao<User> {
}
如果你的Manager是简单的CRUD类,没有其他的商业方法,那就恭喜了,上面的代码就是全部。
2.2 在Spring Context 中定义Manager类
1.Manager定义:
建议context文件命名为 serviceContext-module_name.xml,在Spring 2.0的事务配置下,Manager只需直接定义:
<beans default-autowire="byName" default-lazy-init="true">
<bean id="userManager" class="org.springside.helloworld.service.UserManager"/>
</beans>
2. 事务配置:
见dataAccessContext.xml 中的配置,SpringSide 已经默认统一配置了org.springside..*Manager 的CRUD操作事务,如果有特殊业务函数名,(to document).
3. Controller 层设计
Controller层请先阅读 Pragmatic Struts ,避免就是Struts 用法的烦琐。
3.1 Controller 编写
Controller如果继承于SpringSide的StrutsEntityAction
,也是默认拥有CRUD的Action,非常节约代码。
如果不是CRUD的Action,则继承于StrutsAction
(在Struts DispatchAction的基础上添加了一些便捷方法,详见其JavaDoc
),推荐每个Action响应一组相关的请求,以url参数决定要调用的同名方法。
public class UserAction extends StrutsEntityAction<User> {
private UserManager userManager; public void setUserManager(UserManager userManager) {
this.userManager = userManager;
} @Override
protected UserManager getManager() {
return userManager;
}
}
UserAction 需要声明管理类型为User,实现IEntityDao(T) getManager() 函数,并实现setter函数让Spring注入userManager。
StrutsEntityAction
只是演示了一种封装的方式,大家可以参考来封装自己项目习惯的版本。
3.2 定义定义再定义
1. FormBean定义
采用LazyValidatorForm,内里是Apache Beanuitls的DynaBean,所以只需一句,不需要写FormBean类,也不用定义具体属性,详见Pragmatic Struts里的描述
<form-bean name="userForm" type="org.apache.struts.validator.LazyValidatorForm"/>
2. Action 定义
在struts-config.xml中定义如下:
<action path="/user" name="userForm" scope="request" parameter="method" validate="false">
<forward name="list" path="/WEB-INF/pages/userList.jsp"/>
<forward name="edit" path="/WEB-INF/pages/userForm.jsp"/>
<forward name="success" path="/user.do?method=list" redirect="true"/>
</action>
在action-servlet.xml中定义如下:
<bean name="/user" class="org.springside.helloworld.web.UserAction"/>
3.Form Validator 定义
Commons-Validator 有点烦,但是目前唯一比较通用的,Client/Server两端同时验证的方案,参看Helloworld里的validation.xml 函数。
4. JSP 页面
JSP强烈推荐使用2.0。只要充分使用JSP2.0的EL,直接在html中写$
Unknown macro: {book} 而不是<c:out value="$
">将获得简洁无比,可以比美velocity,freemarker的界面。
表格控件可以使用ExtremeTable 或者 DisplayTag。