`

十六 Spring2.5+Hibernate3.3+Struts1.3整合开发

 
阅读更多
十六 Spring2.5+Hibernate3.3+Struts1.3整合开发

整合这几个框架,并不是一下子全部配置好的,一般来说先配置spring,然后整合hibernate,最后加入struts。

第一步 引入jar 
引入spring的jar
spring的核心jar
dist\spring.jar
//整合struts1用到的jar
dist\modules\spring-webmvc-struts.jar
lib\jakarta-commons\commons-logging.jar、
//数据源支持的jar
commons-dbcp.jar、commons-pool.jar
//aop支持的jar
lib\aspectj\aspectjweaver.jar、aspectjrt.jar
lib\cglib\cglib-nodep-2.1_3.jar
//注解用到的jar
lib\j2ee\common-annotations.jar
//打印日志用到的jar
lib\log4j\log4j-1.2.15.jar

2 引入hibernate3的jar包 
3 配置beans.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/>
	 <!--配置数据源-->
	 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
	    <property name="driverClassName" value="org.gjt.mm.mysql.Driver"/>
	    <property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8"/>
	    <property name="username" value="root"/>
	    <property name="password" value="root"/>
	     <!-- 连接池启动时的初始值 -->
		 <property name="initialSize" value="1"/>
		 <!-- 连接池的最大值 -->
		 <property name="maxActive" value="500"/>
		 <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
		 <property name="maxIdle" value="2"/>
		 <!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
		 <property name="minIdle" value="1"/>
	  </bean>
	  <!--配置sessionFactory-->
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
	     <property name="dataSource" ref="dataSource"/>
		 <property name="mappingResources">
		    <list>
		      <value>cn/itcast/bean/Person.hbm.xml</value>
		    </list>
		 </property>
	     <property name="hibernateProperties">
		    <value>
		        hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
		        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"/>
	<!--配置bean-->
	<bean id="personService" class="cn.itcast.service.impl.PersonServiceBean"/>
	<bean id="personList" class="cn.itcast.web.PersonAction"/>
</beans>


关键的service
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;
//将服务纳入到spring的事务管理当中
@Transactional
public class PersonServiceBean implements PersonService {
	//将sessionFactory依赖注入到当前的类中 作为一个属性存在 Resource注解 首先是从名称开始寻找 这个名称就是
	//当前定义的这个属性,看这个属性是否在beans.xml中是否存在 
	@Resource private SessionFactory sessionFactory;

	public void save(Person person){
		sessionFactory.getCurrentSession().persist(person);
	}
	
	public void update(Person person){
		//sessionFactory.getCurrentSession()这是获取被spring管理的Session对象 不能是openSession()
		// 因为这样获取的Session是不被spring所管理的
		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){
		//load()方法不需要装配对象 get要装配对象 封装过程
		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();
	}
	
}






到这一步最好是测试一下 看spring跟hibernate是否集成成功

package junit.test;

import static org.junit.Assert.*;

import java.util.List;

import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

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

public class PersonServiceTest {
	private static PersonService personService;
	
	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
		try {
			ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
			personService = (PersonService)applicationContext.getBean("personService");
		} catch (RuntimeException e) {
			e.printStackTrace();
		}
	}

	@Test
	public void testSave() {
		personService.save(new Person("小张"));
	}

	@Test
	public void testUpdate() {
		Person person = personService.getPerson(1);
		//....
		person.setName("小丽");
		personService.update(person);
	}

	@Test
	public void testGetPerson() {
		Person person = personService.getPerson(1);
		System.out.println(person.getName());
		try {
			System.out.println("请关闭数据库");
			Thread.sleep(1000*15);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("第二次开始获取");
		person = personService.getPerson(1);
		System.out.println(person.getName());
	}

	@Test
	public void testDelete() {
		personService.delete(1);
	}

	@Test
	public void testGetPersons() {
		List<Person> persons = personService.getPersons();
		for(Person person : persons){
			System.out.println(person.getName());
		}
	}

}


现在我们来集成struts1
下载struts-1.3.8-lib.zip,需要使用到解压目录下的所有jar,
建议把jstl-1.0.2.jar和standard-1.0.2.jar更换为1.1版本。Spring中已经存在一个antlr-2.7.6.jar,
所以把struts中的antlr-2.7.2.jar删除,避免jar冲突。
然后把lib下的jar全部加入到工程中 
添加struts-config.xml配置文件
在web.xml对spring和struts进行配置 
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
	xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	
	
	<!-- 指定spring的配置文件,默认从web根目录寻找配置文件,我们可以通过spring提供的-->
	<!--classpath:前缀指定从类路径下寻找  -->
	<!--作用:让web容器去初始化spring-->
<context-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>classpath:beans.xml</param-value>
</context-param>
<!-- 对Spring容器进行实例化 -->
<listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
	<!-- 配置struts的web框架-->
<servlet>
<servlet-name>struts</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
 <param-name>config</param-name>
 <param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
	<load-on-startup>0</load-on-startup>
</servlet>

<servlet-mapping>
	<servlet-name>struts</servlet-name>
	<url-pattern>*.do</url-pattern>
</servlet-mapping>
	
	
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
</web-app>

现在我们来新建一个action 
package cn.itcast.web;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import cn.itcast.service.PersonService;



public class PersonAction extends Action {

	@Override
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
	    //得到spring容器实例
		WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext
		(this.getServlet().getServletContext());

		PersonService personservice=(PersonService)ctx.getBean("personService");
		request.setAttribute("persons", personservice.getPersons());
		return mapping.findForward("list");
	}

	
}

配置action struts-config.xml

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
        "http://struts.apache.org/dtds/struts-config_1_3.dtd">
<struts-config>
<action-mappings>
<action path="/person/list" type="cn.itcast.web.PersonAction" validate="false">
	<forward name="list" path="/WEB-INF/page/personlist.jsp"></forward>
</action>
</action-mappings>
</struts-config>


测试下是否通过即可



如果action没有交给spring管理时,我们通过下面语句获取spring容器实例
WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(this.getServlet().getServletContext());


把action交给spring管理后,我们可以使用依赖注入在action中注入业务层的bean。确保action的path属性值与bean的名称相同。

<action path="/person/list" ...>
</action>

Spring 配置:
<bean name="/person/list" class="cn.itcast.web.action.PersonAction"/>

在struts配置文件中添加进spring的请求控制器,该请法语控制器会先根据action的path属性值到spring容器中寻找跟该属性值同名的bean。如果寻找到即使用该bean处理用户请求
<controller>
 <set-property property="processorClass" value="org.springframework.web.struts.DelegatingRequestProcessor"/>
</controller> 

具体步骤如下:
将action交给Spring进行管理,并把相应的service服务依赖注入到Action中
第一步:将Action注册到spring 中 并设置其名称 名称与struts中的path名称一致
spring中的配置 
	<bean name="/person/list" class="cn.itcast.web.PersonAction"/>

struts中的配置 
<action-mappings>
<action path="/person/list"  validate="false">
	<forward name="list" path="/WEB-INF/page/personlist.jsp"></forward>
</action>
</action-mappings>

发现action少了type了呢,这是为下一步做好配置,因为交给spring去管理后,struts中的spring
控制器会在spring中寻找spring中的配置的bean名称为path名称的bean 
第二步 在struts-config.xml中加入spring的控制器 用于管理action 这时action就交给了spring进行管理了

<!-- 配置spring的控制器 -->
<controller>
 <set-property property="processorClass" value="org.springframework.web.struts.DelegatingRequestProcessor"/>
</controller> 

第三步:将服务依赖注入到action中 采用注解方式Resource
现在来看action 

package cn.itcast.web;

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

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import cn.itcast.service.PersonService;



public class PersonAction extends Action {
   @Resource PersonService personservice;
	@Override
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
	    //得到spring容器实例
		//WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext
		//(this.getServlet().getServletContext());

		//PersonService personservice=(PersonService)ctx.getBean("personService");
		request.setAttribute("persons", personservice.getPersons());
		return mapping.findForward("list");
	}

	
}

分析:发现不需要WebApplicationContext来获得spring的容器实例了


这时ssh框架就已经完成了

现在我们还要去配置二级缓存

第一步 加入缓存的jar包 当前我们使用ehcache这个第三方框架  lib\optional\ehcache-1.2.3.jar
第二步 配置 在spring中的sessionFactory去配置 
   <!-- 配置二级缓存 -->
		        hibernate.cache.use_second_level_cache=true
		        <!-- 是否使用查询缓存 -->
       	        hibernate.cache.use_query_cache=false
       	        <!-- 配置使用缓存的驱动类 -->
        	    hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider  

第三步 在src目录下加入缓存第三方框架配置文件 Ehcache默认的配置文件ehcache.xml(放在类路径下)


<ehcache>
    <diskStore path="D:\cache"/>
    <defaultCache  maxElementsInMemory="1000“  eternal="false“ overflowToDisk="true"
        timeToIdleSeconds="120"
        timeToLiveSeconds="180"
        diskPersistent="false"
        diskExpiryThreadIntervalSeconds="60"/>
<cache name="cn.itcast.bean.Person" maxElementsInMemory="100" eternal="false"
    overflowToDisk="true" timeToIdleSeconds="300" timeToLiveSeconds="600" diskPersistent="false"/>
</ehcache>

    defaultCache节点为缺省的缓存策略
     maxElementsInMemory 内存中最大允许存在的对象数量
     eternal 设置缓存中的对象是否永远不过期
     overflowToDisk 把溢出的对象存放到硬盘上
     timeToIdleSeconds 指定缓存对象空闲多长时间就过期,过期的对象会被清除掉
     timeToLiveSeconds 指定缓存对象总的存活时间
     diskPersistent 当jvm结束是是否持久化对象
     diskExpiryThreadIntervalSeconds 指定专门用于清除过期对象的监听线程的轮询时间

<diskStore path="D:\cache"/> 表示的是缓存存放的硬盘路径


第四步:为指定的类注册缓存,并指定其缓存策略 缓存的区域名 这个区域是用来配置缓存的对象,这个对象就是当前配置的这个
实体的对象数据
方法:在实体bean的xml映射文件中配置 Person.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="cn.itcast.bean">
    <!--配置二级缓存-->
    <class name="Person" table="person">
    <cache usage="read-only" region="cn.itcast.bean."/>
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name" length="10" not-null="true"/>
    </class>
</hibernate-mapping>



现在我们来对指定后的缓存区域进行缓存的配置
配置方法 在缓存框架的配置文件(ehcache.xml)进行配置

<?xml version="1.0" encoding="UTF-8"?>
<!-- 
    defaultCache节点为缺省的缓存策略
     maxElementsInMemory 内存中最大允许存在的对象数量
     eternal 设置缓存中的对象是否永远不过期
     overflowToDisk 把溢出的对象存放到硬盘上
     timeToIdleSeconds 指定缓存对象空闲多长时间就过期,过期的对象会被清除掉
     timeToLiveSeconds 指定缓存对象总的存活时间
     diskPersistent 当jvm结束是是否持久化对象
     diskExpiryThreadIntervalSeconds 指定专门用于清除过期对象的监听线程的轮询时间
 -->
<ehcache>
    <diskStore path="D:\cache"/>
    <defaultCache  maxElementsInMemory="1000" eternal="false" overflowToDisk="true"
        timeToIdleSeconds="120"
        timeToLiveSeconds="180"
        diskPersistent="false"
        diskExpiryThreadIntervalSeconds="60"/>
	<!--给缓存区域是cn.itcast.bean.Person的指定特殊缓存配置,如果不指定将运用上述公共的缓存配置-->
	<cache name="cn.itcast.bean.Person" maxElementsInMemory="100" eternal="false"
    overflowToDisk="true" timeToIdleSeconds="300" timeToLiveSeconds="600" diskPersistent="false"/>
</ehcache>

现在缓存的配置就已经好了 
现在我们来测试 怎么测试呢 
查询
--关闭---
查询 
如果能再第二次查询能过查询到数据
就说明缓存配置成功 

当前我们只能对单个的数据进行查询配置成功
如果对list的集合类型有多条数据的查询当前的配置是不能成功的
只能对单条的数据进行查询,能运用到缓存 
如果要findall() list() Iterator() createCriteria() createQuery()等方法获得数据
结果集得话,需要设置hibernate.cache.use_query true才行 
并且需要查询缓存,还需要在使用Query或者criteria()时设置其setCacheable(true)属性

现在来看spring配置文件 
<?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/>
	 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
	    <property name="driverClassName" value="org.gjt.mm.mysql.Driver"/>
	    <property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8"/>
	    <property name="username" value="root"/>
	    <property name="password" value="root"/>
	     <!-- 连接池启动时的初始值 -->
		 <property name="initialSize" value="1"/>
		 <!-- 连接池的最大值 -->
		 <property name="maxActive" value="500"/>
		 <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
		 <property name="maxIdle" value="2"/>
		 <!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
		 <property name="minIdle" value="1"/>
	  </bean>
	  
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
	     <property name="dataSource" ref="dataSource"/>
		 <property name="mappingResources">
		    <list>
		      <value>cn/itcast/bean/Person.hbm.xml</value>
		    </list>
		 </property>
	     <property name="hibernateProperties">
		    <value>
		        hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
		        hibernate.hbm2ddl.auto=update
		        hibernate.show_sql=false
		        hibernate.format_sql=false
		        <!-- 配置二级缓存 -->
		        hibernate.cache.use_second_level_cache=true
		        <!-- 是否使用查询缓存 当前配置上查询缓存 ,但是查询
			缓存的命中率并不是很高,所以没有必要为其配置 当前是设为true
			是配置上查询缓存
			-->
       	        hibernate.cache.use_query_cache=true
       	        <!-- 配置使用缓存的驱动类 -->
        	    hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider  
		      </value>
	     </property>
	</bean>
	<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
	  	<property name="sessionFactory" ref="sessionFactory"/>
	</bean>
	<!-- 启动事务注解管理方式 -->
	<tx:annotation-driven transaction-manager="txManager"/>
	<bean id="personService" class="cn.itcast.service.impl.PersonServiceBean"/>
	<bean name="/person/list" class="cn.itcast.web.PersonAction"/>
</beans>

现在来看DAO的service类


	//这一步是获取的方法 所以不需要开启事务 并且设置为只读
	@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
	@SuppressWarnings("unchecked")
	public List<Person> getPersons(){		
		return sessionFactory.getCurrentSession().createQuery("from Person").setCacheable(true).list();
		
	}

分析:sessionFactory.getCurrentSession().createQuery("from Person").setCacheable(true).list();
当前是不是配置上了,推荐查询缓存不要去做配置

测试类

	@Test
	public void testGetPersons() {
		List<Person> persons = personService.getPersons();
		for(Person person : persons){
			System.out.println(person.getName());
		}
		try {
			System.out.println("请关闭数据库");
			Thread.sleep(1000*15);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		persons = personService.getPersons();
		for(Person person : persons){
			System.out.println(person.getName());
		}
	}

测试成功

注意:二级缓存是在SessionFactory中生效的,如果SessionFactory关闭后,二级缓存的
数据也随之在内存中结束,因为缓存是基于一个对象的,一级缓存基于Session对象
二级缓存基于SessionFactory对象,如果SessionFactory关闭,那么跟着它的缓存的生命
也将结束 所以这个测试的方法,只能运行一次,如果第二次在关闭数据库的情况下
缓存是不起作用的,会报异常



好了 现在缓存已经配置好了
我们现在来建一个action

package cn.itcast.web;

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

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;

import cn.itcast.bean.Person;
import cn.itcast.formbean.PersonForm;
import cn.itcast.service.PersonService;
/**
    Resource是注解 ,用来依赖注入到这个Action 作为一个属性
*/
	 @Resource PersonService personservice;
	public ActionForward add(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception{
		PersonForm personform=(PersonForm)form;
		personservice.save(new Person(personform.getName()));
		request.setAttribute("message", "保存成功");
		return mapping.findForward("message");
	}
     
}

配置 
<form-beans>
<form-bean name="PersonForm" type="cn.itcast.formbean.PersonForm"/>
</form-beans >
<global-forwards>
<forward name="message" path="/WEB-INF/page/message.jsp"></forward>
</global-forwards>

<action path="/person/pmessage" validate="false" parameter="method" 
scope="request" name="PersonForm"></action>

将当前的action交给spring管理
<bean name="/person/pmessage" class="cn.itcast.web.PersonMessageAction"/>

新建 index.jsp
引入 struts标签
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
在页面中添加一个表单
  <html:form action="/person/pmessage" method="post">
  <html:text property="name"/>
  <html:hidden property="method"  value="add"/>
  <html:submit value="提交 "/>
  </html:form>


现在来建一个message.jsp
 <body>
    ${message }
  </body>


现在在浏览器输入测试
http://localhost:8808/SSH/



Spring2.5+Hibernate3.3+Struts1.3的数据录入乱码解决

在web.xml中加入spring的乱码解决struts1的问题

<filter>
	<filter-name>encoding</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>
<filter-mapping>
	<filter-name>encoding</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>


使用spring解决hibernate因session关闭导致的延迟加载例外问题。

方法 在web.xml中添加

<filter>
        <filter-name>OpenSessionInViewFilter</filter-name>
        <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
        <filter-name>OpenSessionInViewFilter</filter-name>
        <url-pattern>/*</url-pattern>
</filter-mapping>

现在来看完整的web.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
	xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	
	
	<!-- 指定spring的配置文件,默认从web根目录寻找配置文件,我们可以通过spring提供的
	classpath:前缀指定从类路径下寻找 -->
	<context-param>
	   <param-name>contextConfigLocation</param-name>
	   <param-value>classpath:beans.xml</param-value>
	</context-param>
<!-- 对Spring容器进行实例化 -->
<listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- 加入spring的filter 用于乱码解决-->
<filter>
	<filter-name>encoding</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>
<filter-mapping>
	<filter-name>encoding</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 使用spring解决hibernate因session关闭导致的延迟加载例外 -->
<filter>
        <filter-name>OpenSessionInViewFilter</filter-name>
        <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
        <filter-name>OpenSessionInViewFilter</filter-name>
        <url-pattern>/*</url-pattern>
</filter-mapping>

	<!-- 配置struts的web框架-->
<servlet>
<servlet-name>struts</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
 <param-name>config</param-name>
 <param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
	<load-on-startup>0</load-on-startup>
</servlet>

<servlet-mapping>
	<servlet-name>struts</servlet-name>
	<url-pattern>*.do</url-pattern>
</servlet-mapping>
	
	
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
</web-app>


spring的配置文件 beans.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/>
	 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
	    <property name="driverClassName" value="org.gjt.mm.mysql.Driver"/>
	    <property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8"/>
	    <property name="username" value="root"/>
	    <property name="password" value="root"/>
	     <!-- 连接池启动时的初始值 -->
		 <property name="initialSize" value="1"/>
		 <!-- 连接池的最大值 -->
		 <property name="maxActive" value="500"/>
		 <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
		 <property name="maxIdle" value="2"/>
		 <!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
		 <property name="minIdle" value="1"/>
	  </bean>
	  
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
	     <property name="dataSource" ref="dataSource"/>
		 <property name="mappingResources">
		    <list>
		      <value>cn/itcast/bean/Person.hbm.xml</value>
		    </list>
		 </property>
	     <property name="hibernateProperties">
		    <value>
		        hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
		        hibernate.hbm2ddl.auto=update
		        hibernate.show_sql=false
		        hibernate.format_sql=false
		        <!-- 配置二级缓存 -->
		        hibernate.cache.use_second_level_cache=true
		        <!-- 是否使用查询缓存 -->
       	        hibernate.cache.use_query_cache=true
       	        <!-- 配置使用缓存的驱动类 -->
        	    hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider  
		      </value>
	     </property>
	</bean>
	<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
	  	<property name="sessionFactory" ref="sessionFactory"/>
	</bean>
	<!-- 启动事务注解管理方式 -->
	<tx:annotation-driven transaction-manager="txManager"/>
	
	<bean id="personService" class="cn.itcast.service.impl.PersonServiceBean"/>
	<bean name="/person/list" class="cn.itcast.web.PersonAction"/>
	<bean name="/person/pmessage" class="cn.itcast.web.PersonMessageAction"/>
</beans>

缓存配置文件 ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 
    defaultCache节点为缺省的缓存策略
     maxElementsInMemory 内存中最大允许存在的对象数量
     eternal 设置缓存中的对象是否永远不过期
     overflowToDisk 把溢出的对象存放到硬盘上
     timeToIdleSeconds 指定缓存对象空闲多长时间就过期,过期的对象会被清除掉
     timeToLiveSeconds 指定缓存对象总的存活时间
     diskPersistent 当jvm结束是是否持久化对象
     diskExpiryThreadIntervalSeconds 指定专门用于清除过期对象的监听线程的轮询时间
 -->
<ehcache>
    <diskStore path="D:\cache"/>
    <defaultCache  maxElementsInMemory="1000" eternal="false" overflowToDisk="true"
        timeToIdleSeconds="120"
        timeToLiveSeconds="180"
        diskPersistent="false"
        diskExpiryThreadIntervalSeconds="60"/>
	<cache name="cn.itcast.bean.Person" maxElementsInMemory="100" eternal="false"
    overflowToDisk="true" timeToIdleSeconds="300" timeToLiveSeconds="600" diskPersistent="false"/>
</ehcache>

struts-config.xml配置文件 
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
          "http://struts.apache.org/dtds/struts-config_1_3.dtd">
<struts-config>
<form-beans>
<form-bean name="PersonForm" type="cn.itcast.formbean.PersonForm"/>
</form-beans >
<global-forwards>
<forward name="message" path="/WEB-INF/page/message.jsp"></forward>
</global-forwards>

<action-mappings>
<action path="/person/list"  validate="false">
	<forward name="list" path="/WEB-INF/page/personlist.jsp"></forward>
</action>

<action path="/person/pmessage" validate="false" parameter="method" 
scope="request" name="PersonForm"></action>

</action-mappings>

<!-- 配置spring的控制器 -->
<controller>
 <set-property property="processorClass" value="org.springframework.web.struts.DelegatingRequestProcessor"/>
</controller> 
</struts-config>


hibernate的实体beans.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-only" region="cn.itcast.bean.Person"/>
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name" length="10" not-null="true"/>
    </class>
</hibernate-mapping>

 

分享到:
评论

相关推荐

    SSH整合包(S1.3+S2.5+H3.3)

    SSH整合开发包,版本为Struts1.3+Spring2.5+Hibernate3.3

    搞定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 ...

    SpringMVC实战-雇员薪资管理系统

    SpringMVC实战-雇员薪资管理系统,Spring2.5+Hibernate3.3+Struts1.3

    搞定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写的 教务管理系统源代码 学生管理系统源代码

    现在,几乎每个学校都有自己的学生信息管理系统,用来管理庞大的学生信息,如果没有一个有效,快速的计算机系统来...开发框架:Struts2+Hibernate3.3+Spring2.5整合开发 项目报告全文请点击我的用户名:毕业设计报告

    低清版 大型门户网站是这样炼成的.pdf

    (Struts 2+Spring 2+Hibernate 3).pdf(完整版) 网上有高清版350M的。可以去下 http://115.com/file/be5gwid8 请于下载后 24H 内及时删除!请抱着学习的态度下载此资料。 总共900多页!!!!!!! 第1篇 ...

    Spring-Reference_zh_CN(Spring中文参考手册)

    3.3.1.3. 一些例子 3.3.2. 构造器参数的解析 3.3.2.1. 构造器参数类型匹配 3.3.2.2. 构造器参数的索引 3.3.3. bean属性及构造器参数详解 3.3.3.1. 直接量(基本类型、Strings类型等。) 3.3.3.2. 引用其它的bean(协作...

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

    《MyEclipse 6 Java 开发中文教程》前10章

    10.5.2 Hibernate 整合 Spring开发 236 10.5.2.1 创建项目,添加必要的开发功能 236 10.5.2.2 反向工程生成Spring整合Hibernate的DAO 238 10.5.2.3 用Spring 1.2 的事务代理类解决事务提交问题 245 10.5.2.4 用...

    JAVA程序开发大全---上半部分

    以及基于这些技术的商业化应用程序的开发技巧,在讲解过程中以目前最为流行的开发工具MyEclipse为载体,全面系统地介绍了如何在MyEclipse中开发基于Struts、Hibernate、Spring等主流框架的各种Java应用程序。...

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

    中文名: 经典Java EE企业应用实战--基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发 原名: 经典Java EE企业应用实战--基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发 作者: 李刚 资源格式: PDF 版本: 第一版 出版社: 电子...

    《程序天下: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 ...

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

    2.5 使用Spring表达式语言 64 2.5.1 问题 64 2.5.2 解决方案 64 2.5.3 工作原理 65 2.6 设置Bean作用域 69 2.6.1 问题 69 2.6.2 解决方案 69 2.6.3 工作原理 70 2.7 自定义Bean初始化和析构 72 ...

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

    2.5 使用Spring表达式语言 64 2.5.1 问题 64 2.5.2 解决方案 64 2.5.3 工作原理 65 2.6 设置Bean作用域 69 2.6.1 问题 69 2.6.2 解决方案 69 2.6.3 工作原理 70 2.7 自定义Bean初始化和析构 72 ...

    基于SSH架构的在线答疑系统.doc

    1.3 本文的主要研究内容 4 1.4 本文的结构 4 第二章 相关技术介绍 5 2.1 J2EE技术 5 2.2 MyEclipse开发环境 5 2.3 Tomcat应用服务器 6 2.4 MySQL数据库 6 2.5 J2EE平台上的框架分析 7 2.5.1框架的引入 7 2.5.2 ...

Global site tag (gtag.js) - Google Analytics