首先,建一個web project,然后添加對hibernate和spring的支持,我們使用的是hibernate3.1和spring2.0,然后導(dǎo)入dwr.jar和commons-pool-1.3.jar(不知道m(xù)yeclipse怎么搞的,添加Spring功能支持的時候就有了commons-dbcp.jar,居然沒有其依賴的commons-pool-x.jar,只好單獨添加了,另外,需要將Spring2.0 AOP Liberaries里的asm2.2.3.jar刪除,因為好像和Hiberate中的生成代理用的asm.jar沖突,我把Spring2.0 AOP Liberaries排到最后仍然有沖突,所以只好刪掉了,不知道大家遇到過這種情況么)。我們使用myeclise自帶的Derby數(shù)據(jù)庫,在里面建一個表BOOK:
ID bigint primary key,autoincrement
NAME varchar(20)
ISBM varchar(20)
AUTHOR varchar(15)
然后利用myeclipse的hibernate反向工程生成領(lǐng)域模型:Book.java, DAO:BookDAO.jar, Book 的映射文件Book.hbm.xml:
生成的代碼及配置文件如下:
Book.java:
package?edu.jlu.fuliang.domain;

/**?*//**?*//**?*//**
?*?Book?generated?by?MyEclipse?Persistence?Tools
?*/


public?class?Book?implements?java.io.Serializable?
{

????//?Fields

????private?Long?id;
????private?String?name;
????private?String?isbm;
????private?String?author;

????//?Constructors


????/**?*//**?*//**?*//**?default?constructor?*/

????public?Book()?
{
????}


????/**?*//**?*//**?*//**?minimal?constructor?*/

????public?Book(Long?id,?String?name,?String?isbm)?
{
????????this.id?=?id;
????????this.name?=?name;
????????this.isbm?=?isbm;
????}


????/**?*//**?*//**?*//**?full?constructor?*/

????public?Book(Long?id,?String?name,?String?isbm,?String?author)?
{
????????this.id?=?id;
????????this.name?=?name;
????????this.isbm?=?isbm;
????????this.author?=?author;
????}

????//?Property?accessors


????public?Long?getId()?
{
????????return?this.id;
????}


????public?void?setId(Long?id)?
{
????????this.id?=?id;
????}


????public?String?getName()?
{
????????return?this.name;
????}


????public?void?setName(String?name)?
{
????????this.name?=?name;
????}


????public?String?getIsbm()?
{
????????return?this.isbm;
????}


????public?void?setIsbm(String?isbm)?
{
????????this.isbm?=?isbm;
????}


????public?String?getAuthor()?
{
????????return?this.author;
????}


????public?void?setAuthor(String?author)?
{
????????this.author?=?author;
????}

????public?String?toString()
{
????????return?"[id="?+?id?+?",name="?+?name?+?",isbm="?+?isbm?+?",author="?+?author?+?"]";
????}
}
edu.jlu.fuliang.dao.BookDAO.java:
package?edu.jlu.fuliang.dao;

import?java.util.List;
import?org.apache.commons.logging.Log;
import?org.apache.commons.logging.LogFactory;
import?org.hibernate.LockMode;
import?org.springframework.context.ApplicationContext;
import?org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import?edu.jlu.fuliang.domain.Book;


/**?*//**?*//**?*//**
?*?Data?access?object?(DAO)?for?domain?model?class?Book.
?*?
?*?@see?edu.jlu.fuliang.domain.Book
?*?@author?MyEclipse?Persistence?Tools
?*/


