为什么不写得明确一些,很多地方都找不到!
创建你的第一个SpringSide应用(下) --CRUD代码编写
- 阅读创建你的第一个SpringSide应用(上)--生成项目,生成新项目。
- 阅读Helloworld--第一个示例,了解SpringSide的基本架构。
- 阅读IDE开发环境设置,设置IDE。
- 如果生产环境的应用服务器与数据库与springside默认环境不同,请阅读应用服务器与数据库移植。
1. Domain 设计
1.1 从数据库开始设计
先设计数据库,然后用Hibernate Tools插件生成使用Hibernate Annotation,直接在POJO上注释映射关系的POJO,详见Hibernate Tools
因为默认假设类名与数据库表名,属性名与数据库列名相同,因此一般只需只以@Entity注释类,以@Id 和 @GeneratedValue在getter上注释id列,表明主键及其生成策略。eg.
@Entity
public class User {
Integer id;
String name;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
一对多关系配置等请参考Hibernate Annotation指南。
1.2 为hibernate sessionFactory绑定映射Pojo
在src/resources/spirng/dataAccessContext-hibernate.xml 的<sessionFactory>节点的<annotatedClasses>节点增加pojo:
<property name="annotatedClasses">
<list>
<value>org.springside.helloworld.model.User</value>
</list>
</property>
2. 业务层设计
建议项目开始时使用SpringSide的DAO与Manager可以合一,且不需要Interface,详见DAO层总述。
2.1 编写Manager类
一般继承于HibernateEntityDAO
。基类里已存在默认的CRUD函数,子类只要用泛型语法声明自己管理的Entity类型即可。代码如下:
public class UserManager extends HibernateEntityDao<User> {
}
如果你的Manager是简单的CRUD类,没有其他的商业方法,那就恭喜了,上面的代码就是全部。
如果UserManager要操作User外的其他Entity,可以注入另一个Manager,事务方面没有问题,也可以使用继承于HibernateGenericDao
的带EntityClass参数的函数直接操作。
HibernateEntityDao的文档详见SpringSide的Hibernate封装。
2.2 在Spring Context 中定义Manager类
spring context文件放在/src/resources/spring中,建议每个module一个context文件(项目较小时也可以不分开),命名为 serviceContext-module_name.xml,。
因为Spring 2.0作了统一事务配置,加上default-autowire后,Manager只需直接定义:
<beans default-autowire="byName" default-lazy-init="true">
<bean id="userManager" class="org.springside.helloworld.service.UserManager"/>
</beans>
2.3 编写业务类测试用例
复制hellworld example的UserManagerTest.java的CRUD测试方法, 作为中途岛测试前半段的工作正确,包括项目、映射关系及业务类的配置。
3. Controller 层设计
请先阅读 Pragmatic Struts ,避免旧式Struts 用法的繁琐。
3.1 Controller 编写
Controller如果继承于SpringSide的StrutsEntityAction
,也能默认拥有CRUD,非常节约代码。
如果不是CRUD的Action,则继承于StrutsAction
(在Struts DispatchAction的基础上添加了一些便捷方法,详见其JavaDoc
),推荐每个Action响应一组相关的请求,以url参数决定要调用的同名方法。
public class UserAction extends StrutsEntityAction<User,UserManager> {
private UserManager userManager;
public void setUserManager(UserManager userManager) {
this.userManager = userManager;
}
}
UserAction 首先用泛型声明管理类型为User,Manger类型为UserManager,再声明userManager变量和它的setter函数,就拥有了默认的CRUD管理函数。
StrutsEntityAction
只是演示了一种封装的方式,大家可以参考来重新继承或封装自己项目习惯的版本。
3.2 配置配置再配置
建议每个模块定义一个struts文件,在WEB-INF/modules中放置struts-config-modulename.xml,在WEB-INF/web.xml的struts定义节点将其载入。
对应spring controller配置文件同样放在WEB-INF/modules中,命名为spring-config-modulename.xml,在WEB-INF/action-servlet.xml 中将其载入。
如果项目较小,两者可直接写在struts-config.xml 和 action-servlet.xml。
1. FormBean定义
采用LazyValidatorForm,内里是Apache Beanuitls的DynaBean,所以只需一句,不需要写FormBean类,也不用定义具体属性,详见Pragmatic Struts里的描述。
<form-bean name="userForm" type="org.apache.struts.validator.LazyValidatorForm"/>
2. Action 定义
在struts-config-modulename.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>
在spring-config-modulename.xml中定义如下:
<bean name="/user" class="org.springside.helloworld.web.UserAction"/>
其中 bean的 name 与struts action定义中的path 一致。
3.Form Validator 定义
Commons-Validator 有点烦,但是目前唯一比较通用的,Client/Server两端同时验证的方案,参看Helloworld里的validation.xml 文件,并修改i18n messages文件。
4. JSP 页面
view强烈推荐使用JSP 2.0。只要充分使用JSP2.0的EL,直接在html中写${book.name}而不是<c:out value="${book.name}"/>
JSP页面在/webapp/WEB-INF/pages目录下按module存放,参考新项目中的sampleList.jsp 与 sampleForm.jsp
xxxList.jsp 表格控件可以使用ExtremeTable 或者 DisplayTag。
xxxForm.jsp 暂时仍然用Struts带的taglib,如果要自行输出formbean的值,可以写${userForm.name}, ${userForm.map.name}。
5. 检验成果
双击项目的quickstart.bat 进行编译部署。
最后,还可以为界面编写一个Selenium的功能测试用例。