posts - 14,  comments - 37,  trackbacks - 0
首先,建一个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:
 1package edu.jlu.fuliang.domain; 
 2/** *//** 
 3 * Book generated by MyEclipse Persistence Tools 
 4 */
 
 5
 6public class Book implements java.io.Serializable 
 7
 8    // Fields 
 9
10    private Long id; 
11    private String name; 
12    private String isbm; 
13    private String author; 
14
15    // Constructors 
16
17    /** *//** default constructor */ 
18    public Book() 
19    }
 
20
21    /** *//** minimal constructor */ 
22    public Book(Long id, String name, String isbm) 
23        this.id = id; 
24        this.name = name; 
25        this.isbm = isbm; 
26    }
 
27
28    /** *//** full constructor */ 
29    public Book(Long id, String name, String isbm, String author) 
30        this.id = id; 
31        this.name = name; 
32        this.isbm = isbm; 
33        this.author = author; 
34    }
 
35
36    // Property accessors 
37
38    public Long getId() 
39        return this.id; 
40    }
 
41
42    public void setId(Long id) 
43        this.id = id; 
44    }
 
45
46    public String getName() 
47        return this.name; 
48    }
 
49
50    public void setName(String name) 
51        this.name = name; 
52    }
 
53
54    public String getIsbm() 
55        return this.isbm; 
56    }
 
57
58    public void setIsbm(String isbm) 
59        this.isbm = isbm; 
60    }
 
61
62    public String getAuthor() 
63        return this.author; 
64    }
 
65
66    public void setAuthor(String author) 
67        this.author = author; 
68    }
 
69    public String toString()
70        return "[id=" + id + ",name=" + name + ",isbm=" + isbm + ",author=" + author + "]"
71    }
 
72}
 
73

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

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> 
24

下面我们配置一下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
 7    <bean id="dataSource" 
 8        class="org.apache.commons.dbcp.BasicDataSource"> 
 9        <property name="driverClassName" 
10            value="org.apache.derby.jdbc.ClientDriver"> 
11        </property> 
12        <property name="url" 
13            value="jdbc:derby://localhost:1527/myeclipse;create=true"> 
14        </property> 
15        <property name="username" value="classiccars"></property> 
16        <property name="password" value="myeclipse"></property> 
17    </bean> 
18    <bean id="sessionFactory" 
19        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
20        <property name="dataSource"> 
21            <ref bean="dataSource" /> 
22        </property> 
23        <property name="hibernateProperties"> 
24            <props> 
25                <prop key="hibernate.dialect"> 
26                    org.hibernate.dialect.DerbyDialect 
27                </prop> 
28                <prop key="hibernate.show_sql"> 
29                   true 
30                </prop> 
31            </props> 
32        </property> 
33        <property name="mappingResources"> 
34            <list> 
35                <value>edujlufuliangdomainBook.hbm.xml</value> 
36            </list> 
37        </property> 
38    </bean> 
39</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> 
13
接下来我们来写我们的Service层:

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

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

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

然后我们来配置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
 7    <bean id="bookManageServiceTarget" class="edu.jlu.fuliang.serviceImpl.BookManageServiceImpl"> 
 8        <property name="bookDAO"> 
 9            <ref bean="bookDAO"/> 
10        </property> 
11    </bean> 
12    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
13        <property name="sessionFactory" ref="sessionFactory"/> 
14    </bean> 
15    <bean id="bookManageService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 
16        <property name="transactionManager" ref="transactionManager"/> 
17        <property name="target" ref="bookManageServiceTarget"/> 
18        <property name="transactionAttributes"> 
19            <props> 
20                <prop key="add*">PROPAGATION_REQUIRED</prop> 
21                <prop key="delete*">PROPAGATION_REQUIRED</prop> 
22                <prop key="update*">PROPAGATION_REQUIRED</prop> 
23                <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> 
24            </props> 
25        </property> 
26    </bean> 
27</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> 
29

在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> 
14

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

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问  
 
<2024年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿(3)

随笔档案

文章分类

文章档案

相册

搜索

  •  

最新评论

阅读排行榜

评论排行榜