Helloworld Example
1. 概述
Hello World Example以标准的用户CRUD管理界面,演示了SSH经典架构的RoR Pragmatic版本,供大家入门了解SpringSide基本架构之用。
在线演示网站地址: http://demo.springside.org.cn/helloworld
进入examples/helloworld目录,双击bin/quickstart.bat即会看到上面的界面。
同时,Helloworld 还在extras目录提供了使用Struts与Hibernate的原生API而非SpringSide封装的版本,以及iBatis而非Hibernate的参考版本供大家对比参照。
2. 结构定义
目录结构参照 SpringSide项目目录结构说明, 数据库结构定义在 /src/resources/hsqldb/helloworld.script
3. CRUD核心代码
一个CRUD界面由下面的五个关键文件组成
- User-- POJO Entity
- UserManager--Business Manager
- UserAction -- Controller
- userList.jsp -- 用户列表页面
- userForm.jsp --新增与修改用户页面
3.1 User
User类使用了Hibernate Annotation来标示ORM的映射关系,因为默认类名与数据库表名,属性名与数据库列名相同,因此注释量比hbm文件大大降低。
代码中只以@Entity注释User类,以@Id 和 @GeneratedValue注释id列,表明主键及其生成策略,其余属性全部与数据库中的列默认映射。
@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;
}
}
完整代码见/src/java/org/springside/helloworld/model/User.java,详见 Hibernate Annotation篇。
3.2 UserManager,继承HibernateEntityDao
,基类使用SpringHibernateTemplate,并用泛型封装了默认的CRUD函数。
UserManager类用泛型语法声明自己管理的Entity类为User,即拥有完整的CRUD能力,下面的代码就是全部,比RoR并不逊色:
public class UserManager extends HibernateEntityDao<User> {
}
完整代码见/src/java/org/springside/helloworld/service/UserManager.java,详见SpringSide的Hibernate封装。
3.3 UserAction
Struts Action 部分避免了旧式Struts 用法的繁琐,详见Pragmatic Struts篇。
新模式下,继承DispatchAction 每个Controller 响应一组相关操作,LazyValidatorForm免去FormBean定义,同样采用了强力的StrutsEntityAction
CRUD基类。
UserAction 首先用泛型声明管理类型为User,Manger类型为UserManager,再声明userManager变量和它的setter函数,就拥有了默认的CRUD管理函数。
public class UserAction extends StrutsEntityAction<User, UserManager> {
private UserManager userManager; public void setUserManager(UserManager userManager) {
this.userManager = userManager;
}
}
完整代码见/src/java/org/springside/helloworld/web/UserAction.java,如果Action无关CRUD,则继承于只带少量Utils方法的StrutsAction类.
3.4 userList.jsp
完整代码见/webapp/WEB-INF/pages/userList.jsp,主要用ExtremeTable显示了用户列表。
3.5 userForm.jsp
完整代码见/webapp/WEB-INF/pages/userForm.jsp,使用Struts的taglib显示用户新增和修改的表格,并用commons-validator 校验用户输入。
4. 配置文件
虽然已经尽量减少,但仍需要一些很JavaEE特色的配置文件,才能把上面的CRUD代码跑起来。
注意配置代码分两类:基础的配置只需项目初始时一次性配置即可,而另一类则将随着界面数量的增加而增加。
Helloworld 中的配置文件为单模块的简单方式,多模块的方式请见BookStore 示例。
4.1 web.xml
完整代码见/webapp/WEB-INF/web.xml,主要定义了Spring与Struts的入口,将class path中/spring目录下的所有xml文件载入为Spring的ApplicationContext,把*.do交由Struts处理,并载入WEB-INF/struts-config.xml作为Struts的配置文件。
另外web.xml还定义了著名的Hibernte OpenSessionInView Filter和Encoding Filter。
4.2 Spring 配置文件
完整代码见/src/resources/spring下各文件。
- applicationContext.xml 定义应用公共部分,如AspectJ式事务控制定义 和载入properties文件--jdbc.properties
- dataAccessContext.xml 定义数据库访问相关的部分。包括数据库连接池,使用Annotation式定义配置的Hibernate SessionFactory(AnnotationSessionFactoryBean)及TransactionManager
- serviceContext.xml 增定义每个Manager类。
<beans default-autowire="byName" default-lazy-init="true">
<bean id="userManager" class="org.springside.helloworld.service.UserManager"/>
</beans>
因为该文件default-autowire="byName",而且载AspectJ 批量定义了事务,所以userManager 只需简单定义id 和class即可。
4.3 Struts 配置文件
因为Struts与Spring集成,配置文件包括WEB-INF下struts的struts-config.xml与spring的action-servlet.xml.
在struts-config.xml 中,引入了Spring的ContextLoaderPlugIn,指定了Commons-Validator,并定义UserAction
<form-beans>
<form-bean name="userForm" type="org.apache.struts.validator.LazyValidatorForm"/>
</form-beans>
<action-mappings>
<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-mappings>
因为FormBean采用LazyValidatorForm,一行简单声明即可。
Action因为与Spring集成,所以并没有声明具体实现类。 声明parameter="method",则 /user.do?method=list 将调用userController的list() 函数。通常,后台管理界面会使用通配符,无需逐个Action定义path。
在spring的action-servlet.xml 中
<beans default-autowire="byName" default-lazy-init="true">
<bean name="/user" class="org.springside.helloworld.web.UserAction"/>
</beans>
注意这里Spring的bean name 以action path"/user"命名,来绑定Struts在struts-config.xml <action-mappings>中所定义的Action,并声明实际的Action类型。