webwork2+spring+hibernate入門完全配置指南(1)(原創(chuàng)) 選擇自 tijichen 的 Blog
Posted on 2005-08-17 01:06 我的JAVA 閱讀(1308) 評論(0) 編輯 收藏webwork是個優(yōu)秀的開源框架,特別是其攔截器機制,我認為是整個系統(tǒng)最大的亮點,可在其上面做大量文章
我的開發(fā)環(huán)境為Eclipse3.0.1+lomoz,數(shù)據(jù)庫我用的是MySQL4.0.12,當然,也用到了mysqlcc,服務器我用的是tomcat4.0.3和tomcat4.1
請先下載webwork.,spring.,hibernate,并把JAR文件放到web-inf的lib目錄里面。同時,請下載http://unc.dl.sourceforge.net/sourceforge/aopalliance/aopalliance.zip ,將aopalliance.jar放到lib目錄里面。
還有webwork2-spring.jar,以及mysql的驅(qū)動都要下載并放到lib里面,缺一不可
然后是配置log4j,如果沒有正確配置log,TOMCAT將不能正常發(fā)布你的項目。配置log4j很簡單,
在web-inf/classes下建立一個log4j.properties的文件,內(nèi)容如下
log4j.rootLogger=INFO, A1 , R
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=d:/Tomcat 4.1/webapps/demo/logs/log4j.log
log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
其中l(wèi)og4j.appender.R.File這一項請按照你TOMCAT的安裝位置進行修改,關(guān)于log4j的詳細內(nèi)容,推薦大家看Hilton的學習筆記以及IBM網(wǎng)站上的相關(guān)文章.
好了,開始我們的webwork之旅了。首先是配置web.xml文件
<?xml version="1.0" ?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<!-- Copyright (c) 2002 by ObjectLearn. All Rights Reserved. -->
<web-app>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>com.atlassian.xwork.ext.ResolverSetupServletContextListener</listener-class>
</listener>
<servlet>
<servlet-name>webwork</servlet-name>
<servlet-class>com.opensymphony.webwork.dispatcher.ServletDispatcher</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>webwork</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<taglib>
<taglib-uri>webwork</taglib-uri>
<taglib-location>/WEB-INF/webwork.tld</taglib-location>
</taglib>
</web-app>
我們配置了兩個監(jiān)聽器,還有一個servlet,這個servlet負責action的轉(zhuǎn)發(fā)工作,關(guān)于action的詳細工作原理,大家可以參看xwork的源代碼
在接下來配置之前,我想大概說一下我想實現(xiàn)的功能,就是簡單的往mysql的一個表中插入一些數(shù)據(jù)
首先我用Middlegen-Hibernate和hibernate-extensions(我沒用eclipse的hibernate插件,我喜歡用這兩樣工具來生成)生成了表對應的hbm.xml文件和兩個JAVA類,表的字段是"tablename,fieldname,chinesename", 表名是
"systable",其中tablename,fieldname做雙主鍵,這樣,生成出來的類應該是兩個,一個PK主鍵類和主類本身,我把他們加入到了我的項目中.
然后我做了一個接口類
package com.cz.struct;
/**
* @author tijichen
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public interface SystableDAO {
public abstract void insert(Systable data);
}
然后是實現(xiàn)類
package com.cz.struct;
import net.sf.*;
import org.springframework.orm.hibernate.support.HibernateDaoSupport;
/**
* @author tijichen
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class SysTableDAOImp extends HibernateDaoSupport implements
SystableDAO{
public void insert(Systable data)
{
this.getHibernateTemplate().save(data);
}
}
為什么要用接口類?因為spring會用到JAVA的動態(tài)代理,關(guān)于這部分,大家可以看xiaxin的spring指南
在insert 方法中,我直接調(diào)用了spring提供的hibernate模板方法,真是方便呀
然后是 spring的配置了,請在web-lib/下建立applicationContext.xml文件,內(nèi)容如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource"
destroy-method="close">
<property name="driverClassName">
<value>org.gjt.mm.mysql.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost/mystructs</value>
</property>
<property name="username">
<value>chenzhi</value>
</property>
<property name="password">
<value>1</value>
</property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="dataSource" />
</property>
<property name="mappingResources">
<list>
<value>com\cz\struct\SysTable.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
net.sf.hibernate.dialect.MySQLDialect
</prop>
<prop key="hibernate.show_sql">
true
</prop>
</props>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<bean id="systableDAO" class="com.cz.struct.SysTableDAOImp">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<bean id="systableDAOProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref local="systableDAO" />
</property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="is*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
</beans>
在這個配置文件里面,我們設(shè)置了datasource\sessionfactory以及spring的動態(tài)代理,還有hibernate所需要的XML映射文件路徑
然后是配置xwork.xml
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "http://www.opensymphony.com/xwork/xwork-1.0.dtd">
<xwork>
<include file="webwork-default.xml" />
<package name="default" extends="webwork-default"
externalReferenceResolver="com.atlassian.xwork.ext.SpringServletContextReferenceResolver">
<interceptors>
<interceptor name="reference-resolver"
class="com.opensymphony.xwork.interceptor.ExternalReferencesInterceptor" />
<interceptor-stack name="vxStack">
<interceptor-ref name="params" />
<interceptor-ref name="model-driven" />
<interceptor-ref name="reference-resolver" />
</interceptor-stack>
</interceptors>
<action name="Test" class="com.cz.struct.TestAction">
<external-ref name="systableDAO">systableDAOProxy</external-ref>
<result name="success" type="dispatcher">
<param name="location">/index.jsp</param>
</result>
<interceptor-ref name="vxStack" />
</action>
</package>
</xwork>
在配置action的external-ref的時候我遇到了一個不大不小的玩笑,一般編輯XML的時候我都是在editplus里面編輯的
,最開始我寫成
<external-ref name="systableDAO">
systableDAOProxy
</external-ref>
結(jié)果系統(tǒng)提示找不到叫systableDAOProxy這個名字的bean,結(jié)果一查,發(fā)現(xiàn)旁邊不能加上空格和tab,哎。。肯定是返回串的時候沒加trim
的后果
好了,最后是我們的TestAction.java
package com.cz.struct;
import com.opensymphony.xwork.*;
import com.opensymphony.webwork.*;
import java.util.*;
/**
* @author tijichen
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class TestAction extends ActionSupport
{
private SystableDAO systabledao;
String testname=null;
public void setSystableDAO(SystableDAO dao)
{
this.systabledao=dao;
}
public SystableDAO getSystableDAO()
{return this.systabledao;}
public String execute() throws Exception {
testname="executeing";
SystablePK pk=new SystablePK();
Systable newdata=new Systable();
pk.setFieldName("test");
pk.setTableName("test3");
newdata.setComp_id(pk);
newdata.setChineseName("tets");
systabledao.insert(newdata);
return Action.SUCCESS;
}
}
ok,編譯打包,然后在瀏覽器地址欄中輸入http://localhost:8080/你的發(fā)布目錄/Test.action
看看,是不是數(shù)據(jù)庫里面多出了一條數(shù)據(jù)了?
至于其他,比如從頁面提交的值插入數(shù)據(jù)庫等等,這里都不多說了,webwork自帶的sample就是最好的參考資料