首先,建一个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
6
public 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:
1
package edu.jlu.fuliang.dao;
2
3
import java.util.List;
4
import org.apache.commons.logging.Log;
5
import org.apache.commons.logging.LogFactory;
6
import org.hibernate.LockMode;
7
import org.springframework.context.ApplicationContext;
8
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
9
10
import 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
19
public 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
1
package edu.jlu.fuliang.service;
2
import java.util.List;
3
4
import edu.jlu.fuliang.domain.Book;
5
6
public 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:
1
package edu.jlu.fuliang.serviceImpl;
2
3
import java.util.List;
4
5
import org.apache.commons.logging.Log;
6
import org.apache.commons.logging.LogFactory;
7
8
import edu.jlu.fuliang.dao.BookDAO;
9
import edu.jlu.fuliang.domain.Book;
10
import edu.jlu.fuliang.service.BookManageService;
11
12
public 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
冰封的爱 阅读(321)
评论(0) 编辑 收藏 所属分类:
J2EE