public?class?BookDAO?extends?HibernateDaoSupport?
{
????private?static?final?Log?log?=?LogFactory.getLog(BookDAO.class);
????//?property?constants
????public?static?final?String?NAME?=?"name";
????public?static?final?String?ISBM?=?"isbm";
????public?static?final?String?AUTHOR?=?"author";


????protected?void?initDao()?
{
????????//?do?nothing
????}


????public?void?save(Book?transientInstance)?
{
????????log.debug("saving?Book?instance");

????????try?
{
????????????getHibernateTemplate().save(transientInstance);
????????????log.debug("save?successful");

????????}?catch?(RuntimeException?re)?
{
????????????log.error("save?failed",?re);
????????????throw?re;
????????}
????}


????public?void?delete(Book?persistentInstance)?
{
????????log.debug("deleting?Book?instance");

????????try?
{
????????????getHibernateTemplate().delete(persistentInstance);
????????????log.debug("delete?successful");

????????}?catch?(RuntimeException?re)?
{
????????????log.error("delete?failed",?re);
????????????throw?re;
????????}
????}


????public?Book?findById(java.lang.Long?id)?
{
????????log.debug("getting?Book?instance?with?id:?"?+?id);

????????try?
{
????????????Book?instance?=?(Book)?getHibernateTemplate().get(
????????????????????"edu.jlu.fuliang.domain.Book",?id);
????????????return?instance;

????????}?catch?(RuntimeException?re)?
{
????????????log.error("get?failed",?re);
????????????throw?re;
????????}
????}


????public?List?findByExample(Book?instance)?
{
????????log.debug("finding?Book?instance?by?example");

????????try?
{
????????????List?results?=?getHibernateTemplate().findByExample(instance);
????????????log.debug("find?by?example?successful,?result?size:?"
????????????????????+?results.size());
????????????return?results;

????????}?catch?(RuntimeException?re)?
{
????????????log.error("find?by?example?failed",?re);
????????????throw?re;
????????}
????}


????public?List?findByProperty(String?propertyName,?Object?value)?
{
????????log.debug("finding?Book?instance?with?property:?"?+?propertyName
????????????????+?",?value:?"?+?value);

????????try?
{
????????????String?queryString?=?"from?Book?as?model?where?model."
????????????????????+?propertyName?+?"=??";
????????????return?getHibernateTemplate().find(queryString,?value);

????????}?catch?(RuntimeException?re)?
{
????????????log.error("find?by?property?name?failed",?re);
????????????throw?re;
????????}
????}


????public?List?findByName(Object?name)?
{
????????return?findByProperty(NAME,?name);
????}


????public?List?findByIsbm(Object?isbm)?
{
????????return?findByProperty(ISBM,?isbm);
????}


????public?List?findByAuthor(Object?author)?
{
????????return?findByProperty(AUTHOR,?author);
????}


????public?List?findAll()?
{
????????log.debug("finding?all?Book?instances");

????????try?
{
????????????String?queryString?=?"from?Book";
????????????return?getHibernateTemplate().find(queryString);

????????}?catch?(RuntimeException?re)?
{
????????????log.error("find?all?failed",?re);
????????????throw?re;
????????}
????}


????public?Book?merge(Book?detachedInstance)?
{
????????log.debug("merging?Book?instance");

????????try?
{
????????????Book?result?=?(Book)?getHibernateTemplate().merge(detachedInstance);
????????????log.debug("merge?successful");
????????????return?result;

????????}?catch?(RuntimeException?re)?
{
????????????log.error("merge?failed",?re);
????????????throw?re;
????????}
????}


????public?void?attachDirty(Book?instance)?
{
????????log.debug("attaching?dirty?Book?instance");

????????try?
{
????????????getHibernateTemplate().saveOrUpdate(instance);
????????????log.debug("attach?successful");

????????}?catch?(RuntimeException?re)?
{
????????????log.error("attach?failed",?re);
????????????throw?re;
????????}
????}


????public?void?attachClean(Book?instance)?
{
????????log.debug("attaching?clean?Book?instance");

????????try?
{
????????????getHibernateTemplate().lock(instance,?LockMode.NONE);
????????????log.debug("attach?successful");

????????}?catch?(RuntimeException?re)?
{
????????????log.error("attach?failed",?re);
????????????throw?re;
????????}
????}


????public?static?BookDAO?getFromApplicationContext(ApplicationContext?ctx)?
{
????????return?(BookDAO)?ctx.getBean("BookDAO");
????}
} Book.hbm.xml:
<?xml?version="1.0"?encoding="utf-8"?>
<!DOCTYPE?hibernate-mapping?PUBLIC?"-//Hibernate/Hibernate?Mapping?DTD?3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--?
????Mapping?file?autogenerated?by?MyEclipse?Persistence?Tools
-->
<hibernate-mapping>
????<class?name="edu.jlu.fuliang.domain.Book"?table="BOOK"?schema="CLASSICCARS">
????????<id?name="id"?type="java.lang.Long">
????????????<column?name="ID"?/>
????????????<generator?class="identity"?/>
????????</id>
????????<property?name="name"?type="java.lang.String">
????????????<column?name="NAME"?length="20"?not-null="true"?/>
????????</property>
????????<property?name="isbm"?type="java.lang.String">
????????????<column?name="ISBM"?length="20"?not-null="true"?unique="true"?/>
????????</property>
????????<property?name="author"?type="java.lang.String">
????????????<column?name="AUTHOR"?length="15"?/>
????????</property>
????</class>
</hibernate-mapping>下面我們配置一下Spring,我們把applicationContext.xml分成了三個,分別是applicationContext-db.xml,applicationContext-dao.xml,applicationContext-service.我們看看如何配置:
applicationContext-db.xml:
<?xml?version="1.0"?encoding="UTF-8"?>
<beans
????xmlns="http://www.springframework.org/schema/beans"
????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
????xsi:schemaLocation="http://www.springframework.org/schema/beans?http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

