SSH整合总结(xml与注解)

本人自己进行的SSH整合,中间遇到不少问题,特此做些总结,仅供参考。

一、使用XML配置:

  1. SSH版本

    • Struts-2.3.31
    • Spring-4.3.5
    • Hibernate-4.2.21
  2. 引入jar包
    • 必须在WEB-INF下添加jar包(其他无效)
    • spring以及它的依赖包 com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
    • hibernate的jar包及struts2的jar和插件包,包含两个重复的javassist.jar,保留高版本的即可
    • mysql以及数据库连接池的jar包
  3. 编写持久化类及映射文件
  4. 基础applicationContext.xml(全约束)

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
    
    </beans>
  5. jdbc.properties

    <!-- 数据库连接池的基本配置 -->
    jdbc.driverClass=com.mysql.jdbc.Driver
    jdbc.url=jdbc\:mysql\://localhost\:3306/ssh
    jdbc.username=root
    jdbc.password=root
  6. Spring整合Hibernate

    <!-- 引入jdbc.properties-->
    <context:property-placeholder location="classpath:jdbc.properties"/>
    <!-- 配置dbcp数据源 -->
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
         <property name="driverClassName" value="${jdbc.driverClass}"></property>
         <property name="url" value="${jdbc.url}"></property>
         <property name="username" value="${jdbc.username}"></property>
         <property name="password" value="${jdbc.password}"></property>
    </bean>
    <!-- 配置sessionFactory -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
         <property name="dataSource" ref="dataSource"></property>
         <!-- 配置hibernate.cfg.xml的路径 -->
         <!-- <property name="configLocations" value="classpath:hibernate.cfg.xml"/> -->
         <!-- 不使用hibernate.cfg.xml,由spring配置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>
         <!-- 配置.hbm.xml的位置及名称,可以使用通配符 -->
         <property name="mappingLocations" value="classpath:com/ssh/domain/*.hbm.xml"/>
         <!-- 配置单独的.hbm.xml -->
         <property name="mappingResources">
               <list>
                    <value>com/ssh/domain/User.hbm.xml</value>
               </list>
         </property>
    </bean>
    <!-- 注入UserDAO -->
    <bean id="userDao" class="com.ssh.dao.UserDAO">
         <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
    <!--Spring自动生成的是代理对象,实现了UserDAO接口,不能强转为UserDaoImpl对象
    ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
    UesrDAO dao = (UserDAO) context.getBean("userDao");
    -->
    <!-- 注入UserService -->
    <bean id="userService" class="com.ssh.dao.UserService">
         <property name="userDao" ref="userDao"/>
    </bean>
    
    <!-- 配置 Spring 的声明式事务 -->
    <!-- 1. 配置数据源DataSource(必须) -->
    <!-- 2. 配置事务管理器 -->
    <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
         <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    <!-- 3. 配置事务建议者 -->
    <tx:advice id="txAdivce" transaction-manager="txManager">
         <tx:attributes>
               <tx:method name="get*" read-only="true"/>
               <tx:method name="*" propagation="REQUIRED"/>
         </tx:attributes>
    </tx:advice>
    <!-- 4. 配置AOP切面 -->
    <aop:config>
         <aop:pointcut expression="execution(* com.ssh.service.*.*(..))" id="pointcut"/>
         <aop:advisor advice-ref="txAdivce" pointcut-ref="pointcut"/>
    </aop:config>
    <!-- 5. 不能在hibernate中配置<property name="current_session_context_class">thread</property>,否则Spring不会自动开启事务 -->
  7. Spring整合Struts2
    1. 引入Struts2下的spring插件包:struts2-spring-plugin-2.3.31.jar
    2. 配置web.xml

      <!-- 配置sprin监听器,在服务器启动时初始化IoC容器 -->
      <listener>
         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
      <!-- 默认寻找WEB-INF下的applicationContext.xml -->
      <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>
    3. 在applicationContext.xml中注入Action

      //创建一个SuperActon继承ActionSupport并实现Web元素相关的接口
      <bean id="superAction" class="com.ssh.action.SuperAction" />
      
      <!-- 必须声明 scope 属性为 prototype (非单例) -->
      //创建自己的Action继承SuperAction便可以直接使用request,session等对象
      <bean id="userAction" class="com.ssh.action.UserAction" parent="superAction" scope="prototype">
           <property name="userService" ref="userService"/>
      </bean>
    4. 配置struts.xml

      <!-- class属性的值对应applicationContext.xml中注入的Action的id名 -->
      <action name="user_*" class="userAction" method="{1}">
           <result name="success">/success.jsp</result>
      </action>

