SSH搭建

来源:互联网 发布:明治天皇 知乎 编辑:程序博客网 时间:2024/05/21 12:23

前言

SSH分别代表Struts,Spring,Hibernate.

Struts用来响应用户的action,对应到相应的类进行处理。需要struts对应的包。

hibernate:用来把实体类对应到数据库。提供增删改查的基本操作实现。需要hibernate对应的包以及mysql的jdbc驱动包。

spring:

  • 管理struts:在xml配置文件中为struts的action进行值注入。
  • 管理hibernate:在xml配置文件中配置hibernate的配置信息(dataSource,sessionFactory),即不需要原来的hibernate的xml文件。为hibernate的dao操作注入sessionfactory属性值。

Spring整合Struts2

Spring容器创建

首先需要创建Spring容器,在web应用中创建spring容器有两种方式:

  • 直接在web.xml文件中配置spring
  • 利用第三方MVC框架的扩展点,创建Spring容器。

第一种方法最常见,为了让Spring容器随web应用的启动而启动,需要借助ServletContextListener监听器完成,该监听器在web应用启动时回调自定义方法来启动spring容器。

spring提供ContextLoaderListener监听类,该类实现ServletContextListener接口,在创建时自动查找WEB-INF下的applicationContext.xml配置文件。

如果只有一个配置文件,在web.xml里如下添加配置代码:

<listener>  <listener-class>   org.springframework.web.context.ContextLoaderListener  </listener-class> </listener>

如需要指定多个配置文件,或更改配置文件路径,需使用

Spring工厂模式

web应用中,用户请求向控制器发送,控制器拦截到用户请求后,需要调用业务逻辑组件来处理用户请求。而控制器该如何获取业务逻辑组件呢?

过去的策略是,直接通过new关键字创建业务逻辑组件,然后调用逻辑组件的方法,通过其返回值确定结果。这样做降低了代码耦合性,并由于控制器创建组件,会造成控制器与业务逻辑组件分工不明,等。

现在,我们采用工厂模式。将控制器与业务逻辑组件分开,由Spring担任工厂,负责业务逻辑组件的创建与生产。控制器只从spring中获取业务组件。

控制器访问Spring容器中业务逻辑组件的两种策略:

  • Spring容器负责管理控制器Action,并利用依赖注入为控制器注入业务逻辑组件。
  • 利用Spring的自动装配,Action自动从Spring容器中获取所需的业务逻辑组件。

下面分别介绍两种策略:

1.Spring管理控制器

