Struts2和Hibernate是两个独立的框架,由于Spring提供了对象管理,切面编程等非常实用的功能,如果进行整合,将Struts2和Hibernate的对象交给Spring容器进行解耦合管理,不仅能大大增强系统的灵活性,便于功能的扩展,还能通过Spring提供的服务简化编码,减少开发工作量,提高开发效率。(需要注意的是:因为版本问题而引发的小问题不少,所以我们所采取的版本和所使用的类版本需要一致,这里我使用的是Spring-3.2,Struts2-2.3,Hibernate3,使用的数据库是oracle)
首先,在Spring配置文件中实现SessionFactory Bean
的定义:
方式一:导入hibernate配置文件
可以使用Spring提供的LocalSessionFactoryBean
,通过configLocation
属性为其指定Hibernate配置文件的位置。
实例代码如下:
<!-Spring头文件信息省略-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml<value>
property>
bean>
方式二:可以将Hibernate的配置信息编写在Spring配置文件中,可以省去独立的Hibernate配置文件,有利于配置信息的集中处理。使用的是LocalSessionFactoryBean的子类:AnnotationSessionFactoryBean
,这里我所配置的数据源是dbcp数据源,需要在项目添加commons-dbcp-1.4.jar和commons-pool-1.6.jar两个文件(具体的jar包就不放在这里了)
实例代码如下:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
<property name="username" value="数据库用户名"/>
<property name="password" value="数据库密码"/>
bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.Oracle10gDialect
prop>
<prop key="hibernate.show_sql">trueprop>
<prop key="hibernate.format_sql">trueprop>
props>
property>
<property name="mappingDirectoryLocations">
<list>
<value>classpath:cn/cyan/entityvalue>
list>
property>
bean>
其次,使用Spring提供的模板类:HibernateTemplate来简化Hibernate DAO,为登录功能的实现简化了大量的编码过程
DAO的实现类需要继承Spring提供的HibernateDaoSupport
类,该基类会提供setSessionFactory()方法,当通过这个setter方法注入SessionFactory Bean时,会自动创建HibernateTemplate实例,这样就可以直接使用getHibernateTemplate()
方法了。
实例代码如下
//UserDao
public interface UserDao{
//登录
public List<User> login(String username,String password);
}
//UserDaoImpl:UserDao实现类/
public class UserDaoImpl extends HibernateDaoSupport implements UserDao{
@Override
public List<User> login(String username,String password){
String hql = "from User where username=? and password = ?";
return this.getHibernateTemplate().find(hql,username,password);
}
}
Spring配置文件中也需要进行对Dao的配置
示例代码如下:
<bean id="userDao" class="cn.cyan.entity.UserDaoImpl">
<property name="sessionFactory" ref="sessionFactory"/>
bean>
然后,编写业务层并添加事务
在Spring配置文件中编写事务:首先需要导入两个命名空间:tx和aop
配置事务管理器对象
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED"/>
tx:attributes>
tx:advice>
<aop:config>
<aop:pointcut id="pointcut" expression="execution(* cn.bdqn.biz..*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
aop:config>
还需要添加业务层,实例代码如下:
//UserBiz业务类
public interface UserBiz{
public List<User> login(String username,String password) throws Exception;
}
//UserBizImpl业务实现类
public class UserBizImpl implements UserBiz{
private UserDao userDao;
//封装
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
public UserDao getUserDao(){
return userDao;
}
@Override
public List<User> login(String username,String password){
User user = null; //新建实体类对象
List<User> userList = userDao.login(username,password);
Iterator<User> it = userList.iterator();
if(it.hasNext()){
user = it.next();
}
return user;
}
}
Spring配置文件中也需要进行对业务类的配置
示例代码如下:
<bean id="userBiz" class="cn.cyan.entity.UserBizImpl">
<property name="userDao" ref="userDao"/>
bean>
为了更好的利用Spring提供的IoC特性实现依赖注入,我们通常希望将Action,拦截器等Struts2框架的核心对象交给Struts2创建和处理,而将Action所依赖的业务对象交由Spring来管理,前面的配置已经将业务对象的创建和管理交给了Spring,而现在我们需要实现的就是在Struts2创建Action对象时,为其注入Spring管理的业务对象,从而达到整合Struts2和Spring的目的,因为Struts2在设计的时候就已将考虑过河Spring的整合问题,并且给出了解决方法,那就是为我们的项目加入一个jar包:struts2-spring-plugin-2.3.16.3.jar(因为这里用到的Struts2是2.3版本,jar包的版本也要相对应),这里有个需要注意的问题:Struts2提供的整合插件默认情况下会使用按名称匹配的方式来为Action自动注入业务Bean,所以在Action中创建的业务类实例的setter()方法需要和Spring中的相匹配
来做个总结版:在默认条件下实现Struts2和Spring的整合,只需要两个步骤:
现在来创建视图控制层Action类,实现用户登录
//Action类
public class UserLoginAction extends ActionSupport{
private String username;
private String password;
private UserBiz userBiz;
//登录
public String login(){
try{
User user = userBiz.login(username,password);
if(user != null){
System.out.println("登录成功!");
Map session = ActionContext.getContext().getSession();
session.put("user",user);
return SUCCESS;
}else{
return ERROR;
}
}catch(Exception e){
e.printStackTrance();
return ERROR;
}
}
//注意userBiz的setter方法要和Spring配置文件中的业务Bean的名称相匹配
//省略getter,setter方法
}
struts.xml文件中的相关配置
<action name="userAction" class="cn.cyan.action.UserLoginAction">
<result name="success">loginsuccess.jspresult>
<result name="error">loginerror.jspresult>
<result name="input">login.jspresult>
action>
最后,进行jsp页面的一个创建
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="userAction" method="post">
用户名:<input type="text" name="username"><s:fielderror fieldName="ename"/><br>
密码:<input type="password" name="password"><s:fielderror fieldName="epwd"/><br>
<input type="submit" value="登录">
</form>
</body>
</html>
我们需要在项目中的web.xml进行最后的一个关于SSH框架的配置
配置ContextLoaderListener
Spring需要启动容器才能为其他框架提供服务,所以我们需要配置一个监听器。实例代码如下:
<context-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:applicationContext.xmlparam-value>
context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
listener>
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListenerlistener-class>
listener>
配置OpenSessionInViewFilter
是一个过滤器,其作用是把一个Hibernate Session
和一次完整的请求过程绑定,从请求开始时开启Session,请求结束时再关闭Session,这使得在一次请求的周期内,所使用的Session是唯一的,且一直保持着开启,解决了延迟加载等问题。是一个标准的Servlet Filter。
实例代码如下:
<filter>
<filter-name>openSessionInViewfilter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilterfilter-class>
filter>
<filter-mapping>
<filter-name>openSessionInViewfilter-name>
<url-pattern>*.actionurl-pattern>
filter-mapping>
struts2的配置
<filter>
<filter-name>strutsfilter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilterfilter-class>
filter>
<filter-mapping>
<filter-name>strutsfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
好啦,关于SSH框架的基础搭建到这里就差不多了,加上tomcat运行到浏览器中,登录功能也差不多了,可以稳定的运行,并且性能良好,需要的jar包和提到的jar包就不在这里提了,一定要注意jar包是否被使用,因为idea这个软件的缓存功能非常强大,如果实在不行可以reBuild解决或者重新加入jar包。(个人经验)
关于SSH框架,Struts2主持交互,Hibernate负责的是数据持久化,Spring管理组件之间的依赖关系并提供事务管理等服务。是一个好的企业级开发架构。
有什么不足或者是描述错误的地方欢迎指正,谢谢大家指教和点赞!