欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

记录后端之旅:初学S2SH框架,整合struts2、spring、Hibernate三大框架

程序员文章站 2022-07-14 23:50:17
...

整合Struts2、Spring、Hibernate三大框架

本人是一个在广东一所普通二本学校就读的准大三学生,准备开始在博客上记录自己的后端学习之旅,第一篇记录S2SH框架的整合。

先大概的介绍这个小demo,是一个简单的用户注册、登录、查询等的web程序,实体层只有Member,并带有对象所需要的一些属性,用户登录、删除、查询、注册与更新都各自存在于一个action中,大概的项目结构如下图
记录后端之旅:初学S2SH框架,整合struts2、spring、Hibernate三大框架

简要介绍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映射下,基本规律有以下几条

  1. 类与表映射
  2. 表中的行与对象(持久化类的实例)映射
  3. 表中的列与对象的属性映射

普通的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框架集成即可。

暂时就是这样,加油!

相关标签: S2SH