SSH三大框架的整合 (基于xml)

Struts2 和Spring的整合两种方式

Struts2自己管理Action:(方式一) 
<action name="book_*" class="cn.itcast.action.BookAction" method="{1}">
* Struts2框架自动创建Action的类.

Action交给Spring管理:(方式二)
可以在标签上通过一个伪类名方式进行配置:
<action name="book_*" class=" bookAction " method="{1}"></action>

在spring的配置文件中:
<!-- 配置Action -->
     <bean id=" bookAction " class="cn.itcast.action.BookAction"></bean>
(*****)注意:Action交给Spring管理一定要配置scope= prototype
          
推荐使用二:
* 在Spring中管理的类,可以对其进行AOP开发.统一的管理.
                                                                                                                                                             

Web层获得Service:

传统方式:
* 获得WebApplicationContext对象.
* 通过WebAppolicationContext中getBean( “” );

实际开发中:
* 引入了struts2-spring-plugin-2.3.15.3.jar
* 有一个配置文件 : struts-plugin.xml
开启常量 :
<constant name="struts.objectFactory" value="spring" />
引发另一个常量的执行:(Spring的工厂类按照名称自动注入)
struts.objectFactory.spring.autoWire = name


Spring整合Hibernate:
Spring整合Hibernate框架的时候有两种方式:

  一. 零障碍整合:(一)

可以在Spring中引入Hibernate的配置文件.
1.通过LocalSessionFactoryBean在spring中直接引用hibernate配置文件
    <!-- 零障碍整合 在spring配置文件中引入hibernate的配置文件 -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="configLocation" value="classpath:hibernate.cfg.xml"/>
    </bean>

2.Spring提供了Hibernate的模板.只需要将HibernateTemplate模板注入给DAO.
* DAO继承HibernateDaoSupport.
    <!-- DAO的配置 -->
    <bean id="bookDao" class="cn.itcast.dao.BookDao">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

改写DAO:继承HibernateDaoSupport类.
public class BookDao extends HibernateDaoSupport{

    public void save(Book book) {
        System.out.println("DAO层的保存图书...");
        this.getHibernateTemplate().save(book);
    }

}

3.创建一个映射文件 :
<hibernate-mapping>
    <class name="cn.itcast.vo.Book" table="book">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name"/>
        <property name="price"/>
    </class>
</hibernate-mapping>

4.别忘记事务管理:
事务管理器:
    <!-- 管理事务 -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

5.注解管理事务:
<!-- 注解开启事务 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

6.在业务层类上添加一个注解:
@Transactional


 二. 没有Hibernate配置文件的形式()


不需要 Hibernate 配置文件的方式 , Hibernate 配置文件的信息直接配置到 Spring .
Hibernate 配置文件中的信息  :
* 连接数据库基本参数:
* Hibernate常用属性:
* 连接池:
       * 映射


Hibernate 配置文件整合 Spring :
连接池:
<!-- 引入外部属性文件. -->
     <context:property-placeholder location="classpath:jdbc.properties"/>
     
     <!-- 配置c3p0连接池 -->
     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
         <property name="driverClass" value="${jdbc.driver}"/>
         <property name="jdbcUrl" value="${jdbc.url}"/>
         <property name="user" value="${jdbc.user}"/>
         <property name="password" value="${jdbc.password}"/>
     </bean>
Hibernate常用属性:
<!-- 配置Hibernate的属性 -->
         <property name="hibernateProperties">
              <props>
                   <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                   <prop key="hibernate.show_sql">true</prop>
                   <prop key="hibernate.format_sql">true</prop>
                   <prop key="hibernate.hbm2ddl.auto">update</prop>
                   <prop key="hibernate.connection.autocommit">false</prop>
              </props>
         </property>

映射
<!-- <property name="mappingResources">
              <list>
                   <value>cn/itcast/vo/Book.hbm.xml</value>
              </list>
         </property> -->
         <property name="mappingDirectoryLocations">
              <list>
                   <value>classpath:cn/itcast/vo</value>
              </list>
         </property>

  Spring整合Hibernate --->不需要Hibernate.xml的方式
     
<!--c3p0连接池。以配置文件的形式!配置4大参数=========================================  -->
      <!--在xml的文件中引入db.properties文件-->
  < context:property-placeholder location = "classpath:db.properties" />
    <!-- 在配置文件中使用配置文件中的信息 -->
  < bean id = "dataSource" class = "com.mchange.v2.c3p0.ComboPooledDataSource" >
       < property name = "driverClass" value = "${jdbc.driver}" />
       < property name = "jdbcUrl" value = "${jdbc.url}" />
       < property name = "user" value = "${jdbc.user}" />
       < property name = "password" value = "${jdbc.password}" ></ property >
   </ bean >
  <!--c3p0连接池。以配置文件的形式!配置4大参数=========================================  -->
 
