热线| 博客| 百姓| 女性| 婚恋| 足球| 家庭| 驴子| 摄影| 公交| 收藏| 公积金| IP| 日历| 便民| 美食| 少儿| 微博| 转帖| 导航
发新话题
打印

Spring+hibernate+DWR整合(讲的不错)

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:
复制内容到剪贴板
代码:
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 [url]http://www.springframework.org/schema/beans/spring-beans-2.0.xsd[/url]">

    <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>edujlufuliangdomainBook.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 [url]http://www.springframework.org/schema/beans/spring-beans-2.0.xsd[/url]">
     
    <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


p
复制内容到剪贴板
代码:
ackage 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 [url]http://www.springframework.org/schema/beans/spring-beans-2.0.xsd[/url]">

    <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  
    [url]http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd[/url]">
<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操作了.
心生则种种魔生;心灭则种种魔灭

TOP

spring+hibernate+dwr小结
  spring+hibenate+dwr是个不错的组合,特别是DWR是J2EE中AJAX中不错的选择来的,最近在读李刚的<<基于j2ee的AJAX宝典>>,
发现的确是本好书,下面小结下spring+hiberante+dwr使用时的一些步骤
   比如一篇BLOG,可以拥有多个评论,这是典型的一对多关系了,先看model层

1 model层
复制内容到剪贴板
代码:
blog.java
public class Blog
{
    private int id;
    private String title;
    private String content;
private Date addTime;

private Set<Comment> comments = new HashSet<Comment>();

public Blog()
{
}
   
//get,set等方法

comment.java

public class Comment
{
    private int id;
    private String user;
    private String email;
private String url;
private String content;
private Date addTime;

