Struts2+Spring2.5+Hibernate3整合

今天主要集成Struts2 + Spring2.5 + Hibernate3的开发。首先我们先整合 Spring2.5 + Hibernate3,然后在此基础上整合Struts2.

 

第一步:首先罗列出Spring2.5 + Hibernate3 + 数据库驱动的必要Jar文件并加入到lib目录里:

Hibernate3 所需的Jar文件:

Spring2.5 所需的Jar文件:


SqlServer驱动所需的Jar文件:

第二步:在src下创建spring配置文件applicationContext.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"  

       xmlns:context="http://www.springframework.org/schema/context"  

       xmlns:aop="http://www.springframework.org/schema/aop"  

       xmlns:tx="http://www.springframework.org/schema/tx"  

       xsi:schemaLocation="http://www.springframework.org/schema/beans   

           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   

           http://www.springframework.org/schema/context   

           http://www.springframework.org/schema/context/spring-context-2.5.xsd   

           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd   

           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">  

              

    <context:annotation-config/>    

       

    <context:component-scan base-package="com.zhaoxuan.projectdemo"/>  

       

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">  

        <property name="driverClass" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>  

        <property name="jdbcUrl" value="jdbc:sqlserver://localhost:1032;DatabaseName=SSH2ProjectDemoDB"/>  

        <property name="user" value="sa"/>  

        <property name="password" value="sql2005"/>  

        <!--初始化时获取的连接数,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->  

        <property name="initialPoolSize" value="1"/>  

        <!--连接池中保留的最小连接数。-->  

        <property name="minPoolSize" value="1"/>     

        <!--连接池中保留的最大连接数。Default: 15 -->  

        <property name="maxPoolSize" value="300"/>  

        <!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->  

        <property name="maxIdleTime" value="60"/>    

        <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->  

        <property name="acquireIncrement" value="5"/>    

        <!--每60秒检查所有连接池中的空闲连接。Default: 0 -->  

        <property name="idleConnectionTestPeriod" value="60"/>  

    </bean>  

       

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  

        <property name="dataSource" ref="dataSource"/>  

         <property name="mappingResources">  

                <list>  

                  <value>com/zhaoxuan/projectdemo/pojo/Users.hbm.xml</value>  

                </list>  

        </property>  

         <property name="hibernateProperties">  

             <value>  

                  hibernate.dialect=org.hibernate.dialect.SQLServerDialect   

                  hibernate.hbm2ddl.auto=update  

                  hibernate.show_sql=false  

                  hibernate.format_sql=false  

              </value>  

         </property>  

    </bean>  

       

    <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">  

        <property name="sessionFactory" ref="sessionFactory"/>  

    </bean>  

    <!--使用基于注解方式配置事务 -->  

    <tx:annotation-driven transaction-manager="txManager"/>  

  

</beans>  

 第三步:在src下创建包com.zhaoxuan.projectdemo.pojo,并创建实体类Users和一个Gender(Gender为枚举,指性别,它是Users的一个属性)以及Users的映射文件Users.hbm.xml。

Users 类:

package com.zhaoxuan.projectdemo.pojo;   

public class Users {   

    private int id;   

    private String name;   

    private String pwd;   

    private Gender gender = Gender.男;   

 

    public Users(){}   

 

    public Users(String name, String pwd, Gender gender) {   

        this.name = name;   

        this.pwd = pwd;   

        this.gender = gender;   

    }   

    //------------------------get/set-----------------------------//   

    public int getId() {   

        return id;   

    }   

    public void setId(int id) {   

        this.id = id;   

    }   

    public String getName() {   

        return name;   

    }   

    public void setName(String name) {   

        this.name = name;   

    }   

    public String getPwd() {   

        return pwd;   

    }   

    public void setPwd(String pwd) {   

        this.pwd = pwd;   

    }   

    public Gender getGender() {   

        return gender;   

    }   

    public void setGender(Gender gender) {   

        this.gender = gender;   

    }   

}  

Gender 类:

package com.zhaoxuan.projectdemo.pojo;    