在这之前,我们需要现在web.xml中配置一下Struts2:

 <!-- STR1.定义Struts2核心Filter,说明使用struts过滤器拦截web请求,默认查找src下的struts.xml配置文件 --> <filter>  <filter-name>struts2</filter-name>  <filter-class>   org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter  </filter-class>  <!--  下面的配置信息用来说明:程序中运行的action放置在哪个包下面,对于list.action的请求,它会自动在这个包下面寻找ListAction.class的类  如果没有这句话,那么所有的action请求只能在struts.xml中进行配置。    -->  <!-- <init-param>   <param-name>actionPackages</param-name>   <param-value>    com.action   </param-value>  </init-param>--> </filter>   <!--  STR2.下面的配置表示对于所有请求都交给struts来处理。 --> <filter-mapping>  <filter-name>struts2</filter-name>  <url-pattern>/*</url-pattern> </filter-mapping>

Struts2的核心控制器首先拦截用户请求,然后将请求转发给对应的Action处理,在此过程中,Struts2将负责创建Action实例,并调用其execute()方法。而,我们需要将Action实例交给Spring容器管理,不由Struts2产生,这个改变需要由Struts2提供的Spring插件(
struts2-spring-plugin-2.2.1.jar)完成。

Spring插件提供一个伪Action,当我们在struts.xml文件中配置Action时,需要指定其class属性,过去是指定Action实例的实现类。但现在我们需指定为Spring容器中的Bean ID,这样Struts通过Spring容器获取Action对象。

所以,struts配置文件struts.xml为:

<!-- 配置文件根元素 --><struts>    <!-- 指定Web应用的默认编码集。该属性对于处理中文请求参数非常有用,    对于获取中文请求参数值,应该将该属性值设置为GBK或者GB2312 当设置该参数为GBK时,    相当于调用HttpServletRequest的setCharacterEncoding方法 -->    <constant name="struts.i18n.encoding" value="utf-8" />    <!-- 开发模式,如若“false”则为产品模式 -->    <constant name="struts.devMode" value="true" />    <!-- 代表了每一个独立的模块 -->    <package name="default" namespace="/" extends="struts-default">        <!-- 定义用户请求Action -->        <!-- 方法一:Spring管理控制器,class名loginAction为伪控制器,对应spring容器中的Bean实例 -->        <action name="loginPor" class="loginAction">            <!-- 逻辑视图配置逻辑页面 -->            <result name="error">/error.jsp</result>            <result name="success">/success.jsp</result>        </action>           </package></struts>

applicationContext.xml中需配置上文Action实例,并将业务逻辑组件注入到实例中:

<!-- 方法一:Spring管理控制器.定义业务逻辑组件,实现类MyServiceImpl --><bean id="myService" class="com.hqs.ssh.service.imp.MyServiceImpl" /><!-- 让Spting管理的Action实例,,,scope变量范围,prototype表示每次对该bean的实例请求都会导致一个新的实例创建 --><bean id="loginAction" class="com.hqs.ssh.action.LoginAction" scope="prototype">    <!-- 依赖注入业务逻辑组件 -->    <property name="ms" ref="myService"/></bean>

2.自动装配

该策略下,Action还是Spring插件创建,Spring插件在创建Action实例时,利用自动装配策略,将对应业务逻辑组件注入Action实例。
struts.xml配置:

<!-- 方法二:自动装配,class为Action实现类,与不整合spring配置相同 --> <action name="loginPor" class="com.hqs.ssh.action.LoginAction"> 

applicationContext.xml配置:

<!-- 方法二:自动装配,id与为所需的业务组件名(即xxxaction.java方法中定义的业务组件名)。缺点:可读性差,不利于解耦 --><bean id="ms" class="com.hqs.ssh.service.imp.MyServiceImpl" /> 

2015/10/2 10:15:49

Spring整合Hibernate

现在,很少使用JDBC的方式来访问持久层,大部分时候以ORM框架来访问持久层,Hibernate是比较优秀的ORM框架。

DAO模式:所有数据库访问,都通过DAO组件完成,DAO组件封装数据库的增、删、改等操作。

Spring提供如下三个工具类(或接口)来支持DAO组件实现:

  • HibenateDaoSupport
  • HibernateTemplate
  • HibernateCallback

Hibernate配置

当通过Hibernate进行持久层访问时,必须先获得SessionFactory对象,它是单个数据库映射关系编译后的内存镜像。

Hibernate SessionFactory配置示范

<!-- Hibernate整合。HIB1.定义数据源Bean,使用C3P0数据源实现 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"    destroy-method="close">    <!-- 指定连接数据库的驱动 -->    <property name="driverClass" value="com.mysql.jdbc.Driver"/>    <!-- 指定连接数据库的URL -->    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"/>    <!-- 指定连接数据库的用户名 -->    <property name="user" value="root"/>    <!-- 指定连接数据库的密码 -->    <property name="password" value="root"/>    <!-- 指定连接数据库连接池的最大连接数 -->    <property name="maxPoolSize" value="40"/>    <!-- 指定连接数据库连接池的最小连接数 -->    <property name="minPoolSize" value="1"/>    <!-- 指定连接数据库连接池的初始化连接数 -->    <property name="initialPoolSize" value="1"/>    <!-- 指定连接数据库连接池的连接的最大空闲时间 -->    <property name="maxIdleTime" value="20"/></bean><!-- HIB2.定义SessionFactory --><bean id="sessionFactory"    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">    <!-- 依赖注入数据源,注入正是上面定义的dataSource -->    <property name="dataSource" ref="dataSource"/>    <!-- mappingResouces属性用来列出全部映射文件 -->    <property name="mappingResources">        <list>            <!-- 以下用来列出Hibernate映射文件 -->            <value>com/hqs/ssh/domain/User.hbm.xml</value>        </list>    </property>    <!-- HIB3.定义SessionFactory的属性 -->    <property name="hibernateProperties">        <!-- 配置Hibernate属性 -->        <value>        hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect        hibernate.hbm2ddl.auto=update        hibernate.show_sql=true        hibernate.format_sql=true;        </value>    </property></bean>

在Spring的IoC容器中配置了SessionFactory Bean后,它将随应用启动而加载,并可以将其注入到其他Bean,如DAO组件。一旦DAO组件获取了SessionFactory Bean的引用,就可以访问数据库。

<!-- HIB4.定义DAO Bean--><bean id="userDao" class="com.hqs.ssh.dao.impl.UserDaoImpl">    <!-- 注入持久化操作所需的SessionFactory -->    <property name="sessionFactory" ref="sessionFactory"/></bean>

HibernateTemplate

HibernateTemplate提供持久化访问模板化,只需要提供一个SessionFactory的引用,就可以执行持久化操作。

DAO组件的实现基于HibernateTemplate:

public class UserDaoImpl implements UserDao{    //定义一个HibernateTemplate对象,用于执行持久化操作    private HibernateTemplate ht = null;    //Hibernate持久化操作所需的SessionFactory    private SessionFactory sessionFactory;    //依赖注入SessionFactory的setter方法    public void setSessionFactory(SessionFactory sessionFactory)    {        this.sessionFactory = sessionFactory;    }    //初始化HibernateTemplate的方法,执行持久化操作    private  HibernateTemplate getHibernateTemplate()    {        if (ht == null)        {            ht = new HibernateTemplate(sessionFactory);        }        return ht;    }    /**     * 加载User实例     * @param id 需要加载的User实例的标识属性值     * @return 指定id对应的User实例     */     public User get(Integer id)    {        return getHibernateTemplate()            .get(User.class, id);     }    /**     * 保存User实例     * @param User 需要保存的User实例     * @return 刚刚保存的User实例的标识属性值     */       public Integer save(User user)    {        return (Integer)getHibernateTemplate()            .save(user);    }    /**     * 修改User实例     * @param User 需要修改的User实例     */    public void update(User user)    {        getHibernateTemplate().update(user);    }       /**     * 删除User实例     * @param User 需要删除的User实例     */    public void delete(User user)    {        getHibernateTemplate().delete(user);    }}

2015/10/2 10:16:10


参考自:轻量级javaee企业应用实战

0 0