一、配置
环境:spring-framework-2.0-rc3 Eclipse-3.2.1 tomcat-5.0.28
1.准备:
由于MyEclipse5.1还是spring1.2,所以我只使用了MyEclipse中的一般配置,当加入Spring支持后,删除MyEclise中有关Spring的构建路径的引用,添加自己的用户库,如:Spring-2.0。将spring中所有的jar文件都添加到这个用户库中,由于spring.jar并没有将所有组件都打到包内,对于初学者来说的话将spring-framework-2.0-rc3/dist/modules和spring-framework-2.0-rc3/lib里的包都加入到用户库中。(例外:删除了commons-attributes-api.jar和commons-attributes-compiler.jar两个包,原因是这两个包需要的东西我没有找到,至今没有发现有什么影响)
将applicationContext.xml、log4j.properties、jdbc.properties放在WEB-INF里
将hibernate-mapping.hbm.xml、放在src里
注意:要将数据库连接所需的包加入Eclipse的构建路径里。
2.配置web.xml,添加如入代码
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.util.Log4jConfigListener
</listener-class>
</listener>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.util.Log4jConfigListener
</listener-class>
</listener>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
以上代码实现context的自动加载
3.配置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"
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<beans xmlns=" http://www.springframework.org/schema/beans"
xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
说明:Spring的文档中为
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd,系统没有找到配置。而spring-beans.jar包中的spring.schemas文件中给定的映射不是
spring-beans-2.0.xsd,而是spring-beans.xsd
第二,添加如下内容:
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="/WEB-INF/jdbc.properties" />
</bean>
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="/WEB-INF/jdbc.properties" />
</bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<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>
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<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>
<!-- JNDI DataSource for J2EE environments -->
<!--
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/petclinic"/>
</bean>
-->
<!--
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/petclinic"/>
</bean>
-->
<!-- Hibernate SessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mappingResources">
<value>hibernate-mapping.hbm.xml</value>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
${hibernate.dialect}
</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.generate_statistics">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
<property name="eventListeners">
<map>
<entry key="merge">
<bean
class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener" />
</entry>
</map>
</property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mappingResources">
<value>hibernate-mapping.hbm.xml</value>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
${hibernate.dialect}
</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.generate_statistics">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
<property name="eventListeners">
<map>
<entry key="merge">
<bean
class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener" />
</entry>
</map>
</property>
</bean>
<!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
以上配置复制自spring自带的例子petclinic的配置文件
4.配置hibernate-mapping.hbm.xml
在hibernate-mapping.hbm.xml配置hibernate的映射关系
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
" http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping auto-import="true" default-lazy="false">
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
" http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping auto-import="true" default-lazy="false">
<class name="User" table="TEST_USER">
<id name="id" column="ID_">
<generator class="native" />
</id>
<property name="name" column="NAME_" />
</class>
</hibernate-mapping>
<id name="id" column="ID_">
<generator class="native" />
</id>
<property name="name" column="NAME_" />
</class>
</hibernate-mapping>
5.整合struts
(1)为了在Struts中加载Spring Context,在 struts-config.xml中增加如下部分:
<struts-config>
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" />
</plug-in>
</struts-config>
<struts-config>
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" />
</plug-in>
</struts-config>
(2)通过plug-in我们实现了Spring Context的加载,不过仅仅加载 Context并没有什么实际
意义,我们还需要修改配置,将Struts Action交给 Spring容器进行管理,如下:
意义,我们还需要修改配置,将Struts Action交给 Spring容器进行管理,如下:
<action path="/login" type="org.springframework.web.struts.DelegatingActionProxy" name="loginForm">
(3)在applicatinContext.xml里添加bean
<bean name="/login" class="net.xiaxin.action.LoginAction"
singleton="false">
<property name="userDAO">
<ref bean="userDAOProxy" />
</property>
</bean>
singleton="false">
<property name="userDAO">
<ref bean="userDAOProxy" />
</property>
</bean>
附录:
1.jdbc.properties
# Properties file with JDBC-related settings.
# Applied by PropertyPlaceholderConfigurer from "applicationContext-*.xml".
# Targeted at system administrators, to avoid touching the context XML files.
# Applied by PropertyPlaceholderConfigurer from "applicationContext-*.xml".
# Targeted at system administrators, to avoid touching the context XML files.
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
#jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:ROYORA
#jdbc.url=jdbc:mysql://localhost:3306/petclinic
jdbc.username=
#jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:ROYORA
#jdbc.url=jdbc:mysql://localhost:3306/petclinic
jdbc.username=
jdbc.password=
# Property that determines the Hibernate dialect
# (only applied with "applicationContext-hibernate.xml")
hibernate.dialect=org.hibernate.dialect.Oracle9Dialect
#hibernate.dialect=org.hibernate.dialect.MySQLDialect
# (only applied with "applicationContext-hibernate.xml")
hibernate.dialect=org.hibernate.dialect.Oracle9Dialect
#hibernate.dialect=org.hibernate.dialect.MySQLDialect
# Property that determines the JDBC implementation of Clinic
# (only applied with "applicationContext-jdbc.xml")
#petclinic.jdbcImplBeanName=hsqlClinic
#petclinic.jdbcImplBeanName=mysqlClinic
# (only applied with "applicationContext-jdbc.xml")
#petclinic.jdbcImplBeanName=hsqlClinic
#petclinic.jdbcImplBeanName=mysqlClinic
# Note that OJB expects the database platform to be set in
# "OJB-repository.xml" (jdbc-connection-descriptor platform).
# "OJB-repository.xml" (jdbc-connection-descriptor platform).
2.log4j.properties
# Set root logger level to DEBUG and its only appender to CONSOLE.
log4j.rootLogger=DEBUG, CONSOLE
log4j.rootLogger=DEBUG, CONSOLE
# CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{HH:mm:ss,SSS} [%t] %-5p %C{1} : %m%n
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{HH:mm:ss,SSS} [%t] %-5p %C{1} : %m%n
# LIMIT CATEGORIES
log4j.logger.org.jbpm=DEBUG
#log4j.logger.org.jbpm.graph=DEBUG
log4j.logger.org.jbpm=DEBUG
#log4j.logger.org.jbpm.graph=DEBUG
# Hibernate debugging levels and their output
log4j.logger.org.hibernate=INFO
#Log all SQL DML statements as they are executed
#log4j.logger.org.hibernate.SQL=DEBUG
#Log all JDBC parameters
#log4j.logger.org.hibernate.type=DEBUG
#Log all SQL DDL statements as they are executed
#log4j.logger.org.hibernate.tool.hbm2ddl=DEBUG
#Log the state of all entities (max 20 entities) associated with the session at flush time
#log4j.logger.org.hibernate.pretty=DEBUG
#Log all second-level cache activity
#log4j.logger.org.hibernate.cache=DEBUG
#Log transaction related activity
#log4j.logger.org.hibernate.transaction=DEBUG
#Log all JDBC resource acquisition
#log4j.logger.org.hibernate.jdbc=TRACE
#Log HQL and SQL ASTs and other information about query parsing
#log4j.logger.org.hibernate.hql.ast=DEBUG
#Log all JAAS authorization requests
#log4j.logger.org.hibernate.secure=DEBUG
#Log everything (a lot of information, but very useful for troubleshooting)
#log4j.logger.org.hibernate=DEBUG
#log4j.logger.org.hibernate.tools=DEBUG
log4j.logger.org.hibernate=INFO
#Log all SQL DML statements as they are executed
#log4j.logger.org.hibernate.SQL=DEBUG
#Log all JDBC parameters
#log4j.logger.org.hibernate.type=DEBUG
#Log all SQL DDL statements as they are executed
#log4j.logger.org.hibernate.tool.hbm2ddl=DEBUG
#Log the state of all entities (max 20 entities) associated with the session at flush time
#log4j.logger.org.hibernate.pretty=DEBUG
#Log all second-level cache activity
#log4j.logger.org.hibernate.cache=DEBUG
#Log transaction related activity
#log4j.logger.org.hibernate.transaction=DEBUG
#Log all JDBC resource acquisition
#log4j.logger.org.hibernate.jdbc=TRACE
#Log HQL and SQL ASTs and other information about query parsing
#log4j.logger.org.hibernate.hql.ast=DEBUG
#Log all JAAS authorization requests
#log4j.logger.org.hibernate.secure=DEBUG
#Log everything (a lot of information, but very useful for troubleshooting)
#log4j.logger.org.hibernate=DEBUG
#log4j.logger.org.hibernate.tools=DEBUG
log4j.logger.net.sf.ehcache=INFO
二、创建Web应用程序
1.配置applicationContext
<bean id="userService"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref local="userTarget" />
</property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<bean id="userTarget" class="mtn.hqzh.service.spring.UserService">
<property name="userDAO">
<ref local="userDAO" />
</property>
</bean>
<bean id="userDAO" class="mtn.hqzh.service.dao.hibernate.UserDAO">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
2.几个类和接口
(1) UserDAO类:实现持久层的数据库操作,UserDAO类实现IUserDAO接口,继承HibernateDaoSurpport类;
(2) UserService类:处于业务逻辑层,通过IUserDAO访问数据。UserService类实现IUserService接口,在UserService类中定义IUserDAO属性;
(3) 在Web应用中,通过Spring获得userService代理类,然后进行数据的操作
a.IUserDAO接口
public interface IUserDAO {
public abstract User getUserById(final long id);
public abstract User getUserById(final long id);
public abstract void saveUser(final User user);
public abstract List getUsers();
public abstract List getUsers();
}
b.IUserService 接口
public interface IUserService {
public abstract void saveUser(User user);
public abstract void saveUser(User user);
public abstract List getUsers();
public abstract User findUserById(long id);
public abstract IUserDAO getUserDAO();
public abstract void setUserDAO(IUserDAO userDAO);
}
c.UserDAO类
public class UserDAO extends HibernateDaoSupport implements IUserDAO {
public UserDAO() {
super();
}
super();
}
public User getUserById(long id) {
return (User) this.getHibernateTemplate().get(User.class, id);
}
}
public void save(User user) {
this.getHibernateTemplate().save(user);
}
this.getHibernateTemplate().save(user);
}
public void saveUser(User user) {
this.getHibernateTemplate().save(user);
}
this.getHibernateTemplate().save(user);
}
public List getUsers() {
return this.getHibernateTemplate().find("from User u order by u.id");
}
}
}
d.UserService类
public class UserService implements IUserService {
private IUserDAO userDAO;
public UserService() {
super();
}
super();
}
public User findUserById(long id) {
return userDAO.getUserById(id);
}
return userDAO.getUserById(id);
}
public IUserDAO getUserDAO() {
return this.userDAO;
}
return this.userDAO;
}
public List getUsers() {
return userDAO.getUsers();
}
return userDAO.getUsers();
}
public void saveUser(User user) {
userDAO.saveUser(user);
}
userDAO.saveUser(user);
}
public void setUserDAO(IUserDAO userDAO) {
this.userDAO = userDAO;
this.userDAO = userDAO;
}
}
3.与Struts集成
创建BaseAction,代码如下:
public abstract class BaseAction extends DispatchAction {
private IUserService userService;
private IUserService userService;
public void setServlet(ActionServlet actionServlet) {
super.setServlet(actionServlet);
ServletContext servletContext = actionServlet.getServletContext();
WebApplicationContext wac =
WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
this.userService = (IUserService) wac.getBean("userService");
}
super.setServlet(actionServlet);
ServletContext servletContext = actionServlet.getServletContext();
WebApplicationContext wac =
WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
this.userService = (IUserService) wac.getBean("userService");
}
public IUserService getUserService() {
return userService;
}
return userService;
}
}
Struts中的Action继承这个BaseAction,代码如下:
public class UserAction extends BaseAction {
public ActionForward list(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
UserForm theForm = (UserForm) form;
theForm.setUsers(this.getUserService().getUsers());
return mapping.findForward("index");
}
}
public ActionForward list(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
UserForm theForm = (UserForm) form;
theForm.setUsers(this.getUserService().getUsers());
return mapping.findForward("index");
}
}