public enum Gender {   

    男,女;   

}  

Users.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">  

           

<hibernate-mapping package="com.zhaoxuan.projectdemo.pojo">  

    <class name="Users" table="Users">  

        <id name="id" column="id">  

            <generator class="native"/>  

        </id>  

        <property name="name" length="20" not-null="true" column="name"/>  

        <property name="pwd" length="20" not-null="true" column="pwd"/>  

        <property name="gender" length="5">  

            <type name="org.hibernate.type.EnumType">  

                <param name="enumClass">com.zhaoxuan.projectdemo.pojo.Gender</param>  

                <!--12为java.sql.Types.VARCHAR常量值,即保存枚举的字面值到数据库。如果不指定type参数,保存枚举的索引值(从0开始)到数据库-->  

                <param name="type">12</param>  

            </type>  

        </property>  

    </class>  

</hibernate-mapping> 

 

第四步:编写dao层代码,在src下创建包com.zhaoxuan.projectdemo.dao,在该包下创建接口UsersDao并创建的实现类UsersDaoImpl。

UsersDao 类:

 

package com.zhaoxuan.projectdemo.dao;   

import java.util.List;   

import com.zhaoxuan.projectdemo.pojo.Users; 

  

public interface UsersDao {   

      

    public void save(Users users);   

    public void update(Users users);   

    public Users find(int id);   

    public void delete(int... ids);   

    public List<Users> list();   

    

}  

 UsersDaoImpl 类:

package com.zhaoxuan.projectdemo.dao.impl;   

import java.util.List;   

import javax.annotation.Resource;   

import org.hibernate.SessionFactory;   

import org.springframework.stereotype.Repository;   

import org.springframework.transaction.annotation.Propagation;   

import org.springframework.transaction.annotation.Transactional;   

import com.zhaoxuan.projectdemo.dao.UsersDao;   

import com.zhaoxuan.projectdemo.pojo.Users;   

  

@Repository  

@Transactional  

public class UsersDaoImpl implements UsersDao {   

  

    @Resource private SessionFactory sessionFactory ;   

  

    public void delete(int... ids) {   

        for(int id : ids){   

            sessionFactory.getCurrentSession().delete(sessionFactory.getCurrentSession().load(Users.class, id));   

        }   

    }   

    @Transactional(propagation=Propagation.NOT_SUPPORTED)   

    public Users find(int id) {   

        // TODO Auto-generated method stub   

        return (Users)sessionFactory.getCurrentSession().get(Users.class, id);   

    }   

    @SuppressWarnings("unchecked")   

    @Transactional(propagation=Propagation.NOT_SUPPORTED)   

    public List<Users> list() {   

        return sessionFactory.getCurrentSession().createQuery("from Users").list();   

    }   

    public void save(Users users) {   

        sessionFactory.getCurrentSession().persist(users);   

  

    }   

    public void update(Users users) {   

        sessionFactory.getCurrentSession().merge(users);   

  

    }      

}  

 

第五步:编写service层代码,在src下创建包com.zhaoxuan.projectdemo.service,在该包下创建接口UsersService并创建的实现类UsersServiceImpl。

UsersService 类:

package com.zhaoxuan.projectdemo.service;   

  

import java.util.List;   

import com.zhaoxuan.projectdemo.pojo.Users;   

  

public interface UsersService {   

       

    public void save(Users users);     

    public void update(Users users);     

    public Users find(int id);    

    public void delete(int... ids);   

    public List<Users> list();   

  

} 

UsersServiceImpl 类:

package com.zhaoxuan.projectdemo.service.impl;   

  

import java.util.List;   

import javax.annotation.Resource;   

import org.springframework.stereotype.Service;   

import org.springframework.transaction.annotation.Propagation;   

import org.springframework.transaction.annotation.Transactional;   

import com.zhaoxuan.projectdemo.dao.UsersDao;   

import com.zhaoxuan.projectdemo.pojo.Users;   

import com.zhaoxuan.projectdemo.service.UsersService;   

  

@Service  

