Spring+hibernate+DWR整合

首先,建一个web project,然后添加对hibernate和spring的支持,我们使用的是hibernate3.1和spring2.0,然后导入dwr.jar和commons-pool-1.3.jar(不知道myeclipse怎么搞的,添加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数据库,在里面建一个表BOOK:
ID bigint primary key,autoincrement
NAME varchar(20)
ISBM varchar(20)
AUTHOR varchar(15)
然后利用myeclipse的hibernate反向工程生成领域模型:Book.java, DAO:BookDAO.jar, Book 的映射文件Book.hbm.xml:
生成的代码及配置文件如下:
Book.java:

  1. package edu.jlu.fuliang.domain;
  2. /** *//**
  3.  * Book generated by MyEclipse Persistence Tools
  4.  */
  5. public class Book implements java.io.Serializable {
  6.     // Fields
  7.     private Long id;
  8.     private String name;
  9.     private String isbm;
  10.     private String author;
  11.     // Constructors
  12.     /** *//** default constructor */
  13.     public Book() {
  14.     }
  15.     /** *//** minimal constructor */
  16.     public Book(Long id, String name, String isbm) {
  17.         this.id = id;
  18.         this.name = name;
  19.         this.isbm = isbm;
  20.     }
  21.     /** *//** full constructor */
  22.     public Book(Long id, String name, String isbm, String author) {
  23.         this.id = id;
  24.         this.name = name;
  25.         this.isbm = isbm;
  26.         this.author = author;
  27.     }
  28.     // Property accessors
  29.     public Long getId() {
  30.         return this.id;
  31.     }
  32.     public void setId(Long id) {
  33.         this.id = id;
  34.     }
  35.     public String getName() {
  36.         return this.name;
  37.     }
  38.     public void setName(String name) {
  39.         this.name = name;
  40.     }
  41.     public String getIsbm() {
  42.         return this.isbm;
  43.     }
  44.     public void setIsbm(String isbm) {
  45.         this.isbm = isbm;
  46.     }
  47.     public String getAuthor() {
  48.         return this.author;
  49.     }
  50.     public void setAuthor(String author) {
  51.         this.author = author;
  52.     }
  53.     public String toString(){
  54.         return "[id=" + id + ",name=" + name + ",isbm=" + isbm + ",author=" + author + "]";
  55.     }
  56. }


edu.jlu.fuliang.dao.BookDAO.java:

  1. package edu.jlu.fuliang.dao;
  2. import java.util.List;
  3. import org.apache.commons.logging.Log;
  4. import org.apache.commons.logging.LogFactory;
  5. import org.hibernate.LockMode;
  6. import org.springframework.context.ApplicationContext;
  7. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
  8. import edu.jlu.fuliang.domain.Book;
  9. /** *//**
  10.  * Data access object (DAO) for domain model class Book.
  11.  * 
  12.  * @see edu.jlu.fuliang.domain.Book
  13.  * @author MyEclipse Persistence Tools
  14.  */
  15. public class BookDAO extends HibernateDaoSupport ...{
  16.     private static final Log log = LogFactory.getLog(BookDAO.class);
  17.     // property constants
  18.     public static final String NAME = "name";
  19.     public static final String ISBM = "isbm";
  20.     public static final String AUTHOR = "author";
  21.     protected void initDao() ...{
  22.         // do nothing
  23.     }
  24.     public void save(Book transientInstance) ...{
  25.         log.debug("saving Book instance");
  26.         try ...{
  27.             getHibernateTemplate().save(transientInstance);
  28.             log.debug("save successful");
  29.         } catch (RuntimeException re) ...{
  30.             log.error("save failed", re);
  31.             throw re;
  32.         }
  33.     }
  34.     public void delete(Book persistentInstance) ...{
  35.         log.debug("deleting Book instance");
  36.         try ...{
  37.             getHibernateTemplate().delete(persistentInstance);
  38.             log.debug("delete successful");
  39.         } catch (RuntimeException re) ...{
  40.             log.error("delete failed", re);
  41.             throw re;
  42.         }
  43.     }
  44.     public Book findById(java.lang.Long id) ...{
  45.         log.debug("getting Book instance with id: " + id);
  46.         try ...{
  47.             Book instance = (Book) getHibernateTemplate().get(
  48.                     "edu.jlu.fuliang.domain.Book", id);
  49.             return instance;
  50.         } catch (RuntimeException re) ...{
  51.             log.error("get failed", re);
  52.             throw re;
  53.         }
  54.     }
  55.     public List findByExample(Book instance) ...{
  56.         log.debug("finding Book instance by example");
  57.         try ...{
  58.             List results = getHibernateTemplate().findByExample(instance);
  59.             log.debug("find by example successful, result size: "
  60.                     + results.size());
  61.             return results;
  62.         } catch (RuntimeException re) ...{
  63.             log.error("find by example failed", re);
  64.             throw re;
  65.         }
  66.     }
  67.     public List findByProperty(String propertyName, Object value) ...{
  68.         log.debug("finding Book instance with property: " + propertyName
  69.                 + ", value: " + value);
  70.         try ...{
  71.             String queryString = "from Book as model where model."
  72.                     + propertyName + "= ?";
  73.             return getHibernateTemplate().find(queryString, value);
  74.         } catch (RuntimeException re) ...{
  75.             log.error("find by property name failed", re);
  76.             throw re;
  77.         }
  78.     }
  79.     public List findByName(Object name) ...{
  80.         return findByProperty(NAME, name);
  81.     }
  82.     public List findByIsbm(Object isbm) ...{
  83.         return findByProperty(ISBM, isbm);
  84.     }
  85.     public List findByAuthor(Object author) ...{
  86.         return findByProperty(AUTHOR, author);
  87.     }
  88.     public List findAll() ...{
  89.         log.debug("finding all Book instances");
  90.         try ...{
  91.             String queryString = "from Book";
  92.             return getHibernateTemplate().find(queryString);
  93.         } catch (RuntimeException re) ...{
  94.             log.error("find all failed", re);
  95.             throw re;
  96.         }
  97.     }
  98.     public Book merge(Book detachedInstance) ...{
  99.         log.debug("merging Book instance");
  100.         try ...{
  101.             Book result = (Book) getHibernateTemplate().merge(detachedInstance);
  102.             log.debug("merge successful");
  103.             return result;
  104.         } catch (RuntimeException re) ...{
  105.             log.error("merge failed", re);
  106.             throw re;
  107.         }
  108.     }
  109.     public void attachDirty(Book instance) ...{
  110.         log.debug("attaching dirty Book instance");
  111.         try ...{
  112.             getHibernateTemplate().saveOrUpdate(instance);
  113.             log.debug("attach successful");
  114.         } catch (RuntimeException re) ...{
  115.             log.error("attach failed", re);
  116.             throw re;
  117.         }
  118.     }
  119.     public void attachClean(Book instance) ...{
  120.         log.debug("attaching clean Book instance");
  121.         try ...{
  122.             getHibernateTemplate().lock(instance, LockMode.NONE);
  123.             log.debug("attach successful");
  124.         } catch (RuntimeException re) ...{
  125.             log.error("attach failed", re);
  126.             throw re;
  127.         }
  128.     }
  129.     public static BookDAO getFromApplicationContext(ApplicationContext ctx) ...{
  130.         return (BookDAO) ctx.getBean("BookDAO");
  131.     }
  132. }


Book.hbm.xml:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  4. <!-- 
  5.     Mapping file autogenerated by MyEclipse Persistence Tools
  6. -->
  7. <hibernate-mapping>
  8.     <class name="edu.jlu.fuliang.domain.Book" table="BOOK" schema="CLASSICCARS">
  9.         <id name="id" type="java.lang.Long">
  10.             <column name="ID" />
  11.             <generator class="identity" />
  12.         </id>
  13.         <property name="name" type="java.lang.String">
  14.             <column name="NAME" length="20" not-null="true" />
  15.         </property>
  16.         <property name="isbm" type="java.lang.String">
  17.             <column name="ISBM" length="20" not-null="true" unique="true" />
  18.         </property>
  19.         <property name="author" type="java.lang.String">
  20.             <column name="AUTHOR" length="15" />
  21.         </property>
  22.     </class>
  23. </hibernate-mapping>

下面我们配置一下Spring,我们把applicationContext.xml分成了三个,分别是applicationContext-db.xml,applicationContext-dao.xml,applicationContext-service.我们看看如何配置:

applicationContext-db.xml:


  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans
  3.     xmlns="http://www.springframework.org/schema/beans"
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
  6.     <bean id="dataSource"
  7.         class="org.apache.commons.dbcp.BasicDataSource">
  8.         <property name="driverClassName"
  9.             value="org.apache.derby.jdbc.ClientDriver">
  10.         </property>
  11.         <property name="url"
  12.             value="jdbc:derby://localhost:1527/myeclipse;create=true">
  13.         </property>
  14.         <property name="username" value="classiccars"></property>
  15.         <property name="password" value="myeclipse"></property>
  16.     </bean>
  17.     <bean id="sessionFactory"
  18.         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  19.         <property name="dataSource">
  20.             <ref bean="dataSource" />
  21.         </property>
  22.         <property name="hibernateProperties">
  23.             <props>
  24.                 <prop key="hibernate.dialect">
  25.                     org.hibernate.dialect.DerbyDialect
  26.                 </prop>
  27.                 <prop key="hibernate.show_sql">
  28.                    true
  29.                 </prop>
  30.             </props>
  31.         </property>
  32.         <property name="mappingResources">
  33.             <list>
  34.                 <value>edujlufuliangdomainBook.hbm.xml</value>
  35.             </list>
  36.         </property>
  37.     </bean>
  38. </beans>


applicationContext-dao.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans
  3.     xmlns="http://www.springframework.org/schema/beans"
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
  6.     
  7.     <bean id="bookDAO" class="edu.jlu.fuliang.dao.BookDAO">
  8.         <property name="sessionFactory">
  9.             <ref bean="sessionFactory" />
  10.         </property>
  11.     </bean>
  12. </beans>


接下来我们来写我们的Service层:

edu.jlu.fuliang.service.BookManageService.java

  1. package edu.jlu.fuliang.service;
  2. import java.util.List;
  3. import edu.jlu.fuliang.domain.Book;
  4. public interface BookManageService {
  5.     public List<Book> getAllBooks();
  6.     public List<Book> getBookByName(String name);
  7.     public void updateBook(Book book);
  8.     public void addBook(Book book);
  9.     public void deleteBook(long id);
  10. }


edu.jlu.fuliang.service.impl.BookManageServiceImpl.java:

  1. package edu.jlu.fuliang.serviceImpl;
  2. import java.util.List;
  3. import org.apache.commons.logging.Log;
  4. import org.apache.commons.logging.LogFactory;
  5. import edu.jlu.fuliang.dao.BookDAO;
  6. import edu.jlu.fuliang.domain.Book;
  7. import edu.jlu.fuliang.service.BookManageService;
  8. public class BookManageServiceImpl implements BookManageService{
  9.     private static final Log log = LogFactory.getLog(BookManageServiceImpl.class);
  10.     private BookDAO bookDAO;
  11.     @Override
  12.     public void addBook(Book book) {
  13.         bookDAO.save(book);
  14.     }
  15.     @Override
  16.     public void deleteBook(long id) {
  17.         Book book = bookDAO.findById(id);
  18.         bookDAO.delete(book);
  19.     }
  20.     @Override
  21.     public List<Book> getAllBooks() {
  22.         return bookDAO.findAll();
  23.     }
  24.     @Override
  25.     public List<Book> getBookByName(String name) {
  26.         return bookDAO.findByName(name);
  27.     }
  28.     @Override
  29.     public void updateBook(Book book) {
  30.         log.info(book);
  31.         bookDAO.attachDirty(book);
  32.     }
  33.     public BookDAO getBookDAO() {
  34.         return bookDAO;
  35.     }
  36.     public void setBookDAO(BookDAO bookDAO) {
  37.         this.bookDAO = bookDAO;
  38.     }
  39. }


然后我们来配置Service和事务:

applicationContext-service.xml:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans
  3.     xmlns="http://www.springframework.org/schema/beans"
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
  6.     <bean id="bookManageServiceTarget" class="edu.jlu.fuliang.serviceImpl.BookManageServiceImpl">
  7.         <property name="bookDAO">
  8.             <ref bean="bookDAO"/>
  9.         </property>
  10.     </bean>
  11.     <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  12.         <property name="sessionFactory" ref="sessionFactory"/>
  13.     </bean>
  14.     <bean id="bookManageService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  15.         <property name="transactionManager" ref="transactionManager"/>
  16.         <property name="target" ref="bookManageServiceTarget"/>
  17.         <property name="transactionAttributes">
  18.             <props>
  19.                 <prop key="add*">PROPAGATION_REQUIRED</prop>
  20.                 <prop key="delete*">PROPAGATION_REQUIRED</prop>
  21.                 <prop key="update*">PROPAGATION_REQUIRED</prop>
  22.                 <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
  23.             </props>
  24.         </property>
  25.     </bean>
  26. </beans>


最后我们来把dwr整合进来:

我们在web.xml添加ContextLoaderListener来加载applicationContext-db.xml,applicationContext-dao.xm,applicationContext-service.xml,以及配置DwrServlet:

web.xml:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.4" 
  3.     xmlns="http://java.sun.com/xml/ns/j2ee" 
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
  6.     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  7.  <context-param>
  8.      <param-name>contextConfigLocation</param-name>
  9.      <param-value>classpath:applicationContext-*.xml</param-value>
  10.  </context-param>
  11.  <listener>
  12.      <listener-class>
  13.        org.springframework.web.context.ContextLoaderListener 
  14.      </listener-class>
  15.  </listener>
  16.  <servlet>
  17.      <servlet-name>dwr-invoker</servlet-name>
  18.      <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
  19.      <init-param>
  20.          <param-name>debug</param-name>
  21.          <param-value>true</param-value>
  22.      </init-param>
  23.  </servlet>
  24.  <servlet-mapping>
  25.      <servlet-name>dwr-invoker</servlet-name>
  26.      <url-pattern>/dwr/*</url-pattern>
  27.  </servlet-mapping>
  28. </web-app>


在dwr.xml中配制bean的创建方式,类型转换,以及Service要暴露的接口:

  1. <dwr>
  2.     <allow>
  3.         <convert converter="bean" match="edu.jlu.fuliang.domain.Book"/>
  4.         <create creator="spring" javascript="BookManageService" >
  5.             <param name="beanName" value="bookManageService"/>
  6.             <include method="getAllBooks"/>
  7.             <include method="getBookByName"/>
  8.             <include method="updateBook"/>
  9.             <include method="addBook"/>
  10.             <include method="deleteBook"/>
  11.         </create>
  12.    </allow>
  13. </dwr>


最后,我们编写jsp页面index.jsp:

  1. <html>
  2. <head><title>DWR test</title>
  3.     <script type='text/javascript' src='/DWRTest/dwr/interface/BookManageService.js'></script>
  4.     <script type='text/javascript' src='/DWRTest/dwr/engine.js'></script>
  5.     <script type='text/javascript' src='/DWRTest/dwr/util.js'></script>
  6.     <script type="text/javascript">
  7.         var bookCache = ...{};
  8.         var currentBook = null;
  9.         
  10.         function loadAllBooks(){
  11.             BookManageService.getAllBooks(handleGetAllBooks,handleGetAllBooksError);
  12.         }
  13.         function handleGetAllBooks(books){
  14.             dwr.util.removeAllRows("booksBody",{ filter:function(tr) ...{
  15.       return (tr.id != "pattern");
  16.       }});
  17.             var book,id;
  18.             for(var i = 0; i < books.length; i++){
  19.                 book = books[i];
  20.                 id = book.id;
  21.             
  22.                 dwr.util.cloneNode("pattern", { idSuffix:id });
  23.                 dwr.util.setValue("t_name" + id, book.name);
  24.                 dwr.util.setValue("t_isbm" + id, book.isbm);
  25.                 dwr.util.setValue("t_author" + id,book.author);
  26.                $("pattern" + id).style.display = "block";
  27.                bookCache[id] = book;
  28.             }
  29.         }
  30.         function handleGetAllBooksError(msg){
  31.             alert("Error: " + msg);
  32.         }
  33.         
  34.         function addBook(){
  35.             var book = ...{name:null,isbm:null,author:null};
  36.             dwr.util.getValues(book);
  37.             dwr.engine.beginBatch();
  38.                  BookManageService.addBook(book);
  39.                  loadAllBooks();
  40.               dwr.engine.endBatch();
  41.         }
  42.         
  43.         function editBook(btId){
  44.             currentBook = bookCache[btId.substring(4)];
  45.             dwr.util.setValues(currentBook);
  46.         }
  47.         
  48.         function updateBook(){
  49.             var book = {id:null,name:null,isbm:null,author:null}; 
  50.             dwr.util.getValues(book);
  51.             book.id = currentBook.id;
  52.             BookManageService.updateBook(book,handleUpdateBook,handleUpdateBookError);
  53.         }
  54.         
  55.         function handleUpdateBook(){
  56.             alert("Update book successfully!");
  57.             loadAllBooks();
  58.         }
  59.         
  60.         function handleUpdateBookError(msg){
  61.             alert("Error: " + msg);
  62.         }
  63.         
  64.         function deleteBook(btId){
  65.             var i = confirm("Are you sure to delete the book?");
  66.             if(i == true)
  67.                 BookManageService.deleteBook(btId.substring(6),handleDeleteBook,handleDeleteBookError);
  68.         }
  69.         
  70.         function handleDeleteBook(){
  71.           alert("The book has been delete successfully!");
  72.           loadAllBooks();
  73.         }
  74.         
  75.         function handleDeleteBookError(msg){
  76.           alert("Error: " + msg);
  77.         }
  78.     </script>
  79. </head>
  80. <body οnlοad="loadAllBooks()">
  81.     <div>
  82.         <h2>Add book</h2>
  83.         <table>
  84.             <tr>
  85.               <td>Name:</td><td><input type="text" id="name"></td>
  86.             </tr>
  87.             <tr>
  88.               <td>ISBN:</td>
  89.               <td><input type="text" id="isbm"></td>
  90.              </tr>
  91.             
  92.             <tr>
  93.                <td>Author:</td>
  94.                <td><input type="text" id="author"></td>
  95.            </tr>
  96.            <tr>
  97.                <td colspan="2">
  98.                  <input type="button" id="add" value="Add" οnclick="addBook()">
  99.                  <input type="button" id="update" value="Update" οnclick="updateBook()">
  100.                </td>
  101.            </tr>
  102.        </table>
  103.     </div>
  104.     <hr>
  105.     <div id="list">
  106.         <table border="1">
  107.           <thead>
  108.               <tr>
  109.                   <th>Name</th>
  110.                   <th>ISBN</th>
  111.                   <th>Author</th>
  112.                   <th>Action</th>
  113.               </tr>
  114.           </thead>
  115.           <tbody id="booksBody">
  116.               <tr id="pattern" style="display:none;">
  117.                   <td>
  118.                     <span id="t_name"></span>
  119.                   </td>
  120.                   <td>
  121.                     <span id="t_isbm"></span>
  122.                   </td>
  123.                   <td>
  124.                     <span id="t_author"></span>
  125.                   </td>
  126.                   <td>
  127.                     <span id="action">
  128.                         <input id="edit" type="button" value="Edit" οnclick="editBook(this.id)"/>
  129.                       <input id="delete" type="button" value="Delete" οnclick="deleteBook(this.id)"/>
  130.                     </span>
  131.                   </td>
  132.               </tr>
  133.           </tbody>
  134.         </table>
  135.     </div>
  136. </body>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值