????<bean?id="dataSource"
????????class="org.apache.commons.dbcp.BasicDataSource">
????????<property?name="driverClassName"
????????????value="org.apache.derby.jdbc.ClientDriver">
????????</property>
????????<property?name="url"
????????????value="jdbc:derby://localhost:1527/myeclipse;create=true">
????????</property>
????????<property?name="username"?value="classiccars"></property>
????????<property?name="password"?value="myeclipse"></property>
????</bean>
????<bean?id="sessionFactory"
????????class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
????????<property?name="dataSource">
????????????<ref?bean="dataSource"?/>
????????</property>
????????<property?name="hibernateProperties">
????????????<props>
????????????????<prop?key="hibernate.dialect">
????????????????????org.hibernate.dialect.DerbyDialect
????????????????</prop>
????????????????<prop?key="hibernate.show_sql">
???????????????????true
????????????????</prop>
????????????</props>
????????</property>
????????<property?name="mappingResources">
????????????<list>
????????????????<value>edu/jlu/fuliang/domain/Book.hbm.xml</value>
????????????</list>
????????</property>
????</bean>
</beans>

applicationContext-dao.xml:
<?xml?version="1.0"?encoding="UTF-8"?>
<beans
????xmlns="http://www.springframework.org/schema/beans"
????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
????xsi:schemaLocation="http://www.springframework.org/schema/beans?http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
????
????<bean?id="bookDAO"?class="edu.jlu.fuliang.dao.BookDAO">
????????<property?name="sessionFactory">
????????????<ref?bean="sessionFactory"?/>
????????</property>
????</bean>
</beans>接下來我們來寫我們的Service層:
edu.jlu.fuliang.service.BookManageService.java
package?edu.jlu.fuliang.service;
import?java.util.List;

import?edu.jlu.fuliang.domain.Book;


public?interface?BookManageService?
{
????public?List<Book>?getAllBooks();
????public?List<Book>?getBookByName(String?name);
????public?void?updateBook(Book?book);
????public?void?addBook(Book?book);
????public?void?deleteBook(long?id);
}edu.jlu.fuliang.service.impl.BookManageServiceImpl.java:
package?edu.jlu.fuliang.serviceImpl;

import?java.util.List;

import?org.apache.commons.logging.Log;
import?org.apache.commons.logging.LogFactory;

import?edu.jlu.fuliang.dao.BookDAO;
import?edu.jlu.fuliang.domain.Book;
import?edu.jlu.fuliang.service.BookManageService;


public?class?BookManageServiceImpl?implements?BookManageService
{
????private?static?final?Log?log?=?LogFactory.getLog(BookManageServiceImpl.class);
????private?BookDAO?bookDAO;
????@Override

????public?void?addBook(Book?book)?
{
????????bookDAO.save(book);
????}

????@Override

????public?void?deleteBook(long?id)?
{
????????Book?book?=?bookDAO.findById(id);
????????bookDAO.delete(book);
????}

????@Override

????public?List<Book>?getAllBooks()?
{
????????return?bookDAO.findAll();
????}

????@Override

????public?List<Book>?getBookByName(String?name)?
{
????????return?bookDAO.findByName(name);
????}

????@Override

????public?void?updateBook(Book?book)?
{
????????log.info(book);
????????bookDAO.attachDirty(book);
????}


????public?BookDAO?getBookDAO()?
{
????????return?bookDAO;
????}


????public?void?setBookDAO(BookDAO?bookDAO)?
{
????????this.bookDAO?=?bookDAO;
????}
}然后我們來配置Service和事務(wù):
applicationContext-service.xml:
<?xml?version="1.0"?encoding="UTF-8"?>
<beans
????xmlns="http://www.springframework.org/schema/beans"
????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
????xsi:schemaLocation="http://www.springframework.org/schema/beans?http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