public class UsersServiceIpml implements UsersService {   

       

    @Resource private UsersDao usersDao;   

  

    public void delete(int... ids) {   

        usersDao.delete(ids);   

    }   

    @Transactional(propagation=Propagation.NOT_SUPPORTED)   

    public Users find(int id) {   

        return usersDao.find(id);   

    }   

    @Transactional(propagation=Propagation.NOT_SUPPORTED)   

    public List<Users> list() {   

        return usersDao.list();   

    }   

    public void save(Users users) {   

        usersDao.save(users);   

    }   

    public void update(Users users) {   

        usersDao.update(users);   

    }   

}  

第六步:通过以上五步,其实我们已经将Spring2.5和Hibernate3整合完毕了,但是为了验证,我们还得测试。在src下创建包com.zhaoxuan.projectdemo.junit,在该包下创建测试类UsersTest(注意加上Junit4支持)。

UsersTest 类:

package com.zhaoxuan.projectdemo.junit;   

  

import java.util.List;   

import javax.annotation.Resource;   

import org.junit.BeforeClass;   

import org.junit.Test;   

import org.springframework.context.ApplicationContext;   

import org.springframework.context.support.ClassPathXmlApplicationContext;   

import com.zhaoxuan.projectdemo.dao.UsersDao;   

import com.zhaoxuan.projectdemo.pojo.Gender;   

import com.zhaoxuan.projectdemo.pojo.Users;   

import com.zhaoxuan.projectdemo.service.UsersService;   

  

public class UsersTest {   

       

    @Resource private static UsersService usersService;   

  

//       

//  @BeforeClass   

//  public static void setUpBeforeClass() throws Exception {   

//         

//  }   

//   

//  @Test   

//  public void createDBTest(){   

//      new ClassPathXmlApplicationContext("applicationContext.xml");   

//  }      

    @BeforeClass  

    public static void setUpBeforeClass() throws Exception {   

        try {   

            ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext.xml");   

            usersService = (UsersService)act.getBean("usersServiceIpml");   

        } catch (RuntimeException e) {   

            // TODO Auto-generated catch block   

            e.printStackTrace();   

        }   

    }     

    @Test  

    public void save(){   

        usersService.save(new Users("zhaoxuan", "zhaoxuan123",Gender.男));   

        usersService.save(new Users("123", "123",Gender.女));   

        usersService.save(new Users("aaa", "aaa",Gender.女));   

    }      

    @Test  

    public void find(){   

        Users users = usersService.find(1);   

        System.out.println("帐号:" + users.getName() + " 密码 :" + users.getPwd() + " 性别:" +users.getGender() );   

    }     

    @Test  

    public void list(){   

        List<Users> list = usersService.list();   

        for(Users users : list){   

            System.out.println("帐号:" + users.getName() + " 密码 :" + users.getPwd() + " 性别:" +users.getGender() );   

        }   

    }     

    @Test  

    public void update(){   

        Users users = usersService.find(6);   

        users.setGender(Gender.男);   

        usersService.update(users);   

    }     

    @Test  

    public void delete(){   

        usersService.delete(3);   

    }      

} 

测试效果

 


嘿嘿。。。好啦,效果出来了,CRUD能够正常操作,通过以上六步,我们已经完全将Spring2.5和Hibernate3整合完毕了,接下来就是在此基础上整合Struts2了

 

第一步:罗列出Struts2的必要Jar文件并加入到lib目录里:

 

Struts2 所需的Jar文件:

 


在这里我们顺便加入JSTL/EL表达式的Jar文件到lib里,因为我们页面上可能会用到...

 

JSTL/EL 所需的Jar文件:

 

 

第二步:修改编写Web.xml文件.

 

 

<?xml version="1.0" encoding="UTF-8"?>  

