程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 談談對Struts多模塊的認識

談談對Struts多模塊的認識

編輯:關於JAVA

首先,建一個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>

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved