`

Spring webwork ibatis初探(一)

阅读更多
本文中的示例采用的环境:
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
分享到:
评论
4 楼 raty 2008-07-11  
说的很好,又学到不少
3 楼 baidu12345 2008-06-27  
2 楼 baidu12345 2008-06-27  
1 楼 baidu12345 2008-06-27  
[/color][color=orange][color=olive][/color][/size][size=large]h fg

相关推荐

    webwork+spring+ibatis很适合初学者的实例

    WebWork 是一个MVC(Model-View-Controller)框架,Spring 是一个全面的后端开发框架,而 iBATIS 是一个持久层框架,用于简化数据库操作。以下是对这些框架的详细解释和它们如何协同工作的概述。 **WebWork**: ...

    spring+ibatis+webwork框架搭配

    综上所述,Spring+Ibatis+WebWork的集成能够为开发者提供一个强大的平台,用于快速构建稳定且高效的Java Web应用程序。通过上述详细配置指南,相信读者已经掌握了如何在Oracle环境下搭建这一组合的基本方法。

    Spring+Webwork+iBatis 组合实例

    总结来说,Spring+WebWork+iBatis的组合为Java Web开发提供了一个强大且灵活的框架,能够帮助开发者快速构建高质量的应用程序。通过深入理解各个框架的功能和配置,我们可以更好地利用这些工具来满足项目需求。

    webwork+spring+ibatis简单实例

    在IT行业中,Web开发是一个广泛讨论的话题,而`webwork`、`spring`和`ibatis`是构建高效、灵活的Web应用的三大组件。这个"webwork+spring+ibatis简单实例"提供了如何整合这三个框架来创建一个功能完整的应用程序的...

    webwork+spring+ibatis

    通过这样的整合,我们可以得到一个松散耦合、易于测试和维护的系统,其中WebWork负责用户交互,Spring提供整体的架构管理和依赖注入,而iBatis则专注于数据持久化,各自发挥其优势,共同构建出高效、灵活的Java Web...

    webwork+Spring+Ibatis

    webwork+Spring+ibatis 此为webwork+Spring+ibatis+freemarker 源码实例 因为包大,只好分开。。请一并下载webwork+Spring+ibatis_lib放入些实例中,,才能运行! 解压后,请参考mark.txt文件操作,即可!

    spring+webwork+ibatis

    "Spring+WebWork+Ibatis"是一个经典的组合,它将Spring的强大功能、WebWork的轻量级MVC架构以及Ibatis的灵活持久层方案融合在一起,提供了高效、可维护的解决方案。本文将深入探讨这三个组件的整合,帮助开发者理解...

    webwork+spring+ibatis注解培训文档

    《WebWork + Spring + iBatis 注解培训文档》 在现代Java Web开发中,WebWork、Spring和iBatis是三个重要的框架,它们分别在MVC架构、依赖注入和数据库操作方面扮演着核心角色。结合注解的使用,这三个框架能够实现...

    webwork+spring+ibatis小例子

    在IT领域,Web开发是一个重要的组成部分,而"webwork+spring+ibatis"是一个常见的技术栈,用于构建高效、灵活的Web应用程序。这个小例子旨在帮助初学者理解这三种技术如何协同工作,以及如何整合它们以实现MVC(模型...

    webwork+Spring+Ibatis_lib

    WebWork是一个轻量级的MVC(Model-View-Controller)框架,Spring则是一个全面的后端开发框架,而iBatis则是一个优秀的持久层框架,用于简化数据库操作。这个名为"webwork+Spring+Ibatis_lib"的压缩包集合了这三个...

    Spring iBatis WebWork 整合

    Spring iBatis WebWork 整合

    struts+spring+ibatis的Demo

    Struts 2是一个基于MVC设计模式的Web应用框架,它继承了Struts 1和WebWork的优点,提供了更强大的动作调度、拦截器机制和丰富的结果类型。在Struts 2中,Action类是业务逻辑处理的核心,请求通过配置的ActionMapping...

    Spring+iBatis+WebWork+oracle

    标题中的"Spring+iBatis+WebWork+Oracle"是一个经典的Java Web开发技术组合,用于构建高效、可扩展的Web应用程序。下面将详细解释这四个组件及其在开发中的作用。 1. **Spring框架**:Spring是Java领域的一个核心...

    webwork增删改简单入门例子(+spring+ibatis)

    在这个“webwork增删改简单入门例子(+spring+ibatis)”中,我们将探讨如何结合Spring和iBatis这两个流行的技术来构建一个基础的CRUD(创建、读取、更新、删除)应用。 1. WebWork基础知识: - 控制器:WebWork的...

    struts+spring+ibatis框架集成.pdf

    Struts2、Spring和iBatis是三种广泛应用于Java企业级开发的开源框架,它们各自在不同的领域提供了强大的功能,并且可以很好地集成在一起,形成一套完整的MVC(模型-视图-控制器)架构。 Struts2是基于MVC设计模式的...

    webwork+spring+ibatis+sitemesh开发的应用系统

    WebWork+Spring+iBatis+Sitemesh是一个经典的Java Web应用程序开发框架组合,它们各自承担着不同的职责,共同构建了一个高效、灵活且可维护的Web应用系统。下面将详细介绍这四个组件及其在开发中的作用。 1. **...

    webwork+spring+ibatis+velocity实例

    【标题】"WebWork+Spring+Ibatis+Velocity实例"是一个综合性的开发示例,它展示了这四个技术在实际Web应用程序中的集成与应用。WebWork是早期的一个MVC(Model-View-Controller)框架,提供了丰富的动作调度和数据...

    开发指南(spring,hibernate,ibatis,webwork)

    【开发指南(spring,hibernate,ibatis,webwork)】 在软件开发领域,Spring、Hibernate、iBatis和WebWork是四个重要的框架,它们分别在不同的层面为开发者提供了便利。下面将对这些框架进行详细阐述。 1. **Spring...

Global site tag (gtag.js) - Google Analytics