SSH全注解框架整合

                          **SSH全注解框架整合**


2019/5/12 上午 9:54:57
#第一步:
导入jar包

创建start2和spring配置文件

配置web.xml里的spring核心监听器,与start2的核心拦截器

     <!-- struts2的配置 -->
  <filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
  </filter-mapping>
  <!--指定spring的配置文件的位置-->
  <context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:application*.xml</param-value>
  </context-param>
  <!--spring封装的核心监听器ContextLoaderListener-->
  <listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

#第二步:
编写application.xml文件

<!--  1. 创建数据源对象
      SPring与Hibernate整合的时候通常有两种方式:
       1).dbcp 数据源
       2).c3p0 数据源
       这里使用dbcp数据源
-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" 
    //mysql7以上的版本才需要加 .cj.
   value="com.mysql.cj.jdbc.Driver"/>
//此处url为mysql7以上版本需要写
//正常7版本以下为jdbc:mysql://localhost:3306/数据库名即可
    <property name="url" value="jdbc:mysql://localhost:3306/sys?useSSL=false&amp;serverTimezone=UTC"/>
    <property name="username" value="root"/>
    <property name="password" value="245078"/>
</bean>
 <!-- 2.创建SessionFactory对象 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <!--  注入数据源对象 -->
    <property name="dataSource" ref="dataSource"/>
    <!--  配置hibernate 常用属性 -->
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
            <prop key="hibernate.connection.url"><![CDATA[jdbc:mysql://localhost:3306/sys?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true]]></prop>
            <prop key="hibernate.connection.driver_class">com.mysql.cj.jdbc.NonRegisteringDriver</prop>
        </props>

    </property>
    <!-- 使用注解加载持久化类-->
    <property name="packagesToScan" value="com.ssh.bean"/>
</bean>
<!--  Spring与Hibernate  整合成功 -->
<context:component-scan base-package="com.ssh"/>
<!--  配置事物 -->

<!-- 1.将事物管理器类 纳入SPring容器 -->

<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!--   2.给service添加事物 开启自动注解配置-->
<tx:annotation-driven transaction-manager="transactionManager"/>

项目目录

- src>- baen 保存hibernate的映射文件
      - dao 操作数据库的基础层 **实现类注入sessionFactory对象 继承HibernateDaoSupport类** > 
      - service 业务层 声明dao层接口,注入dao层实现类对象
      - action 控制层 继承actionsupport 声明service层的接口,注入service实现类的对象  
      - 

编写struts.xml

由于Struts2在设计时就已经充分考虑了和Spring的整合问题并给出了解决方案,所以整合的过程变得非常简单。
需要将Struts2开发包中的struts2-spring-plugin-2.5.10.1.jar文件添加到工程中,这个由Struts2提供的插件即是Struts2和Spring整合的关键所在。
只需在struts.xml文件中添加一个常量配置,从而达到整合Struts2与Spring的目的。​

<constant name="struts.objectFactory" value="spring"></constant>​


#第三步:
使用注解
spring
注解写到实体类上面不是接口…

@Service用户标注业务层组件,如server层口 以下注解有一个name属性默认为首字母小写后的类名

@Controller用于标注控制层组建,如struts2中的action

@Repository用于标注数据访问组建,如dao层口

@Component泛指组建,当组件不好归类的时候,我们可以用这个注解进行标注

从spring容器中取出name等于名字的对象@Resource(name=“名字”) 在声明接口的时候使用;

在需要加入事务的service业务类或方法前添加@Transactional注解​

@Transactional()
一般查询不加事务,增删改加;
readOnly属性:是否只读。
propagetion属性:
事务传播行为:如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为

TransactionDefinition.PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如 果当前没有事务,则创建一个新的事务。这是默认值;
TransactionDefinition.PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起;
TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。
TransactionDefinition.PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
TransactionDefinition.PROPAGATION_NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。
@Transactional(rollbackFor=Exception.class),如果类加了这个注解,那么这个类里面的方法抛出异常,就会回滚,数据库里面的数据也会回滚。

@Transactional(rollbackFor=Exception.class),如果类加了这个注解,那么这个类里面的方法抛出异常,就会回滚,数据库里面的数据也会回滚。
在@Transactional注解中如果不配置rollbackFor属性,那么事物只会在遇到RuntimeException的时候才会回滚,加上rollbackFor=Exception.class,可以让事物在遇到非运行时异常时也回滚


spring的Bean默认的是单例的,Bean的作用域可以通过Bean标签的scope属性进行设置@scope(),Bean的作用域包括:

scope=“singleton”,那么该Bean是单例,任何人获取该Bean实例的都为同一个实例(默认);
scope=“prototype”,任何一个实例都是新的实例;
scope=“request”,在WEB应用程序中,每一个实例的作用域都为request范围;
scope=“session”,在WEB应用程序中,每一个实例的作用域都为session范围;

spring与struts2进行整合时,要把action的scope改为prototype。

Struts2使用注解开发需要遵循一些规范:

  1. Action所在的包名必须以 action 结尾。
  2. Action要必须继承ActionSupport父类;

action中常用的注解:

  1. @ParentPackage:对应xml配置文件中的package的父包,一般需要继承struts-default。

  2. @Namespace:对应配置文件中的nameSpace,命名空间。

  3. 写在方法前边的注解:

     @Action,这个注解对应<action>节点 
     ○ value(),表示action的请求名称,也就是<action>节点中的name属性;
     ○ results(),表示action的多个result;这个属性是一个数组属性,因此可以定义多个Result;
     ○ interceptorRefs(),表示action的多个拦截器。这个属性也是一个数组属性,因此可以定义多个拦截器; 
     ○ exceptionMappings(),这是异常属性,它是一个ExceptionMapping的数组属性,表示action的异常,在使用时必须引用相应的拦截器```
    
  4. action中最常用的results中单个result注解的配置:

     @Result,这个注解对应了<result>节点。这个注解只能应用于action类上。这个注解中也有几个属性:
     ○ name(),表示action方法的返回值,也就是<result>节点的name属性,默认情况下是【success】;
     ○ location(),表示view层文件的位置,可以是相对路径,也可以是绝对路径;
     ○ type(),是action的类型,比如:
     redirect类型是重定向到指定的视图资源,
     重定向将会丢失所有的参数、值栈和请求属性,即同时失去了Action的处理结果
     默认的是dispatcher是类型转发,将会把上述的所有数据资源转发给视图资源 
     redirectAction:此种结果类型与redirect一样,底层都是调用Response对象的sendRedirect方法进行重定向的,
     这两者的区别是redirect结果类型一般是针对视图的,而redirectAction则是重定向到某个action,
     所以如果在action处理之后还要交给另一个action继续处理,那么使用redirecAction结果类型。
     redirecAction结果类型有两个参数:actionName(指定需要重定向的action)和namespace
     (指定action所在的命名空间,如果没有指定该参数,框架会从默认的namespace中去寻找)。
    

#关于注解配置通知
@Aspect/是Aspect5新增的功能,使用JDK5.0注解技术和正规的AspectJ切点表达式语言描述切面。因此在使用@AspectAJ之前,需要保证使用的JDK是5.0或其以上版本,否则无法使用注解技术。

通知类型共有五种

前置通知 Before 表示在切入点或者目标方法之前执行的方法。
后置通知 After 表示在切入点或者目标方法之后执行的方法。
异常通知 After Throwing 表示在切入点或者目标方法抛出异常时执行的通知。
最终通知 After Returning 表示在切入点或者目标方法执行完成后执行。
环绕通知 Around 表示围绕切入点前后执行的通知,这种通知可以替代之前所以通知.

Spring XML配置

 <!-- 激活组件扫描功能,在包cn.ysh.studio.spring.aop及其子包下面自动扫描通过注解配置的组件 -->
<context:component-scan base-package="cn.ysh.studio.spring.aop"/>
<!-- 激活自动代理功能 -->
<aop:aspectj-autoproxy proxy-target-class="true"/>

注解使用

@Aspect 写到切面类上面
@Pointcut("") 定义切入点 写到无方法体的公有方法上方便同类其他方法使用
@Before(“公有方法()”) 前置通知 使用共有方法的切入点
此处省略四个通知…
切入点定义使用这个表达式
execution(* *.com.util.*.impl.*.add*(…)) 第一个*表示方法任意返回类型空一格 跟上完整包名第二三四五为通配符,括号里面的两个…表示任意个数的任意参数

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值