本文是開發(fā)基于 spring 的 web 應(yīng)用的入門文章,前端采用 Struts MVC 框架,中間層采用 spring ,后臺(tái)采用 Hibernate。
本文包含以下內(nèi)容:
· 配置 Hibernate 和事務(wù)
· 裝載 Spring 的 applicationContext.xml 文件
· 建立業(yè)務(wù)層和 DAO 之間的依賴關(guān)系
· 將 Spring 應(yīng)用到 Struts 中
簡(jiǎn)介
這個(gè)例子是建立一個(gè)簡(jiǎn)單的 web 應(yīng)用,叫 MyUsers, 完成用戶管理操作,包含簡(jiǎn)單的 數(shù)據(jù)庫 增,刪,查,該即 CRUD (新建,訪問,更新,刪除)操作 。 這是一個(gè)三層的 web 應(yīng)用,通過 Action ( Struts )訪問業(yè)務(wù)層,業(yè)務(wù)層訪問 DAO。 圖一簡(jiǎn)要說明了該應(yīng)用的總體結(jié)構(gòu) 。 圖上的數(shù)字說明了流程順序-從 web ( UserAction )到中間層( UserManager ),再到數(shù)據(jù)訪問層( UserDAO ),然后將結(jié)果返回 。
Spring 層的真正強(qiáng)大在于它的聲明型事務(wù)處理,幫定和對(duì)持久層支持(例如 Hiberate 和 iBATIS )
以下下是完成這個(gè)例子的步驟:
1 . 安裝 Eclipse 插件
2 . 數(shù)據(jù)庫 建表
3 . 配置 Hibernate 和 Spring
4 . 建立 Hibernate DAO 接口的實(shí)現(xiàn)類
5 . 運(yùn)行測(cè)試類,測(cè)試 DAO 的 CRUD 操作
6 . 創(chuàng)建一個(gè)處理類,聲明事務(wù)
7 . 創(chuàng)建 web 層的 Action 和 model
8 . 運(yùn)行 Action 的測(cè)試類測(cè)試 CRUD 操作
9 . 創(chuàng)建 jsp 文件通過瀏覽器進(jìn)行 CRUD 操作
10 . 通過瀏覽器校驗(yàn) 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 ,
數(shù)據(jù)庫 建表
create table app_user(id number not null primary,firstname vchar(32),lastname vchar(32));
新建項(xiàng)目
新建一個(gè) web project ,新建后的目錄結(jié)構(gòu)同時(shí)包含了新建文件夾 page 用于放 jsp 文件,和源文件夾 test 用于放 junit 測(cè)試文件 。 同時(shí)將用到的包,包括 struts , hibernate , spring 都導(dǎo)入到 lib 目錄下 。
創(chuàng)建持久層 O/R mapping/ 小新技術(shù)網(wǎng) www.xker.com
1 . 在 src/com.jandar.model 下用 hibernate 插件從 數(shù)據(jù)庫 導(dǎo)出 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 對(duì)象對(duì)應(yīng)于 數(shù)據(jù)庫 中的 app_user 表
注:在 eclipse 下自動(dòng)生成的對(duì)象文件不完全相同,相同的是每個(gè)對(duì)象文件必須實(shí)現(xiàn) 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;
}
}
創(chuàng)建 DAO 訪問對(duì)象
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);
}
該接口提供了訪問對(duì)象的方法,
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 自動(dòng)生成方法存根
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);
}
}
}
在這個(gè)類中實(shí)現(xiàn)了 IUserDAO 接口的方法,并且繼承了 HibernateDAOSupport 類。這個(gè)類的作用是通過 hibernate 訪問、操作對(duì)象,進(jìn)而實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的操作。