本文是开发基于 spring 的 web 应用的入门文章,前端采用 Struts MVC 框架,中间层采用 spring ,后台采用 Hibernate。
本文包含以下内容:
· 配置 Hibernate 和事务
· 装载 Spring 的 applicationContext.xml 文件
· 建立业务层和 DAO 之间的依赖关系
· 将 Spring 应用到 Struts 中
简介
这个例子是建立一个简单的 web 应用,叫 MyUsers, 完成用户管理操作,包含简单的 数据库 增,删,查,该即 CRUD (新建,访问,更新,删除)操作 。 这是一个三层的 web 应用,通过 Action ( Struts )访问业务层,业务层访问 DAO。 图一简要说明了该应用的总体结构 。 图上的数字说明了流程顺序-从 web ( UserAction )到中间层( UserManager ),再到数据访问层( UserDAO ),然后将结果返回 。
Spring 层的真正强大在于它的声明型事务处理,帮定和对持久层支持(例如 Hiberate 和 iBATIS )
以下下是完成这个例子的步骤:
1 . 安装 Eclipse 插件
2 . 数据库 建表
3 . 配置 Hibernate 和 Spring
4 . 建立 Hibernate DAO 接口的实现类
5 . 运行测试类,测试 DAO 的 CRUD 操作
6 . 创建一个处理类,声明事务
7 . 创建 web 层的 Action 和 model
8 . 运行 Action 的测试类测试 CRUD 操作
9 . 创建 jsp 文件通过浏览器进行 CRUD 操作
10 . 通过浏览器校验 jsp
安装 eclipse 插件
1 . Hibernate 插件 http://www.binamics.com/hibernatesync
2 . Spring 插件 http://springframework.sourceforge.net/spring-ide/eclipse/updatesite/
3 . MyEclipse 插件 ( 破解版 )
4 . Tomcat 插件 . tanghan
5 . 其他插件包括 xml , jsp ,
数据库 建表
create table app_user(id number not null primary,firstname vchar(32),lastname vchar(32));
新建项目
新建一个 web project ,新建后的目录结构同时包含了新建文件夹 page 用于放 jsp 文件,和源文件夹 test 用于放 junit 测试文件 。 同时将用到的包,包括 struts , hibernate , spring 都导入到 lib 目录下 。
创建持久层 O/R mapping/ 小新技术网 www.xker.com
1 . 在 src/com.jandar.model 下用 hibernate 插件从 数据库 导出 app_user 的 .hbm.xml 文件改名为 User.hbm.xml
< ?xml version="1.0"? >
< !DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
< hibernate-mapping package="com.jandar.model" >
< class name="User" table="APP_USER" >
< id
column="ID"
name="id"
type="integer"
>
< generator class="assigned" / >
< /id >
< property
column="LASTNAME"
length="10"
name="lastname"
not-null="false"
type="string"
/ >
< property
column="FIRSTNAME"
length="10"
name="firstname"
not-null="true"
type="string"
/ >
< /class >
< /hibernate-mapping >
2 . 通过 hibernate synchronizer- > synchronizer file 生成 User.java 文件 ,User 对象对应于 数据库 中的 app_user 表
注:在 eclipse 下自动生成的对象文件不完全相同,相同的是每个对象文件必须实现 Serializable 接口,必需又 toString 和 hashCode 方法;
import java.io.Serializable;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
public class BaseObject implements Serializable {
public String toString() {
return ToStringBuilder.reflectionToString(this,
ToStringStyle.MULTI_LINE_STYLE);
}
public boolean equals(Object o) {
return EqualsBuilder.reflectionEquals(this, o);
}
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
}
public class User extends BaseObject {
private Long id;
private String firstName;
private String lastName;
/**
* @return Returns the id.
*/
public Long getId() {
return id;
}
/**
* @param id The id to set.
*/
public void setId(Long id) {
this.id = id;
}
/**
* @return Returns the firstName.
*/
public String getFirstName() {
return firstName;
}
/**
* @param firstName The firstName to set.
*/
public void setFirstName(String firstName) {
this.firstName = firstName;
}
/**
* @return Returns the lastName.
*/
public String getLastName() {
return lastName;
}
/**
* @param lastName The lastName to set.
*/
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
创建 DAO 访问对象
1 . 在 src/com.jandar.service.dao 新建 IDAO.java 接口,所有的 DAO 都继承该接口
package com.jandar.services.dao;
public interface IDAO
2 . 在 src/com.jandar.service.dao 下新建 IUserDAO.java 接口
public interface IUserDAO extends DAO {
List getUsers();
User getUser(Integer userid);
void saveUser(User user);
void removeUser(Integer id);
}
该接口提供了访问对象的方法,
3 . 在 src/com.jandar.service.dao.hibernate 下新建 UserDAOHiberante.java
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.orm.hibernate.support.HibernateDaoSupport;
import com.jandar.model.User;
import com.jandar.service.dao.IUserDAO;
public class UserDaoHibernate extends HibernateDaoSupport implements IUserDAO {
private Log log=LogFactory.getLog(UserDaoHibernate.class);
/* (非 Javadoc )
* @see com.jandar.dao.IUserDAO#getUsers()
*/
public List getUsers() {
return getHibernateTemplate().find("from User");
}
/* (非 Javadoc )
* @see com.jandar.dao.IUserDAO#getUser(java.lang.Long)
*/
public User getUser(Integer id) {
// TODO 自动生成方法存根
return (User) getHibernateTemplate().get(User.class,id);
}
/* (非 Javadoc )
* @see com.jandar.dao.IUserDAO#saveUser(com.jandar.model.User)
*/
public void saveUser(User user) {
log.debug("xxxxxxx");
System.out.println("yyyy");
getHibernateTemplate().saveOrUpdate(user);
if(log.isDebugEnabled())
{
log.debug("userId set to "+user.getId());
}
}
/* (非 Javadoc )
* @see com.jandar.dao.IUserDAO#removeUser(java.lang.Long)
*/
public void removeUser(Integer id) {
Object user=getHibernateTemplate().load(User.class,id);
getHibernateTemplate().delete(user);
if(log.isDebugEnabled()){
log.debug("del user "+id);
}
}
}
在这个类中实现了 IUserDAO 接口的方法,并且继承了 HibernateDAOSupport 类。这个类的作用是通过 hibernate 访问、操作对象,进而实现对数据库的操作。