对spring的集成
1,spring和jdbc的组合开发
使用Spring+JDBC集成步骤如下:
//首先配置数据源
<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&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
.....//以下是连接池的配置
</bean>
//配置事务。配置事务时,需要在xml配置文件中引入用于声明事务的tx命名空间。事务的配置方式有两种:注解方式和基于XML配置方式。采用注解方式:
<bean id="txManager " class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource " ref="dataSource"/>
</bean>
<!-- 采用@transactional注解方式使用事务 -->
<tx:annotation-driven transaction-manager="txManager "/>
有些人喜好把数据源的配置信息放在属性文件中,spring提供了获取属性文件内容来配置数据源的方法。
把上面的数据源的配置一一写进属性文件(如:jdbc.properties)中,修改xml配置文件关于数据源的配置部分;
<context:property-placeholder location="jdbc.properties">
<bean id="dataSource " class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="$(driverClassName)" />
<property name="url" value="$(url)"/>
<property name="username" value="$(username)"/>
<property name="password" value="$(password)"/>
.....//以下是连接池的配置
</bean>
在程序中可以使用JdbcTemplate,更好的进行对数据库的操作。
示例:使用JdbcTemplate获取一条记录
@Service @Transactional
public class PersonServiceBean implements PersonService{
private JdbcTemplate jdbcTemplate;
@Resource
public void setDataSource(DataSource dataSource){
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public Person getPerson(Integer id){
RowMapper rowMapper = new RowMapper(){
public Object mapRow(ResultSet rs,int rowNum)throws SQLException{
Person person = new Person();
person.setId(rs.getInt("id"));
person.setName(rs.getString("name"));
return person;
}
};
}
return (Person)jdbcTemplate.queryForObject ("select * from person where id=?",new Object[]{id},new int[]{java.sql.Types.INTEGER},rowMapper );
}
2,spring2.5和hibernate3.3,struts1.3的整合开发
需要引入的jar包:
hibernate核心安装包下的:
hibernate3.jar
lib\required\*.jar
lib\optional\ehcache-1.2.3.jar
hibernate注解安装包下:
lib\test\slf4j-log4j12.jar
spring安装包下的:
dist\spring.jar
dist\modules\spring-webmvc-struts.jar
lib\jakarta-commons\commons-logging.jar,commons-dbcp.jar,commons-pool.jar
lib\aspectj\aspectjweaver.jar,aspectjrt.jar
lib\cglib\cglib-nodep-2.1_3.jar
lib\j2ee\common-annotations.jar
lib\log4j\log4j-1.2.15.jar
struts
下载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冲突。
数据库驱动jar
spring配置文件:
上面的数据源配置不变,hibernate把sessionFacotory交由spring容器管理,所以要在配置文件中指定sessionFacotory的信息。
示例:
//首先配置数据源
<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&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
.....//以下是连接池的配置
</bean>
//hibernate的sessionFacotory的配置
<bean id="sessionFactory " class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource " ref="dataSource "/>
<property name="mappingResources ">
<list>
<value>cn/jianchen/bean/Person.hbm.xml</value>
</list>
</property>
<property name="hibernateProerties ">
<value>
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
hibernate.hbm2dll.auto=update
hibernate.show_sql=true
hibernate.format_sql=false
//以下是对二级缓存的配置
hibernate.cache.use_second_level_cache=true //是否启用二级缓存
hibernate.cache.use_query_cache=false //是否使用查询缓存,因为查询的命中率不高,一般设为false
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 "/>
示例代码:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package cn.jianchen.service.impl; import cn.jianchen.bean.Person; import cn.jianchen.service.PersonService; import java.util.List; import javax.annotation.Resource; import org.hibernate.SessionFactory; import org.springframework.stereotype.Service; @Service("personservicebean") public class PersonServiceBean implements PersonService { @Resource private SessionFactory sessionFactory; //使用注解的依赖注入 public void save(Person person){ sessionFactory.getCurrentSession().persist(person); //调用的sessionFacotory的getCurrentSession方法返回受spring容器管理的session对象,该session 具有事务管理能力。如果调用openSession方法,返回的session不具备事务能力。 } public void update(Person person){ sessionFactory.getCurrentSession().merge(person); //调用update方法,是因为传进来的对象一般为脱管对象。否则受session管理的对象根本不需要调用update。使用merge后,传进来的对象仍是脱管对象。如果使用update对象就成为持久对象了。可以参照前面的hibernate讲解部分。 } public void delete(int personid){ sessionFactory.getCurrentSession().delete(sessionFactory.getCurrentSession().load(Person.class, personid));//删除的是对象,所以可以根据传进来的id先获得对象,使用load方法,懒加载性能更优。 } public List getPersons(){ String hql ="from Person"; List list = sessionFactory.getCurrentSession().createQuery(hql).list(); return list; } }
前面是spring和hibernate的整合,现在再把struts 整合进来。
在web容器中实例化spring容器:
web.xml文件部分配置:
指定spring的配置文件 ,默认从web根目录寻找配置文件,我们可以通过spring提供的classpath:前缀指定从类路径下寻找。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>class: beans.xml</param-value>
</context-param>
对spring容器进行实例化
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
分析:实例化的spring容器会放在ServletContexth中*(作为它的一个属性),也就是说从Application中可以获得该spring容器实例,进而使用spring的功能。
spring给我们提供了一个类,让我们从application范围中获得spring容器实例。示例代码:
如果action没有交给spring容器管理,我们通过下面语句获取spring容器实例
WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(this.getServlet().getServletContext());
在struts配置文件中添加进spring的请求控制器 ,该请求控制器会先根据action的path属性值到spring容器中寻找跟该属性值同名的bean。如果寻找到即使用该bean处理用户请求。配置如下:
<controller>
<set-property property="processorClass" value="org.springframework.web.struts.DelegatingRequestProcessor ">
</controller>
把action交给spring管理后,我们可以使用依赖注入在action中注入业务层的bean。确保action的path属性于bean的名称相同。
如:
<action path="/person/list "...>
</action>
Spring配置:
<bean name="/person/list " class="cn.jianchen.web.action.PersonAction"/>
示意图如下:
分析:根据请求的路径,获取.do的前面部分,作为action的名称。交由请求处理器到spring容器中寻找受管理的相同名字的Action bean。找到后调用该action处理请求。