1 目标
1. 熟练掌握Struts、Spring、Hibernate集成开发
2. 完成Struts、Hibernate强化训练项目的改版升级工作。
2 要求
1. 必须按要求对工程,包,类,方法命名。
2. 沿用struts、Hibernate强化训练工程要关资源。
3. 将项目改版到SSH。
4. 开发工具使用Eclipse3.2+Myeclipse5.5
3 作业
3.1 建立SSH开发基础环境(重要部分)
1、 在原有项目中导入Spring2.0相关的Jar包。
2、 删除项目中的所有Jar包,将“附件/SSH相关的Jar包”目录中的所有jar包复制到工程的WEB-INF/lib目录下。
3、 导入DBCP数据库连接池Jar包。
4、 将附件文件夹中的log4j.properties配置文件加入到resources目录中。
3.2 Hibernate与Spring集成
3.2.1 Hibernate基础配置
1、 将src目录下的applicationContext.xml,移动到resources源文件夹并改名为applicationContextSessionFactory.xml。
2、 在resources源文件夹中,新建applicationContextDao.xml文件。
3、 在配置文件applicationContextSessionFactory.xml中配置ID为“dataSource”的数据源
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName"
value="com.microsoft.jdbc.sqlserver.SQLServerDriver"/>
<property name="url" value="jdbc:Microsoft:sqlserver://localhost:1433;databaseName=shopping;SelectMethod=cursor"/>
<property name="username" value="sa"/>
<property name="password" value=""/>
</bean>
4、 在配置文件applicationContextSessionFactory.xml中配置SessionFactory。
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mappingDirectoryLocations">
<list>
<!-- 配置基础业务组件-->
<value>classpath:/com/newer/business/pojo/hbm/</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.SQLServerDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
3.2.2 开发测试基类BaseSpringTest
1、 BaseSpringTest存放于test源文件夹中。
2、 类全名为com.newer.business.spring.BaseSpringTest。
3、 编写getBeanFactory方法,实现将配文件
applicationContextSessionFactory.xml、applicationContextDao.xml,实例化为ClassPathXmlApplicationContext工厂。
/**
* 测试基类
* @author 杨柯
*/
public class BaseSpringTest {
public BeanFactory getBeanFactory(){
return new ClassPathXmlApplicationContext(
new String[]{"applicationContextSessionFactory.xml",
"applicationContextDao.xml"});
}
}
4、 编写子类TestHiberateSessionFactory,继承于BaseSpringTest。
5、 TestHiberateSessionFactory在测试类中编写testSessionFactory方法,在此方法中通过父类的getBeanFactory方法来取得BeanFactory,从而获取SessionFactory进行测试。示例代码如下:
public class TestHibernateSessionFactory
extends BaseSpringTest {
public void testSessionFactory(){
BeanFactory factory=this.getBeanFactory();
SessionFactory sessionFactory=(SessionFactory)
factory.getBean("sessionFactory");
Session session=sessionFactory.openSession();
System.out.println(session);
}
}
3.2.3 利用Spring的AOP配置Hibernate事务管理机制
1、 在applicationContextDao.xml文件中加入Hibernate事务管理器配置。
<bean id="myHibTransactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
2、 在applicationContextDao.xml文件中加入事务代理工厂类配置
<bean id="baseTransProxy" abstract="true"
class=" org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="myHibTransactionManager" />
<property name="proxyTargetClass" value="true"/>
<property name="transactionAttributes">
<props>
<prop key="add*">PROPAGATION_REQUIRED</prop>
<prop key=" del *">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="do*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
3.2.4 开发用户管理数据访问组件
1、 在com.newer.businses.dao包中新建UserDao类,继承于
HibernateDaoSupport。
2、 利用HibernateDaoSupport 提供的hibernateTemplate 编写以下方法
方法名 | 作用 |
add(User user) | 用户注册方法 |
login(String username,String passwork) | 用户登录业务处理 |
delete(long userid) | 删除用户信息 |
3、 将UserDao加入到applicationContextDao.xml配置中。
<bean id="userDaoTarget" class="com.newer.business.dao.UserDao">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
4、 对上边配置的userDaoTarget类进行事务代理。
<bean id="userDao" parent="baseTransProxy">
<property name="target" ref="userDaoTarget" />
</bean>
5、 在test源文件夹中编写子类TestUserDao,继承于BaseSpringTest,对前面第4步开发的userDao中的add、login、delete方法进行测试。
3.3 将Spring与WEB层集成
3.3.1 底层数据访问组件与WEB层集成
1、 将数据访问组件配置到web.xml中,启动底层基础Spring容器,配置如下:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContextSessionFactory.xml,
classpath:applicationContextDao.xml
</param-value>
</context-param>
<!-- 加载与业务有关的底层配 -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
2、 在web.xml中去掉关于启动与关闭HiberanteSessionFactory配置,Hiberante配置由Spring的BeanFactory负责启动。
<listener>
<listener-class>
com.newer.business.web.listener.ContextLoadHibernateSessionListener
</listener-class>
</listener>
3、 将web.xml中置配的OpenSessionInView过滤器删除。
<filter>
<filter-name>openHibernateSessionFilter</filter-name>
<filter-class>
com.newer.business.web.filter.OpenHibernateSessionFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>openHibernateSessionFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
4、 在web.xml中加入Spring提供的OpenSessionInView过滤器。
<filter>
<filter-name>openSession</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>openSession</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
5、 修改Struts强化训练中开发的LoginAction代码,改变数据访问Dao调用方式为从web.xml配置的Spring BeanFactory中获取。
WebApplicationContext context=WebApplicationContextUtils
.getWebApplicationContext(request.getSession().getServletContext());
UserDao userDao=(UserDao)context.getBean("userDao");
User user=userDao.login(userName, passWord);
6、 启动WEB工程,进行登录测试。
3.3.2 将Struts的Action交Spring容器托管
1、 在WEB-INF文件夹下新建下Spring的配置文件,文件名为spring-config.xml。
2、 修改LoginAction类加入如下代码,为注入UserDao提供set方法。
public class LoginAction extends Action {
protected UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
3、 在spring-config.xml中加入LoginAction的配置,并为LoginAction注入userDao
<bean name="/login"
class="com.newer.struts.action.UserAction">
<property name="userDao">
<ref bean="userDao" />
</property>
</bean>
注意:
结点中name的属性值”/login”与struts配置文件中action结点的path的值相同。
4、 在struts-config.xml中加入ContextLoaderPlugIn插件,启动新的Spring ApplicationContext专用来管理Struts的Action类。
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/spring-config.xml"/>
</plug-in>
5、 覆盖Struts的RequestProcessor。
<controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor">
6、 启动WEB服务器,测试登录。
3.3.3 进一步改版商品管理业务模块
1、 按 3.2.4 的步骤,修改商品管理相关的其它Dao类,并加入到配置文件applicationContextDao.xml中。
2、 在WEB-INF/config文件夹下新建下Spring的配置文件,文件名为spring-config-product.xml。请注意文件的命名规则与struts多模块命名在规则相似,文件存放的位置与struts配置文件路径保持一至。
3、 按 3.3.2 的第二小步改写相应的Action类。
4、 按 3.3.2 的第三小步将本业务模块相对应的Acton类配置写入到
spring-config-product.xml文件中,配置如下:
<bean name="/product/productservice"
class="com.newer.business.web.action.product.ProductManagerAction">
......
</bean>
注意:
结点中name的属性值”/product/productservice”与struts配置文件中action结点的path的值”/productservice”不相同,多出的”/product”部分正好为本业务模块在Struts中配置的模块名称。
5、 按 3.3.2 的第二、三小步配置,将本模块的Action交Spring托管。
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/config/spring-config-product.xml"/>
</plug-in>
<controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor">
6、 启动WEB服务器,测试相应的功能,直至所有的业务改版完成。
3.4 SSH集成总结
前面的训练过程,我们建立的ApplicationContext容器型成了如下的结构。
1、 我们在web.xml中配置的Spring容器即是1对应的ApplactionContext。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContextSessionFactory.xml,
classpath:applicationContextDao.xml
</param-value>
</context-param>
<!-- 加载与业务有关的底层配 -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
2、 2、3、4等对应的ApplactionContext,则是在各个Struts模块中配置ContextLoaderPlugIn的Plugin。
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/spring-config.xml"/>
</plug-in>
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/spring-config.xml"/>
</plug-in>
3、 当请求某个业务模块的Action类时,Struts会从当前模块的Spring容器中查找相应的Action类。
4、 当Action类需要Dao类进行数据访问时,会在当前的Spring容器中找查,如查没有找到,则会自动到父级的Spring容器中查找即web.xml中查找。这样的情况使得基础的数据访问可以被各个业务模块共享。
---------------判断用户登陆,创建一个基类BaseAction
public abstract class BaseAction extends DispatchAction {
public static String USER_IN_SESSION="user_in_session";
public String getUser(HttpServletRequest request){
String userName=(String)request.getSession().getAttribute(USER_IN_SESSION);
return userName;
}
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
String userName=getUser(request);
if(userName==null||"".equals(userName)){
return new ActionForward("login");
}
return super.execute(mapping, form, request, response);
}
public Session getHibernateSession(HttpServletRequest request){
return (Session)request.getAttribute(OpenHibernateSessionInView.HIBERNATE_SESSIN_KEY);
}
}