<!--把 Hibernate配置文件整合Spring中。放到sessionFactory========================================-->
      <!-- 零障碍整合 在spring配置文件中引入 hibernate的配置文件  LocalSessionFactoryBean-->
      < bean id = "sessionFactory" class = "org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
        < property name = "dataSource" ref = "dataSource" ></ property >
        <!--配置 Hibernate常用属性  -->
        < property name = "hibernateProperties" >
           < props >
             < prop key = "hibernate.dialect" > org.hibernate.dialect.MySQLDialect </ prop >
             < prop key = "hibernate.show_sql" > true </ prop >
             < prop key = "hibernate.format_sql" > true </ prop >
             < prop key = "hibernate.hbm2ddl.auto" > update </ prop >
           </ props >
        </ property >
        <!--引入映射文件  mappingDirectoryLocations这种方式适合在同一个包中的映射文件-->
        <!-- <property name="mappingDirectoryLocations">
          <list>
             <value>classpath:cn/ itcast/domain</value>
          </list>
        </property> -->
        < property name = "mappingResources" >
          < list >
            < value > cn/ itcast/domain/Book.hbm.xml </ value >
          </ list >  
        </ property >
      </ bean >
  <!--把Hibernate配置文件整合Spring中。放到sessionFactory========================================-->
     
      < bean id = "bookAction" class = "cn.itcast.action.BookAction" scope = "prototype" >
         < property name = "bookService" ref = "bookService" ></ property >
      </ bean >
     
      < bean id = "bookService" class = "cn.itcast.service.BookService" >
        < property name = "bookDao" ref = "bookDao" />
      </ bean >
     
    < bean id = "bookDao" class = "cn.itcast.dao.BookDao" >
       <!--将sessionFactory注入到这里是为了将和数据库相关的参数注入到持久层,继承的那个类帮我们吧模板创建好了  -->
       < property name = "sessionFactory" ref = "sessionFactory" ></ property >
    </ bean >




HibernateTemplate的API:
 Serializable save(Object entity)                      :保存数据
 void update(Object entity)                             :修改数据
 void delete(Object entity)                              :删除数据
 <T> T get(Class<T> entityClass, Serializable id)         :根据ID进行检索.立即检索
 <T> T load(Class<T> entityClass, Serializable id)         :根据ID进行检索.延迟检索.
 List find(String queryString, Object... values)         :支持HQL查询.直接返回List集合.
 List findByCriteria(DetachedCriteria criteria)          :离线条件查询.
 List findByNamedQuery(String queryName, Object... values)    :命名查询的方式.

基于注解的方式整合SSH:
导入以上工程jar包:
* 导入struts2的注解开发:
* struts2-convention-plugin-2.3.15.3.jar

* web.xml:
<!-- 配置Spring的监听器 -->
<listener>
    <!-- 监听器默认加载的是WEB-INF/applicationContext.xml -->
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- 指定Spring框架的配置文件所在的位置 -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
</context-param>

<!-- 配置Struts2的核心过滤器 -->
<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>

* 创建包结构:
* 引入spring的配置文件、log4j、jdbc属性文件.

* 创建页面:
* 创建Action:
@Namespace("/")
@ParentPackage("struts-default")
public class BookAction extends ActionSupport implements ModelDriven<Book>{
    private Book book = new Book();
    public Book getModel() {
        return book;
    }

    @Action(value="book_add")
    public String add(){
        System.out.println("web层添加图书...");
        return NONE;
    }
}

* Action---Service----Dao
将各层类使用注解装配Spring中:
@Controller
@Service
@@Repository

完成属性注入:
@Autowired
    @Qualifier("bookService")

* 实体类:
@Entity
@Table(name="book")
public class Book {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;
    @Column(name="name")
    private String name;
    private Double price;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Double getPrice() {
        return price;
    }
    public void setPrice(Double price) {
        this.price = price;
    }
    @Override
    public String toString() {
        return "Book [id=" + id + ", name=" + name + ", price=" + price + "]";
    }

}

案例

==============



* 事务管理:

* 模板注入:



public List<Book> findAll(){
           return this .getHibernateTemplate().find( "from Book" );
     }


---------------------------
public List<Book> findByName(String name){
           return this .getHibernateTemplate().findByNamedQuery( "findByName" , name);
     }





如果多表的关联,在页面中显是数据的话,会产生延迟加载的问题。那么解决这宗延迟加载的问题最好呢?
    原因:在业务层我们的session已经关闭了,也就是说我们的事务关闭了,那么产生延迟加载的数据在页面中就不会显是出来
   解决方案就是:将事务的开启和关闭放在web层


 








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值