    private Blog  blog;
//....get.set等方法
2 hbm文件
   
blog.hbm.xml:
复制内容到剪贴板
代码:
<class name="Blog" table="blog_table">
  <id name="id">
   <generator class="identity"/>
  </id>
  <property name="title"/>
  <property name="content" type="text"/>
  <property name="addTime"/>
  <set name="comments"  inverse="true">
   <key column="blog_id"/>
   <one-to-many class="Comment"/>
  </set>
</class>
comment.hbm.xml:
复制内容到剪贴板
代码:
<class name="Comment" table="comment_table">
  <id name="id">
   <generator class="identity"/>
  </id>
  <property name="user"/>
  <property name="email"/>
  <property name="url"/>
  <property name="content"/>
  <property name="addTime"/>
  <many-to-one name="blog" column="blog_id" not-null="true"/>
</class>
3  DAO层
    blogdao.java (节省篇幅,举例子而已)
复制内容到剪贴板
代码:
public interface BlogDao
{
/**
  * 根据主键加载Blog
  * @param id 需要加载的Blog ID
  * @return 加载的Blog
  */
    Blog get(int id);

/**
  * 保存Blog
  * @param b 需要保存的Blog
  */
    void save(Blog b);

public interface BlogDao
{
/**
  * 根据主键加载Blog
  * @param id 需要加载的Blog ID
  * @return 加载的Blog
  */
    Blog get(int id);

/**
  * 保存Blog
  * @param b 需要保存的Blog
  */
    void save(Blog b);


。。。。。。
}
blogdaoimpl.java (BLOGADAO接口的实现类)
复制内容到剪贴板
代码:
public class BlogDaoHibernate extends HibernateDaoSupport
implements BlogDao
{
//每页显示的消息数
private int pageSize;
//每页的消息数通过依赖注入管理
public void setPageSize(int pageSize)
{
  this.pageSize = pageSize;
}

/**
  * 根据主键加载Blog
  * @param id 需要加载的Blog ID
  * @return 加载的Blog
  */
    public Blog get(int id)
{
  return (Blog)getHibernateTemplate().get(Blog.class , new Integer(id));
}

/**
  * 保存Blog
  * @param b 需要保存的Blog
  */
    public void save(Blog b)
{
  getHibernateTemplate().save(b);
}

...........................
4  业务逻辑层
  业务逻辑层接口
    blogmanager.java
复制内容到剪贴板
代码:
public interface BlogManager
{
/**
  * 创建一条Blog文章
  * @param title Blog文章的标题
  * @param content Blog文章的内容
  * @return 新创建Blog文章的主键,如果创建失败,返回-1。
  */
int createBlog(String title , String content)
  throws BlogException;

.......................

}

   业务逻辑层实现blogmanagerimpl.java


public class BlogManagerImpl implements BlogManager
{
private BlogDao blogDao;
private CommentDao commentDao;

public void setBlogDao(BlogDao blogDao)
{
  this.blogDao = blogDao;
}
public void setCommentDao(CommentDao commentDao)
{
  this.commentDao = commentDao;
}


/**
  * 创建一条Blog文章
  * @param title Blog文章的标题
  * @param content Blog文章的内容
  * @return 新创建Blog文章的主键,如果创建失败,返回-1。
  */
public int createBlog(String title , String content)
  throws BlogException
{
  try
  {
   Blog b = new Blog();
   b.setTitle(title);
   b.setContent(content);
   b.setAddTime(new Date());
   blogDao.save(b);
   return b.getId();
  }
  catch (Exception e)
  {
   e.printStackTrace();
   throw new BlogException("保存Blog文章出错");
  }
}
5  配置业务逻辑组件
   applicationcontext.xml
复制内容到剪贴板
代码:
<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 [url]http://www.springframework.org/schema/beans/spring-beans.xsd[/url]">

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3309/blog"/>
        <property name="driverClass" value="com.mysql.jdbc.Driver"/>
        <property name="user" value="root"/>
        <property name="password" value="123456789"/>
        <property name="maxPoolSize" value="40"/>
        <property name="minPoolSize" value="1"/>
        <property name="initialPoolSize" value="1"/>
        <property name="maxIdleTime" value="20"/>
    </bean>


    <!--定义了Hibernate的SessionFactory -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="mappingResources">
            <list>
    <value>Blog.hbm.xml</value>
    <value>Comment.hbm.xml</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.jdbc.batch_size">20</prop>
            </props>
        </property>
    </bean>

    <bean id="blogDao" class="org.yeeku.dao.impl.BlogDaoHibernate">
        <property name="sessionFactory" ref="sessionFactory"/>
        <property name="pageSize" value="3"/>
    </bean>

    <bean id="commentDao" class="org.yeeku.dao.impl.CommentDaoHibernate">
        <property name="sessionFactory" ref="sessionFactory"/>
        <property name="pageSize" value="3"/>
    </bean>


    <bean id="blogManager" class="org.yeeku.service.impl.BlogManagerImpl">
        <property name="blogDao" ref="blogDao"/>
        <property name="commentDao" ref="commentDao"/>
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

    <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
     <!--  事务拦截器bean需要依赖注入一个事务管理器 -->
        <property name="transactionManager" ref="transactionManager"/>
     <property name="transactionAttributes">
      <!--  下面定义事务传播属性-->
      <props>
       <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
       <prop key="*">PROPAGATION_REQUIRED</prop>
      </props>
     </property>
</bean>

    <!-- 定义BeanNameAutoProxyCreator-->
    <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
     <!--  指定对满足哪些bean name的bean自动生成业务代理 -->
     <property name="beanNames">
            <!--  下面是所有需要自动创建事务代理的bean-->
            <list>
    <value>blogManager</value>
            </list>
            <!--  此处可增加其他需要自动创建事务代理的bean-->
     </property>
        <!--  下面定义BeanNameAutoProxyCreator所需的事务拦截器-->
        <property name="interceptorNames">
            <list>
                <!-- 此处可增加其他新的Interceptor -->
                <value>transactionInterceptor</value>
            </list>
        </property>
    </bean>
5  初始化 dwr
  web.xml
复制内容到剪贴板
代码:
<?xml version="1.0" encoding="GBK"?>

<web-app 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 [url]http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd[/url]"
    version="2.4">

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/classes/applicationContext.xml</param-value>
</context-param>

<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- 配置DWR的核心Servlet -->
<servlet>
  <!-- 指定DWR核心Servlet的名字 -->
  <servlet-name>dwr-invoker</servlet-name>
  <!-- 指定DWR核心Servlet的实现类 -->
  <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
  <!--  指定DWR核心Servlet处于调试状态 -->
  <init-param>
   <param-name>debug</param-name>
   <param-value>true</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
<!-- 指定核心Servlet的URL映射 -->
<servlet-mapping>
  <servlet-name>dwr-invoker</servlet-name>
  <!-- 指定核心Servlet映射的URL -->
  <url-pattern>/leedwr/*</url-pattern>
</servlet-mapping>

</web-app>
6 DWR.XML
复制内容到剪贴板
代码:
<dwr>
<allow>
  <create creator="spring" javascript="bm">
   <param name="beanName" value="blogManager"/>
   <include method="createComment"/>
   <include method="createBlog"/>
   <include method="getAllBlogByPage"/>
   <include method="getCommentsByBlogAndPage"/>
   <include method="getBlog"/>
   <include method="getNewestBlog"/>
  </create>
  <convert converter="bean" match="org.yeeku.vo.CommentBean"/>
  <convert converter="bean" match="org.yeeku.vo.BlogBean"/>

</allow>
</dwr
其中配置了javascript对象bm,该对象由dwr通过spring容器中的blogmanager创建,还定义了两个javabean,可以被转化为javascript对象
7 客户端调用

  比如添加BLOG的功能:
.
复制内容到剪贴板
代码:
/创建新Blog文章
function addBlog()
{
var blogTitle = $("blogTitle").value;
var blogContent = $("blogContent").value;

if (blogTitle == null || blogTitle == "" || blogContent == null || blogContent == "")
{
  alert("新增Blog文章时,必须指定文章标题,文章内容");
}
else
{
  bm.createBlog(blogTitle , blogContent , addBlogCb);
}
}

//创建新Blog文章的回调函数
function addBlogCb(data)
{
if (typeof data != "number" || data < 1)
{
  alert("添加文章失败");
}
else
{
  $("blogTitle").value = "";
  $("blogContent").value = ""
  alert("添加文章成功");
  window.close();
}
心生则种种魔生;心灭则种种魔灭

TOP

发新话题
感谢宣城论坛曾经的版主们,谢谢!