<web-app version="2.5"    

    xmlns="http://java.sun.com/xml/ns/javaee"    

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    

    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee    

    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  

    <!--  指定spring的配置文件,默认从web根目录寻找配置文件,我们可以通过spring提供的classpath:前缀指定从类路径下寻找  -->  

    <context-param>  

        <param-name>contextConfigLocation</param-name>  

        <param-value>classpath:applicationContext.xml</param-value>  

    </context-param>  

    <!-- 对Spring容器进行实例化 -->  

    <listener>  

        <listenerclass>

           org.springframework.web.context.ContextLoaderListener

        </listener-class>  

    </listener>  

  

    <filter>  

        <filter-name>struts2</filter-name>  

        <filterclass>

           org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

        </filter-class>  

    </filter>  

    <filter-mapping>  

        <filter-name>struts2</filter-name>  

        <url-pattern>/*</url-pattern>  

    </filter-mapping>  

     

  <welcome-file-list>  

    <welcome-file>index.jsp</welcome-file>  

  </welcome-file-list>  

 

</web-app>  

 

 

第三步:在src下创建struts2的配置文件struts.xml文件.

 

<?xml version="1.0" encoding="UTF-8"?>  

<!DOCTYPE struts PUBLIC   

    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"   

    "http://struts.apache.org/dtds/struts-2.0.dtd">  

       

<struts>  

    <!-- 与Spring集成,指定由Spring负责Action对象的创建 -->  

   <constant name="struts.objectFactory" value="spring"></constant>  

    <!-- 默认的视图主题 -->    

   <constant name="struts.ui.theme" value="simple"></constant>    

 

   <package name="UsersAction" namespace="" extends="struts-default">  

        <action name="UsersAction_*" class="usersAction" method="{1}">  

            <result name="list">/page/users.jsp</result>  

        </action>  

    </package>  

</struts>   

 

第四步:在src下创建包com.zhaoxuan.projectdemo.action,并创建Action类UsersAction 

 

package com.zhaoxuan.projectdemo.action;   

 

import javax.annotation.Resource;   

import org.springframework.context.annotation.Scope;   

import org.springframework.stereotype.Controller;   

import com.opensymphony.xwork2.ActionContext;   

import com.zhaoxuan.projectdemo.pojo.Users;   

import com.zhaoxuan.projectdemo.service.UsersService;   

  

@Controller  

@Scope("prototype")   

public class UsersAction {   

       

    private static final long serialVersionUID = 1L;   

  

    @Resource private UsersService usersService;    //Server层   

    private Users users;   

       

    public String list(){   

        ActionContext.getContext().put("users",usersService.list());   

        return "list";   

    }   

    

    //----------------get/set---------------------//   

    public Users getUsers() {   

        return users;   

    }   

    public void setUsers(Users users) {   

        this.users = users;   

    }   

}  

 

 

第五步:创建一个用户列表页面users.jsp,这里我用两种方式显示列表,ognl和jstl两种,但都要注意在页面头部加上他们的标签.

 

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  

<%@ taglib uri="/struts-tags" prefix="s"%>  

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>  

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  

<html>  

  <head>  

    <title>用户列表</title>  

       

    <meta http-equiv="pragma" content="no-cache">  

    <meta http-equiv="cache-control" content="no-cache">  

    <meta http-equiv="expires" content="0">    

  </head>  

     

  <body>  

   ONGL:   

   <br/>  

   <br/>  

   <s:iterator value="#request.users">  

    <s:property value="id"/>,<s:property value="name"/>,<s:property value="pwd"/>,<s:property value="gender"/><br/>  

   </s:iterator>  

   <br/>  

   <br/>  

   JSTL/EL:   

   <br/>  

   <br/>  

   <c:forEach items="${users}" var="users">  

        ${users.id },${users.name },${users.pwd },${users.gender }<br/>  

   </c:forEach>  

   <br/>  

   <br/>  

  </body>  

</html>  

 

 

好了,刷新项目,启动服务,接下来在浏览器地址栏中输入:

 

 

 

 

最后效果:

 

在此我们的整合就正式完毕并成功了,并附上项目的目录结构:

 

OK,谢谢大家的支持....

posted @ 2012-09-12 09:54  残缘炫仔  阅读(417)  评论(2编辑  收藏  举报