本文是開發基于 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 訪問、操作對象,進而實現對數據庫的操作。