本文中的示例采用的环境:
JDK版本1.5.0.09 NetBeans 版本5.5 Mysql版本5.0
Webwork版本2.2.5 Spring版本 ibatis版本2.3.6.77 Spring版本2.0
项目路径如下图
开始之前先配置Log4j支持,
log4j.properties位于$源代码$/log4j.properties
log4j.rootLogger=INFO,M1,R1
log4j.appender.R1=org.apache.log4j.ConsoleAppender
log4j.appender.R1.layout=org.apache.log4j.PatternLayout
log4j.appender.R1.layout.ConversionPattern=%p %-2d{yyyy-MM-dd HH:mm:ss} %c \n %m%n
开始步入:
第一步:整合Spring+webwork
本文中采用的整合方法是Spring的管理ObjectFactory的模式,
主要步骤
1.在webwork.properties中设置,位于$源代码$/webwork.properties
webwork.action.extension=jspa,action,do
webwork.objectFactory=spring
webwork.objectFactory.spring.autoWire = type
2.在web.xml中添加应用上下文监听器,位于$源代码$/web.xml
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/applicationContext.xml</param-value>
</context-param>
注意别忘记设置过滤器,使用webwork
<filter>
<filter-name>webwork</filter-name> <filter-class>com.opensymphony.webwork.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>webwork</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3.在xwork中添加处理的Action,xwork.xml位于$源代码$/xwork.xml
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-1.1.dtd">
<xwork>
<include file="webwork-default.xml"/>
<package name="qry" extends="default" namespace="/user">
<action name="qryUser" class="com.phenix.webwork.action.qryUserAction">
<result name="success" type="dispatcher">/user/result.jsp</result>
<interceptor-ref name="params"/>
</action>
</package>
</xwork>
以上的操作以后,基本Spring和Webwork就可以一起工作了,不过本例中涉及的应用实际不是很复杂,故没有在Spring中注册bean,仅仅把Spring作为了一个Ioc容器来使用事务以及ibatis而已。
具体细节请参考
http://www.opensymphony.com/webwork/wikidocs/Spring.html
更简单的Spring+webwork整合请参考:
http://forum.iteye.com/viewtopic.php?t=9939&highlight=spring+autowire
第二部分:整合Spring和Ibatis
1.在Spring的应用上下文中配置数据库,事务,以及ibatis的配置文件位置,applicationContext.xml文件,位于$源代码$/applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<!--通过注册PropertyPlaceholderConfigurer,来调用外部资源文件,文件中定义了数据库信息-->
<beans >
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:com/phenix/database/jdbc.properties</value>
</list>
</property>
</bean>
<!--通过BasicDataSource使用数据源-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!--配置ibatis的资源文件载入-->
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation"> <value>classpath:com/phenix/ibatis/mapping/sqlMap-config.xml</value> </property>
</bean>
<!--注册事务管理Bean-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource"><ref local="dataSource"/></property>
</bean>
<!--注册DAO-->
<bean id="userDAO" class="com.phenix.ibatis.dao.UserDAO">
<property name="dataSource"> <ref local="dataSource" /> </property>
<property name="sqlMapClient"> <ref local="sqlMapClient" /> </property>
</bean>
<--注册DAO代理-->
<bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager"><ref bean="transactionManager" /></property>
<property name="target"><ref local="userDAO" /></property>
<!--指明事务属性-->
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
</beans>
2.配置sqlMap-config.xml-0位于$源代码
$/com/phenix/ibatis/mapping/sqlMap-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<sqlMap resource="com/phenix/ibatis/mapping/User.xml" />
</sqlMapConfig>
注意,由于本例中的数据库配置在外部资源文件中,所以此时注意建立一个jdbc.properteis
位于$源代码$/com/phenix/database/jdbc.properties
jdbc.driverClassName = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/usetest
jdbc.username = root
jdbc.password = 123
基本整合就是这2个配置文件,剩下的就开始主要代码部分
User.xml ---ibatis的sql映射文件
位于$源代码$/com/phenix/ibatis/mapping/User.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap namespace="User">
<typeAlias alias="user" type="com.phenix.ibatis.action.User" />
<select id="getUserByName" parameterClass="java.lang.String" resultClass="user">
<![CDATA[
SELECT *
FROM admin
WHERE name = #name# ]]>
</select>
<select id="getUserById" parameterClass="java.lang.Integer" resultClass="user">
<![CDATA[
SELECT *
FROM admin
WHERE id = #id# ]]>
</select>
<select id="getAllUser" resultClass="java.util.ArrayList">
<![CDATA[
SELECT *
FROM admin]]>
</select>
<insert id="insertUser" parameterClass="user">
INSERT INTO admin(name,password)
VALUES(#name#,#password#)
</insert>
<update id="updateUserById" parameterClass="user">
UPDATE admin
SET name=#name# ,
password=#password#
</update>
</sqlMap>
User.java --映射对象 位于com.phenix.ibatis/action/User.java
package com.phenix.ibatis.action;
import java.io.Serializable;
public class User implements Serializable{
public User() {
}
private String password;
private String name;
private Integer Id;
public Integer getId() {
return Id;
}
public void setId(Integer Id) {
this.Id = Id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getname() {
return name;
}
public void setname(String name) {
this.name = name;
}
}
UserDAO.java和IUserDAO.java---DAO接口和实现类
package com.phenix.ibatis.dao;
import com.phenix.ibatis.action.User;
import java.util.ArrayList;
public interface IUserDAO {
public ArrayList getAllUser();
public User getUserById(Integer Id);
public void insertUser(User user);
public void updateUser(User user);
public User getUserByName(String name);
}
package com.phenix.ibatis.dao;
import com.phenix.ibatis.action.User;
import java.util.ArrayList;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
public class UserDAO extends SqlMapClientDaoSupport implements IUserDAO {
public UserDAO() {
}
public ArrayList getAllUser() {
return (ArrayList)getSqlMapClientTemplate().queryForList("getAllUser","");
}
public User getUserById(Integer Id) {
return (User)getSqlMapClientTemplate().queryForObject("getUserById",Id);
}
public User getUserByName(String name)
{
return (User)getSqlMapClientTemplate().queryForObject("getUserByName",name);
}
public void insertUser(User user) {
getSqlMapClientTemplate().insert("insertUser",user);
}
public void updateUser(User user) {
getSqlMapClientTemplate().update("updateUser",user);
}
}
QryUserAction.java---具体实现交互的Action
public class QryUserAction implements Action{
private String params;
private String qryType;
private User user;
private ArrayList userList;
/**
* Creates a new instance of QryUserAction
*/
public QryUserAction() {
}
static Logger logger = Logger.getLogger(QryUserAction.class);
public String execute() throws Exception
{
//获取应用上下文
ApplicationContext factory = (ApplicationContext)ActionContext.getContext().getApplication().get(
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
//获取Bean
IUserDAO userDAO = (IUserDAO)factory.getBean("userDAOProxy");
//根据提交过来的参数,选择按Id还是按照Name查找
if(qryType.equals("name"))
{
user = userDAO.getUserByName(params);
}
else
{
Integer id = Integer.parseInt(params);
user = userDAO.getUserById(id);
}
return SUCCESS;
}
public void setParams(String params)
{
this.params=params;
}
public void setQryType(String qryType)
{
this.qryType=qryType;
}
public User getUser()
{
return user ;
}
}
"这段代码似乎并没有什么特殊,但有一个细微之处:
IUserDAO userDAO = (IUserDAO)factory.getBean("userDAOProxy");
这里并没有直接用UserDAO对获得的Bean实例进行强制转型。并非完全出自设计上的考虑,这里情况有些特殊,我们可试一下用UserDAO类对bean实例进行强制转型,不过将得到一个ssCastException,程序异常中止。
为什么会出现这样的问题?原因在于Spring的AOP实现机制,前面曾经提及,Spring中的事务管理实际上是基于AOP机制实现,为了实现动态AOP,Spring在默认情况下会使用Java DynamicPoxy,但是要求其代理的对象必须实现一个接口,该接口定义了准备代理的方法。而对于没有实现任何接口的Java Class,需要采用其他方式,Spring通过CGLib 实现这一功能。
当UserDAO没有实现任何接口时,Spring通过CGLib对rDAO进行代理,此时getBean返回的是一个继承自UserDAO类的子类实例,可以通过UserDAO对其强制转型。而当UserDAO实现了IUserDAO接口之后,Spring将通过JavaDynamic Proxy机制实现代理功能,此时返回的Bean,是通过javaa.lang.reflect.Proxy.newProxyInstance方法创建的IUserDAO接口的一个代理实这个实例实现了IUserDAO接口,但与UserDAO类已经没有继承关系,因此无法通过UserrDAO强制转型。"
---引自夏昕《Spring开发指南》
下面是2个显示的页面文件
search.jsp位于$页面$/user/search.jsp
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>查询</title>
</head>
<body>
<h1>查询</h1>
<form action="qryUser.do" method="POST">
<select name="qryType">
<option value="name" selected>Name</option>
<option value="id">ID</option>
</select>
<input type="text" name="params" value="" size="12" />
<input type="submit" name="submit" value="提交" />
</form>
</body>
</html>
result.jsp--结果显示页面
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title查询结果页面</title>
</head>
<body>
<h1>查询结果页面</h1>
<ww:if test="user==null">
<font color="red"> <ww:actionerror/></font>
</ww:if>
<ww:else>
用户ID:${user.id}
用户名:${user.name}
密码:${user.password}
</ww:else>
</body>
</html>
本文参考:夏昕-《Spring开发指南v0.8预览版》
《Spring2.0 reference_final》
- 大小: 10.3 KB
分享到:
相关推荐
WebWork 是一个MVC(Model-View-Controller)框架,Spring 是一个全面的后端开发框架,而 iBATIS 是一个持久层框架,用于简化数据库操作。以下是对这些框架的详细解释和它们如何协同工作的概述。 **WebWork**: ...
综上所述,Spring+Ibatis+WebWork的集成能够为开发者提供一个强大的平台,用于快速构建稳定且高效的Java Web应用程序。通过上述详细配置指南,相信读者已经掌握了如何在Oracle环境下搭建这一组合的基本方法。
总结来说,Spring+WebWork+iBatis的组合为Java Web开发提供了一个强大且灵活的框架,能够帮助开发者快速构建高质量的应用程序。通过深入理解各个框架的功能和配置,我们可以更好地利用这些工具来满足项目需求。
在IT行业中,Web开发是一个广泛讨论的话题,而`webwork`、`spring`和`ibatis`是构建高效、灵活的Web应用的三大组件。这个"webwork+spring+ibatis简单实例"提供了如何整合这三个框架来创建一个功能完整的应用程序的...
通过这样的整合,我们可以得到一个松散耦合、易于测试和维护的系统,其中WebWork负责用户交互,Spring提供整体的架构管理和依赖注入,而iBatis则专注于数据持久化,各自发挥其优势,共同构建出高效、灵活的Java Web...
webwork+Spring+ibatis 此为webwork+Spring+ibatis+freemarker 源码实例 因为包大,只好分开。。请一并下载webwork+Spring+ibatis_lib放入些实例中,,才能运行! 解压后,请参考mark.txt文件操作,即可!
"Spring+WebWork+Ibatis"是一个经典的组合,它将Spring的强大功能、WebWork的轻量级MVC架构以及Ibatis的灵活持久层方案融合在一起,提供了高效、可维护的解决方案。本文将深入探讨这三个组件的整合,帮助开发者理解...
《WebWork + Spring + iBatis 注解培训文档》 在现代Java Web开发中,WebWork、Spring和iBatis是三个重要的框架,它们分别在MVC架构、依赖注入和数据库操作方面扮演着核心角色。结合注解的使用,这三个框架能够实现...
在IT领域,Web开发是一个重要的组成部分,而"webwork+spring+ibatis"是一个常见的技术栈,用于构建高效、灵活的Web应用程序。这个小例子旨在帮助初学者理解这三种技术如何协同工作,以及如何整合它们以实现MVC(模型...
WebWork是一个轻量级的MVC(Model-View-Controller)框架,Spring则是一个全面的后端开发框架,而iBatis则是一个优秀的持久层框架,用于简化数据库操作。这个名为"webwork+Spring+Ibatis_lib"的压缩包集合了这三个...
Spring iBatis WebWork 整合
Struts 2是一个基于MVC设计模式的Web应用框架,它继承了Struts 1和WebWork的优点,提供了更强大的动作调度、拦截器机制和丰富的结果类型。在Struts 2中,Action类是业务逻辑处理的核心,请求通过配置的ActionMapping...
标题中的"Spring+iBatis+WebWork+Oracle"是一个经典的Java Web开发技术组合,用于构建高效、可扩展的Web应用程序。下面将详细解释这四个组件及其在开发中的作用。 1. **Spring框架**:Spring是Java领域的一个核心...
在这个“webwork增删改简单入门例子(+spring+ibatis)”中,我们将探讨如何结合Spring和iBatis这两个流行的技术来构建一个基础的CRUD(创建、读取、更新、删除)应用。 1. WebWork基础知识: - 控制器:WebWork的...
Struts2、Spring和iBatis是三种广泛应用于Java企业级开发的开源框架,它们各自在不同的领域提供了强大的功能,并且可以很好地集成在一起,形成一套完整的MVC(模型-视图-控制器)架构。 Struts2是基于MVC设计模式的...
WebWork+Spring+iBatis+Sitemesh是一个经典的Java Web应用程序开发框架组合,它们各自承担着不同的职责,共同构建了一个高效、灵活且可维护的Web应用系统。下面将详细介绍这四个组件及其在开发中的作用。 1. **...
【标题】"WebWork+Spring+Ibatis+Velocity实例"是一个综合性的开发示例,它展示了这四个技术在实际Web应用程序中的集成与应用。WebWork是早期的一个MVC(Model-View-Controller)框架,提供了丰富的动作调度和数据...
【开发指南(spring,hibernate,ibatis,webwork)】 在软件开发领域,Spring、Hibernate、iBatis和WebWork是四个重要的框架,它们分别在不同的层面为开发者提供了便利。下面将对这些框架进行详细阐述。 1. **Spring...