关闭

Spring+hibernate+DWR整合

6713人阅读 评论(4) 收藏 举报
首先,建一个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:
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和事务:

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的创建方式,类型转换,以及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操作了.

0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:280246次
    • 积分:3892
    • 等级:
    • 排名:第8087名
    • 原创:108篇
    • 转载:25篇
    • 译文:0篇
    • 评论:69条
    最新评论
    文章收藏