赛迪网 > IT技术 Java > 技术动态
  IT资讯搜索
 
IT产品搜索
[程序开发][网管世界][网络安全][数据库技术]
[操作系统][嘉宾聊天·在线访谈][活动集锦]
[精彩专题][Symantec专区][订阅IT技术周刊]
[开发论坛][网管论坛][安全论坛][数据库论坛]
[操作系统论坛][Sybase专区][IBM dW技术专区]
[病毒求助][病毒与漏洞播报][文档·源码下载]

开发框架--谈谈对struts多模块的认识

发布时间:2007.12.21 07:20     来源:赛迪网    作者:applebo

首先,建一个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>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 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> 
  
    (责任编辑:包春林)


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· 开发框架--谈谈对struts多模块的认识 (12-20) · 初学者入门:高手解析Java中 native方法 (12-20)
· web开发过程总需要注意的一些地方 (12-20) · 解决FCKeditor在weblogic下发布和使用 (12-20)
· JAVA基础:JAVA中具有实例缓存的不可变类 (12-20) · Java语言中的ClassLoader与Package机制 (12-20)
· 区县级国产电子政务解决方案推介大会召开 (12-20) · 2007年“中国芯”技术与发展大会颁奖典礼 (12-20)
· 多核线程-volatile原理与技巧 (12-19) · 框架:struts的tiles框架应用的一些体会 (12-19)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
  赛迪推荐  
  手机·资费 ·新品·导购·评测·手机资费·宽带
手机搜索  诺基亚 N73 MOTO Z6
  IT产品 ·笔记本·台式机·服务器·打印·投影
IT产品搜索 
  IT技术 ·开发·网管·安全·数据库·操作系统
  信息化 ·热点·专题·访谈·周刊·方案案例
· 电子商务行业规范出台 电子商务发展目标与规划
· 中小企业网站存在盲目性 消费习惯需重点培养
· 天灾中信息化显力量 CIO如何应对新领导IT改革
· 河南网通数据中心工程 网御神州VPN解决方案
  IT博客 ·曾剑秋·项立刚·Java学习·网管
  IT技术论坛 ·开发·网管·安全·数据库·系统