记录后端之旅:初学S2SH框架,整合struts2、spring、Hibernate三大框架
整合Struts2、Spring、Hibernate三大框架
本人是一个在广东一所普通二本学校就读的准大三学生,准备开始在博客上记录自己的后端学习之旅,第一篇记录S2SH框架的整合。
先大概的介绍这个小demo,是一个简单的用户注册、登录、查询等的web程序,实体层只有Member,并带有对象所需要的一些属性,用户登录、删除、查询、注册与更新都各自存在于一个action中,大概的项目结构如下图
简要介绍Struts2
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求。在需要的情况下,可换成Spring MVC框架代替(同样为MVC设计模式)。
在struts2框架下,明显可以看到,将业务与页面完全分离,靠配置文件struts.xml来控制,有action层即控制层,并且有service业务层,dao数据操纵层,也有entity实体层。
<s:form action="memberLogin" method="post">
<s:textfield name="member.name" label="会员姓名"></s:textfield>
<s:password name="member.password" label="会员口令"></s:password>
<s:submit value="提交"></s:submit>
</s:form>
在jsp页面中,通过form标签中的action属性,指定跳转到哪个action,再由struts.xml来决定跳转至哪个class
<action name="memberLogin" class="memberLoginAction">
<result name="success">/welcome.jsp</result>
<result name="error">/register.jsp</result>
</action>
struts.xml配置文件中,由result属性(是由action返回的字符串),决定下一步的操作
简要介绍Hibernate
Hibernate框架是一个典型的ORM框架,能够很好地解决对象与关系型数据之间的映射问题,并对JDBC进行最大限度的对象封装,使得程序员可以通过面向对象编程思维来操作数据库
在Hibernate的ORM映射下,基本规律有以下几条
- 类与表映射
- 表中的行与对象(持久化类的实例)映射
- 表中的列与对象的属性映射
普通的Hibernate框架需要由Hibernate.cfg.xml配置文件,但是通过与spring框架的整合,采用注入的方式,所以在这里没有这个配置文件,下面会详细的介绍解释
简要介绍Spring
在Spring框架中,主要的是IoC与AOP技术,前者是控制反转,后者是面向切面编程。简而言之,Spring是一个轻量级的容器框架,可以与其它框架进行无缝的整合。其中BeanFactory接口是Spring框架的核心接口,实现了容器的许多核心功能。
Spring框架主要的配置文件是applicationContext.xml文件,在该文件中采用bean标签,配置各个bean,并可以通过注入依赖的方式,将甲bean注入到乙bean中。具体介绍在下面的整合部分。
整合S2SH三大框架
1、 Spring集成Struts2
在整合三大框架之前,最好先一个个搭建好,再来整合,防止整合中出的错很复杂很难找出原因,下面第一步是Spring集成Struts2。
使用Struts2框架时,在Action中需要使用业务对象完成具体的业务逻辑,而Action的实例是由Struts2框架再获得请求时创建的,无法通过Spring的IoC注入业务对象。因此!!Spring与Struts2集成的关键在于如何由Spring框架完成创建Action实例的工作。
在此需要导入一个jar包,struts2-spring-plugin.jar包。
1.编写业务类和Action等代码
2.配置web.xml
web.xml中需要配置Spring的ContextLoaderListener
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
Spring提供了ContextLoaderListener,该监听器实现了ServletContextListener接口,他在Web应用程序启动时被触发。
当他创建时会自动查找WEB-INF/下的applicationContext.xml,所以当只有一个配置文件且文件名为applicationContext.xml时,则只需要在web.xml文件中配置ContextLoaderListener监听器即可.当有多个配置文件需要载入,则应该使用元素指定配置文件的文件名,ContextLoaderListener加载时,会查找名为contextConfigLocation的初始化参数。当Web应用程序启动时先读取web.xml文件,然后创建spring容器,之后根据配置文件内容,装配Bean实例。
3.配置Spring
在applicationContext.xml配置文件中,需要将每个action、dao、service等都配置成Bean,在每个Bean中可以注入其他的Bean。配置代码如下所示
<bean id="memberService" class="com.service.MemberServiceImpl">
<!-- 设值注入DAO组件 -->
<property name="memberDao" ref="memberDao"></property>
</bean>
<bean id="memberRegisterAction" class="com.action.MemberRegisterAction">
<!-- 设值注入业务逻辑组件 -->
<property name="memberService" ref="memberService"></property>
</bean>
4.配置Struts2
在Struts2的配置文件中,需要配置每个Action,但是其class属性值不再是完整的类名,而是对应的Spring配置文件中的Bean的id,其class值为该Bean的class值。
<action name="memberLogin" class="memberLoginAction">
<result name="success">/welcome.jsp</result>
<result name="error">/register.jsp</result>
</action>
必须注意的是,需要加上下面这一句,使得Struts2的action由Spring来负责进行实例化
<constant name="struts.objectFactory" value="spring"></constant>
2、Spring集成Hibernate
Spring对主流的ORM框架都提供了支持,其中包含了Hibernate框架,在使用Hibernate框架时,数据库的操作都是通过Session对象完成的,而Session对象需要通过其SessionFactory对象创建。
所以在Spring的集成下,将SessionFactory对象配置成一个Bean,然后注入到各个需要进行数据库操作的Dao的Bean中。
第一步:编写实体类及其映射文件
第二步:编写Dao类,Dao类需要有SessionFactory对象,并在构造函数中赋值该对象,因为在applicationContext.xml配置文件中,是通过构造函数方式注入该Bean的
private SessionFactory sessionFactory;
public MemberDAOImpl(SessionFactory sessionFactory) {
this.sessionFactory=sessionFactory;
}
public Session currentSession(){
return sessionFactory.openSession();
}
第三步:编写业务类
第四步:Spring配置文件中配置数据源与SessionFactory
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/SSHTest"/>
<property name="user" value="root"/>
<property name="password" value="root"/>
<property name="maxPoolSize" value="40"/>
<property name="minPoolSize" value="1"/>
<property name="initialPoolSize" value="2"/>
<property name="maxIdleTime" value="20"/>
</bean>
spring 框架提供了多种数据源类,可以使用spring提供的DriverManagerDataSource类还可以使用第三方数据源,如C3P0的ComboPooledDataSource数据源类,注意相应的两个jar包c3p0-0.9.2.1.jar、mchange-commons-java-0.2.3.4.jar。
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mappingResources">
<list>
<value>com/entity/Member.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.temp.use_jdbc_metadata_defaults">false</prop>
<prop key="hibernate.current_session_context_class">
org.springframework.orm.hibernate4.SpringSessionContext
</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
</props>
</property>
</bean>
3、Spring、Struts2、Hibernate整合
其实S2SH三大框架整合,即是按照前面两步,分别将Struts2、Hibernate与Spring框架集成即可。
暂时就是这样,加油!