二、使用注解+XML配置:

  • 配置struts.xml文件时action的class值要写成Action类的全名
  • 配置 applicationContext.xml:

    <!-- 配置dataSource和sessionFactory -->
    <!-- 注解映射类的包扫描器 -->
    <property name="packagesToScan" value="com.ssh.entity"></property>
    
    <!-- 开启注解式依赖与注入 -->
    <context:annotation-config />
    <context:component-scan base-package="com.ssh"/>
    <!-- 开启注解式事务 -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
         <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    <tx:annotation-driven transaction-manager="transactionManager"/>
  • 注解类的配置:

    @Controller
    @Scope("prototype")
    public class UserAction extends ActionSupport {
         @Resource
         private UserService userService;
    }
    
    @Service
    @Transactional
    public class UserService {
         @Resource
         private UserDaoImpl userDao;
    }
    
    @Repository("userDao")
    public class UserDaoImpl implements UserDao{
         @Resource
         private SessionFactory sessionFactory;
    }
    //若使用继承HibernateDaoSupport的方式,则不能直接注入SessionFactory
    public class UserDaoImpl extends HibernateDaoSupport implements UserDao{
         @Resource(name="sessFactory")
         private void setSuperSessionFactory(SessionFactory sessionFactory) {
             super.setSessionFactory(sessionFactory);
         }
    }

其他问题:

问题:多对一映射时,获取多方对象时同时获取到的是一方的代理对象,在view层调用时会抛出一下异常:org.hibernate.LazyInitializationException: could not initialize proxy - no Session,即代理对象不   能被初始化。

原因:在service层添加了事务,事务提交时将session关闭了

解决办法(三种方式):

  1. 修改多对一映射中的lazy属性值为true。
  2. 获取多方对象时使用迫切左外连接同时初始化其关联的一方对象。
  3. 在web.xml中配置一个过滤器:OpenSessionInViewFilter

    <!-- 此过滤器必须配置在struts2过滤器的前面 -->
    <filter>
         <filter-name>OpenSessionInViewFilter</filter-name>
         <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
    </filter>
    <filter-mapping>
         <filter-name>OpenSessionInViewFilter</filter-name>
         <url-pattern>*.action<url-pattern>
    </filter-mapping>

以上即为SSH配置的基本过程,碍于篇幅,代码只提供了一部分,应该不影响正常查看。

时间: 2024-12-20 12:18:38

SSH整合总结(xml与注解)的相关文章

SSH整合的xml和注解

DAO: 1 public interface IDeptDAO { 2 public int addDept(Dept dept); 3 } 1 @Repository("deptDAO") 2 public class DeptDAOImpl implements IDeptDAO { 3 @Resource(name = "sessionFactory") //JDK 1.4 4 /*@Autowired() 5 @Qualifier("sessio

SSH整合主要XML代码

web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http:

SSH整合_struts.xml 模板

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <consta

SSH整合 pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersi

ssh整合之七注解结合xml形式

1.在之前的ssh搭建过程中,我们是使用纯xml的方式进行编写的,这样的话,确实也挺麻烦,我们可不可以使用更简单的形式进行配置呢? 答案是肯定的,我们可以使用我们的注解形式进行快速搭建ssh框架 2.我们的配置文件hibernate是用jpa注解,struts是用struts的注解,spring是使用ioc和事务的注解 首先先修改我们的hibernate中内容,即实体类 package com.itheima.entity; import javax.persistence.Column; im

SSH整合之全注解

  SSH整合之全注解 使用注解配置,需要我们额外引入以下jar包 我们下面从实体层开始替换注解 1 package cn.hmy.beans; 2 3 import javax.persistence.Entity; 4 import javax.persistence.GeneratedValue; 5 import javax.persistence.Id; 6 import javax.persistence.Table; 7 8 @Entity 9 @Table 10 public c

使用注解实现ssh整合

1.搭建项目: 项目名称:ss12.添加jar包    1).struts 2.3.7         --基础        asm-3.3.jar        asm-commons-3.3.jar        asm-tree-3.3.jar        commons-fileupload-1.2.2.jar        commons-io-2.0.1.jar        commons-lang3-3.1.jar        freemarker-2.3.19.jar  

框架 day37 Spring事务管理,整合web,SSH整合,SSH整合注解

1     事务管理 1.1   回顾事务     事务:一组业务操作,要么全部成功,要么全部不成功.     事务特性:ACID 原子性:整体 一致性:数据(完整) 隔离性:并发(多个事务) 持久性:结果     隔离问题:脏读.不可重复读.幻读(虚读)     隔离级别:4个 readuncommitted 读未提交,存在3个问题. readcommitted 读已提交,解决:脏读:存在2个. repeatableread 可重复读,解决:脏读.不可重复读:存在1个 serializ

SSH三大框架整合使用的配置文件 注解实现

1 Struts.xml 使用拦截器 <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"    "http://struts.apache.org/dtds/struts-2.1.7.dtd"&g