webwork是个优秀的开源框架,特别是其拦截器机制,我认为是整个系统最大的亮点,可在其上面做大量文章
我的开发环境为Eclipse3.0.1+lomoz,数据库我用的是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的驱动都要下载并放到lib里面,缺一不可
然后是配置log4j,如果没有正确配置log,TOMCAT将不能正常发布你的项目。配置log4j很简单,
在web-inf/classes下建立一个log4j.properties的文件,内容如下
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
其中log4j.appender.R.File这一项请按照你TOMCAT的安装位置进行修改,关于log4j的详细内容,推荐大家看Hilton的学习笔记以及IBM网站上的相关文章.
好了,开始我们的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>
我们配置了两个监听器,还有一个servlet,这个servlet负责action的转发工作,关于action的详细工作原理,大家可以参看xwork的源代码
在接下来配置之前,我想大概说一下我想实现的功能,就是简单的往mysql的一个表中插入一些数据
首先我用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);
}
然后是实现类
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的动态代理,关于这部分,大家可以看xiaxin的spring指南
在insert 方法中,我直接调用了spring提供的hibernate模板方法,真是方便呀
然后是 spring的配置了,请在web-lib/下建立applicationContext.xml文件,内容如下
<?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>
在这个配置文件里面,我们设置了datasource/sessionfactory以及spring的动态代理,还有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>
结果系统提示找不到叫systableDAOProxy这个名字的bean,结果一查,发现旁边不能加上空格和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/你的发布目录/Test.action
看看,是不是数据库里面多出了一条数据了?
至于其他,比如从页面提交的值插入数据库等等,这里都不多说了,webwork自带的sample就是最好的参考资料