????<bean?id="bookManageServiceTarget"?class="edu.jlu.fuliang.serviceImpl.BookManageServiceImpl">
????????<property?name="bookDAO">
????????????<ref?bean="bookDAO"/>
????????</property>
????</bean>
????<bean?id="transactionManager"?class="org.springframework.orm.hibernate3.HibernateTransactionManager">
????????<property?name="sessionFactory"?ref="sessionFactory"/>
????</bean>
????<bean?id="bookManageService"?class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
????????<property?name="transactionManager"?ref="transactionManager"/>
????????<property?name="target"?ref="bookManageServiceTarget"/>
????????<property?name="transactionAttributes">
????????????<props>
????????????????<prop?key="add*">PROPAGATION_REQUIRED</prop>
????????????????<prop?key="delete*">PROPAGATION_REQUIRED</prop>
????????????????<prop?key="update*">PROPAGATION_REQUIRED</prop>
????????????????<prop?key="get*">PROPAGATION_REQUIRED,readOnly</prop>
????????????</props>
????????</property>
????</bean>
</beans>最后我們來把dwr整合進來:
我們在web.xml添加ContextLoaderListener來加載applicationContext-db.xml,applicationContext-dao.xm,applicationContext-service.xml,以及配置DwrServlet:
web.xml:
<?xml?version="1.0"?encoding="UTF-8"?>
<web-app?version="2.4"?
????xmlns="http://java.sun.com/xml/ns/j2ee"?
????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?
????xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee?
????http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
?<context-param>
?????<param-name>contextConfigLocation</param-name>
?????<param-value>classpath:applicationContext-*.xml</param-value>
?</context-param>
?<listener>
?????<listener-class>
???????org.springframework.web.context.ContextLoaderListener?
?????</listener-class>
?</listener>
?<servlet>
?????<servlet-name>dwr-invoker</servlet-name>
?????<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
?????<init-param>
?????????<param-name>debug</param-name>
?????????<param-value>true</param-value>
?????</init-param>
?</servlet>
?<servlet-mapping>
?????<servlet-name>dwr-invoker</servlet-name>
?????<url-pattern>/dwr/*</url-pattern>
?</servlet-mapping>
</web-app>在dwr.xml中配制bean的創(chuàng)建方式,類型轉(zhuǎn)換,以及Service要暴露的接口:
<dwr>
????<allow>
????????<convert?converter="bean"?match="edu.jlu.fuliang.domain.Book"/>
????????<create?creator="spring"?javascript="BookManageService"?>
????????????<param?name="beanName"?value="bookManageService"/>
????????????<include?method="getAllBooks"/>
????????????<include?method="getBookByName"/>
????????????<include?method="updateBook"/>
????????????<include?method="addBook"/>
????????????<include?method="deleteBook"/>
????????</create>
???</allow>
</dwr>最后,我們編寫jsp頁面index.jsp:
<html>
<head><title>DWR?test</title>
????<script?type='text/javascript'?src='/DWRTest/dwr/interface/BookManageService.js'></script>
????<script?type='text/javascript'?src='/DWRTest/dwr/engine.js'></script>
????<script?type='text/javascript'?src='/DWRTest/dwr/util.js'></script>


????<script?type="text/javascript">

????????var?bookCache?=?
{};
????????var?currentBook?=?null;
????????

????????function?loadAllBooks()
{
????????????BookManageService.getAllBooks(handleGetAllBooks,handleGetAllBooksError);
????????}

????????function?handleGetAllBooks(books)
{

????????????dwr.util.removeAllRows("booksBody",
{?filter:function(tr)?
{
??????return?(tr.id?!=?"pattern");
??????}});

????????????var?book,id;

????????????for(var?i?=?0;?i?<?books.length;?i++)
{
????????????????book?=?books[i];
????????????????id?=?book.id;
????????????

????????????????dwr.util.cloneNode("pattern",?
{?idSuffix:id?});
????????????????dwr.util.setValue("t_name"?+?id,?book.name);
????????????????dwr.util.setValue("t_isbm"?+?id,?book.isbm);
????????????????dwr.util.setValue("t_author"?+?id,book.author);
???????????????$("pattern"?+?id).style.display?=?"block";
???????????????bookCache[id]?=?book;
????????????}
????????}

????????function?handleGetAllBooksError(msg)
{
????????????alert("Error:?"?+?msg);
????????}
????????

????????function?addBook()
{

????????????var?book?=?
{name:null,isbm:null,author:null};
????????????dwr.util.getValues(book);
????????????dwr.engine.beginBatch();
?????????????????BookManageService.addBook(book);
?????????????????loadAllBooks();
??????????????dwr.engine.endBatch();
????????}
????????

????????function?editBook(btId)
{
????????????currentBook?=?bookCache[btId.substring(4)];
????????????dwr.util.setValues(currentBook);
????????}
????????

????????function?updateBook()
{

????????????var?book?=?
{id:null,name:null,isbm:null,author:null};?
????????????dwr.util.getValues(book);
????????????book.id?=?currentBook.id;
????????????BookManageService.updateBook(book,handleUpdateBook,handleUpdateBookError);
????????}
????????

????????function?handleUpdateBook()
{
????????????alert("Update?book?successfully!");
????????????loadAllBooks();
????????}
????????

????????function?handleUpdateBookError(msg)
{
????????????alert("Error:?"?+?msg);
????????}
????????

????????function?deleteBook(btId)
{
????????????var?i?=?confirm("Are?you?sure?to?delete?the?book?");
????????????if(i?==?true)
????????????????BookManageService.deleteBook(btId.substring(6),handleDeleteBook,handleDeleteBookError);
????????}
????????

????????function?handleDeleteBook()
{
??????????alert("The?book?has?been?delete?successfully!");
??????????loadAllBooks();
????????}
????????

????????function?handleDeleteBookError(msg)
{
??????????alert("Error:?"?+?msg);
????????}
????</script>
</head>

<body?onload="loadAllBooks()">
????<div>
????????<h2>Add?book</h2>
????????<table>
????????????<tr>
??????????????<td>Name:</td><td><input?type="text"?id="name"></td>
????????????</tr>
????????????<tr>
??????????????<td>ISBN:</td>
??????????????<td><input?type="text"?id="isbm"></td>
?????????????</tr>
????????????
????????????<tr>
???????????????<td>Author:</td>
???????????????<td><input?type="text"?id="author"></td>
???????????</tr>
???????????<tr>
???????????????<td?colspan="2">
?????????????????<input?type="button"?id="add"?value="Add"?onclick="addBook()">
?????????????????<input?type="button"?id="update"?value="Update"?onclick="updateBook()">
???????????????</td>
???????????</tr>
???????</table>
????</div>
????<hr>
????<div?id="list">
????????<table?border="1">
??????????<thead>
??????????????<tr>
??????????????????<th>Name</th>
??????????????????<th>ISBN</th>
??????????????????<th>Author</th>
??????????????????<th>Action</th>
??????????????</tr>
??????????</thead>
??????????<tbody?id="booksBody">
??????????????<tr?id="pattern"?style="display:none;">
??????????????????<td>
????????????????????<span?id="t_name"></span>
??????????????????</td>
??????????????????<td>
????????????????????<span?id="t_isbm"></span>
??????????????????</td>
??????????????????<td>
????????????????????<span?id="t_author"></span>
??????????????????</td>
??????????????????<td>
????????????????????<span?id="action">
????????????????????????<input?id="edit"?type="button"?value="Edit"?onclick="editBook(this.id)"/>
??????????????????????<input?id="delete"?type="button"?value="Delete"?onclick="deleteBook(this.id)"/>
????????????????????</span>
??????????????????</td>
??????????????</tr>
??????????</tbody>
????????</table>
????</div>
</body>這樣我們就完成了Spring+Hibernate+DWR的整合,我們可以在一個頁面完成CURD操作了.
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1798037