`

关于struts2.3.1.2_spring3.1.1_hibernate4.1.2整合总结

阅读更多

在struts2.3.1.2_spring3.1.1_hibernate4.1.2整合时,今天我是特别的郁闷,以前都好好的,结果下午就出现问题,苦逼的到现在才解决。

 

附件: 就是这个项目所须的jar包,以及项目结构。

由于ssh 的jar包太大,就没有上传原代码上来,抱歉,不对的地方希望大家指正。

 

1.web.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app 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_3_0.xsd"
	version="3.0">

	<!-- Welcome File List -->
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>

	<!-- Spring Encoding Filter -->
	<filter>
		<filter-name>encodingFilter</filter-name>
		<filter-class>
            org.springframework.web.filter.CharacterEncodingFilter
        </filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>

	<!-- Spring Encoding Filter Mapping -->
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>


	<!-- Struts2 Filter -->
	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>
            org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
        </filter-class>
	</filter>

	<!-- Struts2 Filter Mapping -->
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<!-- Log4j ConfigurationFile Location -->
	<context-param>
		<param-name>log4jConfigLocation</param-name>
		<param-value>classpath:log4j.properties</param-value>
	</context-param>

	<!-- Spring Log4j Listener -->
	<listener>
		<listener-class>
            org.springframework.web.util.Log4jConfigListener
        </listener-class>
	</listener>

	<!-- 如果没有context-param标签的话,contextLoaderListener就读取application.xml -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	</context-param>

	<!--Spring的ApplicationContext 载入 -->
	<listener>
		<listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
	</listener>
	
	<!-- Spring 刷新Introspector防止内存泄露 -->
	<listener>
		<listener-class>
			org.springframework.web.util.IntrospectorCleanupListener
		</listener-class>
	</listener>

	<!-- Spring Web Request Listener -->
	<listener>
		<listener-class>
            org.springframework.web.context.request.RequestContextListener
        </listener-class>
	</listener>

  	<!-- session超时定义,单位为分钟 -->
    <session-config>
        <session-timeout>20</session-timeout>
    </session-config>
	
	<filter>
    	<filter-name>openSessionInView</filter-name>
    	<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
    	<init-param>
      		<param-name>sessionFactoryBeanName</param-name>
      		<param-value>sessionFactory</param-value>
    	</init-param>
  	</filter>
  	<filter-mapping>
    	<filter-name>openSessionInView</filter-name>
    	<url-pattern>/*</url-pattern>
  	</filter-mapping>	

</web-app>

 2.struts.xml配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <!-- 开发模式下使用,这样可以打印出更详细的错误信息 -->
    <constant name="struts.devMode" value="false" />
    
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
   	
   	<!-- 默认的视图主题 -->
    <constant name="struts.ui.theme" value="simple" />
    <constant name="struts.objectFactory" value="spring" />
    
 	<package name="default" extends="struts-default,json-default,jfreechart-default,spring-default">
 		
 		<default-action-ref name="index" />

        <global-exception-mappings>
            <exception-mapping exception="java.lang.Exception" result="error"/>
        </global-exception-mappings>
 			
 		<action name="mylogin" class="loginAction">  
            <result name="input">/WEB-INF/page/personlist.jsp</result>
            <result name="add">/WEB-INF/page/addperson.jsp</result>
            <result name="success">/WEB-INF/page/message.jsp</result>  
        </action>
    </package>

</struts>

 3.database.properties配置

dataSource.password=root
dataSource.username=root
dataSource.databaseName=Demo
dataSource.driverClassName=com.mysql.jdbc.Driver
dataSource.dialect=org.hibernate.dialect.MySQLDialect
dataSource.serverName=localhost:3306
dataSource.url=jdbc:mysql://localhost:3306/Demo?autoReconnect=true&amp;characterEncoding=utf-8
dataSource.auto=false
dataSource.show_sql=false
dataSource.format_sql=false

4.applicationContext.xml配置

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

<beans  xmlns="http://www.springframework.org/schema/beans"
		xmlns:context="http://www.springframework.org/schema/context"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		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-3.1.xsd
				http://www.springframework.org/schema/context
				http://www.springframework.org/schema/context/spring-context-3.1.xsd
				http://www.springframework.org/schema/tx
				http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
				http://www.springframework.org/schema/aop
				http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
	
	<!-- 添加对Annotation的支持 -->
	<context:annotation-config />
	
	<!-- 配置数据源 -->
    <context:property-placeholder location="classpath:database.properties"/>

	<!-- DataSource -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
		<property name="driverClass" value="${dataSource.driverClassName}" />
     	<property name="jdbcUrl" value="${dataSource.url}" />
     	<property name="user" value="${dataSource.username}" />
     	<property name="password" value="${dataSource.password}" />
     	
     	<!-- 当连接池中的连接用完时,C3P0一次性创建新连接的数目2 -->
	    <property name="acquireIncrement" value="5"></property>
	    <!-- 初始化时创建的连接数,必须在minPoolSize和maxPoolSize之间 -->
        <property name="initialPoolSize" value="10"></property>
        <property name="minPoolSize" value="5"></property>
        <property name="maxPoolSize" value="20"></property>
        <!-- 最大空闲时间,超过空闲时间的连接将被丢弃  
        [需要注意:mysql默认的连接时长为8小时(28800)【可在my.ini中添加 wait_timeout=30(单位秒)设置连接超时】,这里设置c3p0的超时必须<28800]   -->  
        <property name="maxIdleTime" value="300"></property>
        <!-- 每60秒检查连接池中的空闲连接 -->
        <property name="idleConnectionTestPeriod" value="60"></property>
        <!-- jdbc的标准参数  用以控制数据源内加载的PreparedStatement数量,但由于预缓存的Statement属 于单个Connection而不是整个连接 -->
        <property name="maxStatements" value="20"></property>
     </bean>

	<!-- SessionFactory -->
	<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
	     <property name="dataSource" ref="dataSource"/>
	     <!--ORM映射文件:mappingResources-->
	     <!-- ORM目录 -->
		 <property name="mappingResources">
		    <list>
		      <value>cn/itcast/bean/Person.hbm.xml</value>
		    </list>
		 </property>
	     <property name="hibernateProperties">
	     	<props>
	     		<prop key="hibernate.autoReconnect">true</prop>
	     		<!-- 数据库方言 -->
	     		<prop key="hibernate.dialect">${dataSource.dialect}</prop>
	     		<prop key="hibernate.hbm2ddl.auto">${dataSource.auto}</prop>
	     		<!-- 控制台是否打印SQL -->
	     		<prop key="hibernate.show_sql">${dataSource.show_sql}</prop>
				<!-- 控制台是否格式化SQL语句显示样式 -->
				<prop key="hibernate.format_sql">${dataSource.format_sql}</prop>
				
				<prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop>
				<!-- 是否使用二级缓存 -->
				<prop key="hibernate.cache.use_second_level_cache">true</prop>
				<!-- QueryCacheFactory的实现类  -->
				<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
	     	</props>
	     </property>
	</bean>
	
	<!-- TransactionManager -->
	<bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
	  	<property name="sessionFactory" ref="sessionFactory"/>
	</bean>
	<tx:annotation-driven transaction-manager="txManager"/>
	
	<bean id="personService" class="cn.itcast.service.impl.PersonServiceBean"/>
	
	<bean id="loginAction" class="cn.itcast.web.PersonManageAction" scope="prototype"/>

</beans>

 5.log4j.properties配置

# Set The RootLogger
log4j.rootLogger=warn, console

# Direct Log Messages To Console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p %c:%L - %m%n

# Log Hibernate
log4j.logger.org.hibernate=error

# Log Just The SQL
log4j.logger.org.hibernate.SQL=debug

# Log Schema Export Update
log4j.logger.org.hibernate.tool.hbm2ddl=debug

 6. interface层

 

package cn.itcast.service;

import java.util.List;

import cn.itcast.bean.Person;

public interface PersonService {

	public void save(Person person);

	public void update(Person person);

	public Person getPerson(Integer personid);

	public void delete(Integer personid);

	public List<Person> getPersons();

}

 7. service 层 (Hibernate4

package cn.itcast.service.impl;

import java.util.List;

import javax.annotation.Resource;

import org.hibernate.SessionFactory;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import cn.itcast.bean.Person;
import cn.itcast.service.PersonService;

@Transactional
public class PersonServiceBean implements PersonService {
	@Resource private SessionFactory sessionFactory;

	public void save(Person person){
		sessionFactory.getCurrentSession().persist(person);
	}
	
	public void update(Person person){
		sessionFactory.getCurrentSession().merge(person);
	}
	@Transactional(propagation=Propagation.REQUIRED,readOnly=true)
	public Person getPerson(Integer personid){
		return (Person)sessionFactory.getCurrentSession().get(Person.class, personid);
	}

	public void delete(Integer personid){
		sessionFactory.getCurrentSession().delete(
				sessionFactory.getCurrentSession().load(Person.class, personid));
	}
	@Transactional(propagation=Propagation.REQUIRED,readOnly=true)
	@SuppressWarnings("unchecked")
	public List<Person> getPersons(){		
		return sessionFactory.getCurrentSession().createQuery("from Person").list();
	}
	
}

 

 上面的代码是Hibernate4 的结构,不注意的写成下面这样的代码,就会出现异常的:

org.hibernate.HibernateException: No Session found for current thread

 

8. service 层 (Hibernate3

@Transactional
public class PersonServiceBean implements PersonService {
	@Resource private SessionFactory sessionFactory;

	public void save(Person person){
		sessionFactory.getCurrentSession().persist(person);
	}
	
	public void update(Person person){
		sessionFactory.getCurrentSession().merge(person);
	}
	@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
	public Person getPerson(Integer personid){
		return (Person)sessionFactory.getCurrentSession().get(Person.class, personid);
	}

	public void delete(Integer personid){
		sessionFactory.getCurrentSession().delete(
				sessionFactory.getCurrentSession().load(Person.class, personid));
	}
	@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
	@SuppressWarnings("unchecked")
	public List<Person> getPersons(){		
		return sessionFactory.getCurrentSession().createQuery("from Person").list();
	}
	
}

 而Hibernate4 的写法,有些改变,不明显,而在service 实现类的写法是这样的:

@Transactional(propagation=Propagation.REQUIRED ,readOnly=true)

 

Hibernate3 在service 实现类的写法是这样的:

@Transactional(propagation=Propagation.NOT_SUPPORTED ,readOnly=true)

 

其实大家都在Hibernate3 在对数据库查询操作时,是不需要开事务的。但是在Hibernate4 就不行了,我也没有想明天是为什么,可能是Hibernate4 必须 要这样的。

9. action层

package cn.itcast.web;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;
import org.springframework.stereotype.Controller;

import com.opensymphony.xwork2.ActionSupport;

import cn.itcast.bean.Person;
import cn.itcast.service.PersonService;

@Controller("loginAction")
public class PersonManageAction extends ActionSupport{
	/**
	 * @Controller("loginAction")
	 */
	private static final long serialVersionUID = -1625398401024059186L;
	@Resource PersonService personService;
	
	private String name;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String execute() throws Exception {
		HttpServletRequest request = ServletActionContext.getRequest();
		personService.save(new Person(getName()));
		request.setAttribute("message", "添加成功");
		return "message";
	}
}

 10. Bean层

package cn.itcast.bean;

import java.io.Serializable;

import javax.persistence.Entity;

import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;


@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Person implements Serializable {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 4518832830369121138L;
	
	private Integer id;
	private String name;
	
	public Person(){}
	
	public Person(String name) {
		this.name = name;
	}
	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

 11.  Person 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="cn.itcast.bean">
    <class name="Person" table="person">
    	<cache usage="read-write" region="cn.itcast.bean.Person"/>
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name" length="10" not-null="true"/>
    </class>
</hibernate-mapping>

 

  • 大小: 42.5 KB
  • 大小: 16.5 KB
分享到:
评论

相关推荐

    最新struts2.3.1.2_+spring3.1.1_+hibernate4.1.2整合完整版

    之前做android开发,现在搞一下java web的东西,发现hibernate都升到4了,整合一下三个框架,基于最新版的struts2.3.1.2_spring3.1.1_hibernate4.1.2进行整合的,网上看了很多别人的整合,好像多多少少都有点问题,...

    spring和hibernate__jar包,详细说明看jar包列表

    org.springframework.web.struts-3.1.1.RELEASE.jar slf4j-api-1.5.8.jar slf4j-log4j12-1.5.8.jar spring-aop-3.1.1.RELEASE.jar spring-asm-3.1.1.RELEASE.jar spring-beans-3.1.1.RELEASE.jar spring-context-...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    12.6 整合Struts、Spring和Hibernate实现用户管理 12.6.1 Struts、Spring和Hibernate的整合方式 12.6.2 编写用户注册画面regedit.jsp 12.6.3 编写用户登录画面login.jsp 12.6.4 编写注册控制器RegeditAction.java ...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    12.6 整合Struts、Spring和Hibernate实现用户管理 12.6.1 Struts、Spring和Hibernate的整合方式 12.6.2 编写用户注册画面regedit.jsp 12.6.3 编写用户登录画面login.jsp 12.6.4 编写注册控制器RegeditAction.java ...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    12.6 整合Struts、Spring和Hibernate实现用户管理 12.6.1 Struts、Spring和Hibernate的整合方式 12.6.2 编写用户注册画面regedit.jsp 12.6.3 编写用户登录画面login.jsp 12.6.4 编写注册控制器RegeditAction.java ...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

     国内知名的高端IT技术作家,已出版《Spring 2.0宝典》、《基于J2EE的Ajax宝典》、《轻量级J2EE企业应用实战》、《Struts 2权威指南》、《Ruby On Rails敏捷开发最佳实践》等著作。 目录: 第0章 学习Java...

    Spring in Action(第二版 中文高清版).part2

    4.1.2 Spring对AOP的支持 4.2 创建典型的Spring切面 4.2.1 创建通知 4.2.2 定义切点和通知者 4.2.3 使用ProxyFactoryBean 4.3 自动代理 4.3.1 为Spring切面创建自动代理 4.3.2 自动代理@AspectJ切面 4.4 ...

    Spring in Action(第二版 中文高清版).part1

    4.1.2 Spring对AOP的支持 4.2 创建典型的Spring切面 4.2.1 创建通知 4.2.2 定义切点和通知者 4.2.3 使用ProxyFactoryBean 4.3 自动代理 4.3.1 为Spring切面创建自动代理 4.3.2 自动代理@AspectJ切面 4.4 ...

    Spring in Action(第2版)中文版

    4.1.2spring对aop的支持 4.2创建典型的spring切面 4.2.1创建通知 4.2.2定义切点和通知者 4.2.3使用proxyfactorybean 4.3自动代理 4.3.1为spring切面创建自动代理 4.3.2自动代理@aspectj切面 4.4定义纯粹的...

    《程序天下:J2EE整合详解与典型案例》光盘源码

    12.6 整合Struts、Spring和Hibernate实现用户管理 12.6.1 Struts、Spring和Hibernate的整合方式 12.6.2 编写用户注册画面regedit.jsp 12.6.3 编写用户登录画面login.jsp 12.6.4 编写注册控制器RegeditAction.java ...

    进销存信息管理系统毕业设计论文

    2.3 Hibernate框架 8 2.3.1 ORM技术的概述 8 2.3.2 Hibernate框架的概述 9 2.3.3 Hibernate的体系结构 9 2.4 Spring框架 11 2.4.1 Spring框架的概述 11 2.4.2 Spring框架的核心机制 12 2.5 SSH框架集成及其特点 13 ...

    java web技术开发大全(最全最新)

    《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》特别介绍了Struts 2对AjAX的支持,还重点剖析了SSH框架的整合开发,并给出了两个综合案例来展示整合SSH框架开发Web应用。 和已经出版的同类图书...

    spring in action英文版

     4.4 用Spring整合Hibernate  4.4.1 Hibernate概览  4.4.2 管理Hibernate资源  4.4.3 用HibernateTemplate访问Hibernate  4.4.4 HibernateDaoSupport的子类  4.5 Spring和JDO  4.5.1 配置JDO ...

    Java Web程序设计教程

    第14章spring与struts2、hibernate框架的整合基础 277 14.1spring与struts2的整合方式 277 14.1.1struts2应用的扩展方式 277 14.1.2spring插件的应用 278 14.2spring和hibernate的整合 279 14.2.1spring对...

    Spring攻略(第二版 中文高清版).part1

    1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 工作原理 4 1.3 调用构造程序创建Bean 14 1.3.1 问题 14 1.3.2 解决方案 14 1.3.3 工作原理 14 1.4 解决构造程序歧义 17 ...

    基于Java的邮件系统的设计与实现-初稿.doc

    2.3 Spring简介 6 2.4 Hibernate简介 7 2.5 MyEclipse开发工具简介 8 2.6 MySQL简介 8 2.7 Tomcat服务器简介 9 2.8 James邮件服务器简介 9 2.9 Jquery简介 10 2.10 电子邮件简介 11 3 系统需求分析 13 3.1 可行性...

    java web开发技术大全

    《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》特别介绍了Struts 2对AjAX的支持,还重点剖析了SSH框架的整合开发,并给出了两个综合案例来展示整合SSH框架开发Web应用。 和已经出版的同类图书...

    Spring攻略(第二版 中文高清版).part2

    1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 工作原理 4 1.3 调用构造程序创建Bean 14 1.3.1 问题 14 1.3.2 解决方案 14 1.3.3 工作原理 14 1.4 解决构造程序歧义 17 ...

    Smart系统-题库及试卷管理模块的设计与开发

    1.2国内现状 1 1.3本课题研究的意义 1 2相关理论知识及其技术 2 2.1系统开发环境及技术 2 2.1.1 开发环境 2 2.2框架介绍 2 2.2.1 Struts 简介 2 2.2.2 Spring简介 4 2.2.3 Hibernate 简介 4 2.2.4 SQLServer 2000 ...

    Java题库及试卷管理模块的设计与开发毕业论文

    1.2国内现状 1 1.3本课题研究的意义 1 2相关理论知识及其技术 2 2.1系统开发环境及技术 2 2.1.1 开发环境 2 2.2框架介绍 2 2.2.1 Struts 简介 2 2.2.2 Spring简介 4 2.2.3 Hibernate 简介 4 2.2.4 SQLServer 2000 ...

Global site tag (gtag.js) - Google Analytics