一篇了解Struts2+Hibernate+Spring以及ssh集成框架

本篇文章将基于Maven项目来讲解,如不懂maven,可以参考发布的前文 

依赖下载的Maven网站:https://mvnrepository.com/

 

Struts2

 struts是什么?

基于mvc模式设计的一个web应用框架,是struts1的升级版,实现了servlet的功能,进而控制页面跳转。

用法:

1.环境搭建,在pom.xml中导入相关的依赖包

<properties>
	   <junit.version>3.8.1</junit.version>
	   <mysql.version>5.1.44</mysql.version>
	   <struts.version>2.5.13</struts.version>
	   <jstl.version>1.2</jstl.version>
	   <taglibs.version>1.1.2</taglibs.version>
	</properties>
  <dependencies>
        <!-- junit单元测试-->
        <dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>${junit.version}</version>
			<scope>test</scope>  
		</dependency>
		<!-- 数据库连接 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>${mysql.version}</version>
		</dependency>
		<!-- struts2 -->
		<dependency>
			<groupId>org.apache.struts</groupId>
			<artifactId>struts2-core</artifactId>
			<version>${struts.version}</version>
		</dependency>
		<!-- jstl标准标签库 -->
       <dependency>
			<groupId>jstl</groupId>
			<artifactId>jstl</artifactId>
			<version>${jstl.version}</version>
		</dependency>
		<dependency>
			<groupId>taglibs</groupId>
			<artifactId>standard</artifactId>
			<version>${taglibs.version}</version>
		</dependency>
  </dependencies>

2.配置struts.xml(核心配置文件)

 这边可以使用struts-base.xml来保存基本引用内容,再将struts-base导入struts.xml中

<?xml version="1.0" encoding="UTF-8"?>
<!--此段代码要从struts的jar包中找到struts-2.5.dtd导入-->
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
	"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
    <!-- 是否支持国际化(中文) -->
	<constant name="struts.i18n.encoding" value="UTF-8" />
	<!-- 是否使用开发模式 -->
	<constant name="struts.devMode" value="true" />
	<!-- 是否开启热加载 -->
	<constant name="struts.configuration.xml.reload" value="true" />
	<!-- 是否开启热加载  -->
	<constant name="struts.i18n.reload" value="true" />
	<!-- 是否使用动态方法 -->
	<constant name="struts.enable.DynamicMethodInvocation" value="true" />

    <!-- 定义一个基础包,在自己所需要的其他包中引用-->
	<package name="base" extends="struts-default" abstract="true">
		<global-allowed-methods>regex:.*</global-allowed-methods>
	</package>
</struts>

 在重建一个struts-sys.xml在里面配置自己需要的内容以及跳转路径,如下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
	"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
    <!--继承struts-base.xml中定义的包-->
    <package name="test" extends="base">
       <action name="book_*" class="com.zking.action.BookAction" method="{1}">
           <result name="index">index.jsp</result>
           <result name="success" type="redirectAction">/book_selAll</result>
           <result name="goUpdate" type="redirect">/update.jsp</result>
           <result name="add" type="redirect">/addBook.jsp</result>
       </action>
    </package>
</struts>

 3.开发

    3.1Action 不需要指定父类(ActionSupport),

      业务方法的定义

      public String xxx();//execute
          注1:开启动态方法调用              

   3.2参数赋值
           Action中定义属性,并提供get/set方法
          userName, getUserName/setUserName

hibernate

hibernate是什么(来源科普中国)?

 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的JavaEE架构中取代CMP,完成数据持久化的重任。

ORM框架/持久层框架

对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。

基本用法:

1.在pom.xml中添加hibernate相关依赖(推荐5.12.final的版本)

2.在hibernate目录下添加hibernate.cfg.xml(核心配置文件)如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
    <!-- 数据库相关配置 -->
      <property name="connection.username">root</property>
      <property name="connection.password">123</property>
      <property name="connection.url">jdbc:mysql://localhost:3306/T264?useUnicode=true&amp;characterEncoding=UTF-8</property>
      <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
      <!-- 方言  -->
      <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
      
      <!-- 调试相关配置 -->
      <property name="show_sql">true</property>
      <property name="format_sql">true</property>
      
      <!-- 开启二级缓存 -->
      <property name="hibernate.cache.use_second_level_cache">true</property>
      <!-- 开启查询缓存 -->
      <property name="hibernate.cache.use_query_cache">true</property>
      <!-- EhCache驱动 -->
      <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
      
    <!-- 进行实体类映射文件的注册 -->
      <mapping resource="mapping/User.hbm.xml"/>
      <mapping resource="mapping/Order.hbm.xml"/>
      <mapping resource="mapping/OrderItem.hbm.xml"/>
      <mapping resource="mapping/TreeNode.hbm.xml"/>
      <mapping resource="mapping/Book.hbm.xml"/>
      <mapping resource="mapping/BookCategory.hbm.xml"/>
    </session-factory>
      
</hibernate-configuration>

3.每创建一个表都要对它做实体映射文件配置,拿Book表为例,创建Book.hbm.xml 

注意:配置完之后要到hibernate核心配置文件中做实体类映射文件的注册

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class table="t_book" name="com.zking.entity.Book">
       <id name="bookId" type="java.lang.Integer">
       <column name="book_id"/>
       <generator class="increment"/>
     </id> 
     <property name="bookName" type="java.lang.String">
       <column name="book_name"/>
     </property>
     <property name="price" type="java.lang.Double">
       <column name="price"/>
     </property>
    
     <!--配置表与表之间主外键关系所用到的--> 
     <set name="bookCategories" table="t_book_category">
         <key column="bid"/>
         <many-to-many column="cid" class="com.zking.entity.BookCategory"></many-to-many>
     </set>
    </class>
</hibernate-mapping>

 4. 如何使用hibernate完成CRUD操作
  4.1 CRUD操作步骤
    4.1.1 读取配置
    4.1.2 创建SessionFactory
    4.1.3 打开Session
    4.1.4 开启事务
    4.1.5 CURD
    4.1.6 提交事务/回滚事务
    4.1.7 关闭Session

 4.2 注意事项
     4.2.1 hibernate默认使用的是手动事务,因此必须显示的开启和提交事务
     4.2.2 删除操作时,必须先查再删

Spring 

 什么是spring,它能做什么?

 Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。
   Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。
   然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
   目的:解决企业应用开发的复杂性
   功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
   范围:任何Java应用
   简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

SSH2/SSM
   1.1 中间层框架、万能胶
       struts2
       spring
       hibernate
   1.2 容器框架
         JavaBean
         IOC和AOP

 如何在spring当中定义和配置一个JavaBean(使用无参构造方法+set方法创建一个JavaBean)

  1.  id:在容器中查找Bean的id(唯一、且不能以/开头)
  2. class:bean的完整类名
  3. name:在容器中查找Bean的名字(唯一、允许以/开头、允许多个值,多个值之间用逗号或空格隔开)
  4. scope:(singleton(单例模式)|prototype(多例模式))默认是singleton
  5. abstract:将一个bean定义成抽象bean(抽象bean是不能实例化的),抽象类一定要定义成抽象bean,非抽象类也可以定义成抽象bean
  6. parent:指定一个父bean(必须要有继承关系才行)
  7. init-method:指定bean的初始化方法

简单属性的配置:
   8+1+3
   8基础数据+String+3个sql
   java.util.Date
     java.sql.Date
     java.sql.Time
     java.sql.Timestamp
   通过<value>标签赋值即可

复杂属性的配置
  5.1 JavaBean
      ref bean=""
  5.2 List或数组
  5.3 Map
  5.4 Properties

用法:

配置spring-xml文件(也可以配置spring-base.xml然后导入spring-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.3.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
	<!-- 目标 -->
	<bean id="bookService" class="p2.BookServiceImpl"></bean>
	
	
	<!-- 前置通知 -->
	<bean id="beforeAdvice" class="p2.MyMethodBeforeAdvice"></bean>
	<!-- 后置通知 -->
	<bean id="afterAdvice" class="p2.MyAfterReturningAdvice"></bean>
	<!-- 环绕通知 -->
	<bean id="methodInterceptor" class="p2.MyMethodInterceptor"></bean>
	<!-- 代理对象 -->
	<bean id="proxybean" class="org.springframework.aop.framework.ProxyFactoryBean">
	   <property name="target">
	      <ref bean="bookService"></ref>
	   </property>
	   <property name="interceptorNames">
	      <list>
	         <value>afterAdvice</value>
	         <value>pointCutAdvice</value>
	         <value>methodInterceptor</value>
	      </list>
	   </property>
	   <property name="proxyInterfaces">
	      <list>
	        <value>p2.IBookService</value>
	      </list>
	   </property>
	</bean>
	
	<!-- 适配器 -->
	<bean id="pointCutAdvice" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
	   <property name="advice">
	        <ref bean="beforeAdvice"/>
	   </property>
	   <property name="pattern">
	      <value>.*buy</value>
	   </property>
	</bean>
</beans>

什么是ssh框架?(来源于科普中国)

SSH是 struts+spring+hibernate的一个集成框架,是16年之前较为流行的一种Web应用程序开源框架。区别于 Secure Shell 。

集成SSH框架的系统从职责上分为四层:表示层、业务逻辑层、数据持久层和域模块层,以帮助开发人员在短期内搭建结构清晰、可复用性好、维护方便的Web应用程序。其中使用Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分,控制业务跳转,利用Hibernate框架对持久层提供支持,Spring做管理,管理struts和hibernate。

用法:1.修改spring核心配置文件:在spring-base.xml中实现hibernate与spring的集成

<?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.3.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
	<!-- 配置c3p0连接池(在需要的时候自动连接和关闭)-->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="driverClass" value="com.mysql.jdbc.Driver" />
		<property name="jdbcUrl"
			value="jdbc:mysql://localhost:3306/T264?useUnicode=true&amp;characterEncoding=UTF-8" />
		<property name="user" value="root" />
		<property name="password" value="123" />

		<!--连接池中保留的最小连接数。 -->
		<property name="minPoolSize" value="5" />

		<!--连接池中保留的
		最大连接数。Default: 15 -->
		<property name="maxPoolSize" value="30" />

		<!--初始化时获取的连接数,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
		<property name="initialPoolSize" value="10" />

		<!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
		<property name="maxIdleTime" value="60" />

		<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
		<property name="acquireIncrement" value="5" />

		<!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements 属于单个connection而不是整个连接池。 
			所以设置这个参数需要考虑到多方面的因素。如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 
			0 -->
		<property name="maxStatements" value="0" />

		<!--每60秒检查所有连接池中的空闲连接。Default: 0 -->
		<property name="idleConnectionTestPeriod" value="60" />

		<!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
		<property name="acquireRetryAttempts" value="30" />

		<!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效 保留,并在下次调用getConnection()的时候继续尝试获取连接。 
			如果设为true,那么在尝试 获取连接失败后该数据源将申明已断开并永久关闭。Default: false -->
		<property name="breakAfterAcquireFailure" value="true" />

		<!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的 时候都将校验其有效性。建议使用idleConnectionTestPeriod 
			或automaticTestTable 等方法来提升连接测试的性能。Default: false -->
		<property name="testConnectionOnCheckout" value="false" />
	</bean>

	<!-- hibernate与spring集成 -->
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
		<!-- 指定数据源 -->
		<property name="dataSource">
			<ref bean="dataSource" />
		</property>
		<!-- 指定hibernate相关属性 -->
		<property name="hibernateProperties">
			<props>
				<prop key="dialect">org.hibernate.dialect.MySQLDialect</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.format_sql">true</prop>
				<prop key="hibernate.use_sql_comments">true</prop>
				<prop key="hibernate.cache.use_second_level_cache">true</prop>
				<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory
				</prop>
				<prop key="hibernate.cache.use_query_cache">true</prop>
			</props>
		</property>
		<!-- 指定实体映射文件 -->
		<property name="mappingResources">
			<list>
				<value>mapping/Account.hbm.xml</value>
			</list>
		</property>
	</bean>

	<!-- hibernateTemplate -->
	<bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate">
		<property name="sessionFactory">
			<ref bean="sessionFactory" />
		</property>
	</bean>


	<!--声明式事务配置开始 -->
	<!--1) 开启自动代理 -->
	<aop:aspectj-autoproxy />

	<!--2) 事务管理器 begin/commit/rollback -->
	<bean id="transactionManager"
		class="org.springframework.orm.hibernate5.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>

	<!--3) 定义事务特性 -->
	<!-- 环绕通知 -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="add*" propagation="REQUIRED" />
			<tx:method name="edit*" propagation="REQUIRED" />
			<tx:method name="del*" propagation="REQUIRED" />
			<tx:method name="load*" propagation="REQUIRED" read-only="true" />
			<tx:method name="list*" propagation="REQUIRED" read-only="true" />
			<tx:method name="do*" propagation="REQUIRED" />
		</tx:attributes>
	</tx:advice>

	<!--4) 定义切入点 -->
	<aop:config>
		<!-- pointcut属性用来定义一个切入点,分成四个部分理解 [* ][*..][*Service][.*(..)] -->
		<!-- A: 返回类型,*表示返回类型不限 -->
		<!-- B: 包名,*..表示包名不限 -->
		<!-- C: 类或接口名,*Service表示类或接口必须以Service结尾 -->
		<!-- D: 方法名和参数,*(..)表示方法名不限,参数类型和个数不限 -->
		<aop:advisor advice-ref="txAdvice" pointcut="execution(* *..*DaoImpl.*(..))" />
	</aop:config>
	<!-- 声明式事务配置结束 -->
</beans>

SSH集成的注意事项

  1. .struts的xml的配置文件基本保持不变:将action标签中的class属性改成spring-xml中配置的类Acition引用就完成对struts2的集成
  2. 将hibernate的核心配置文件hibernate.cfg.xml中的内容放入spring.xml中,配置hibernateTemplate,将实体类映射文件也放入其中
  3. 在java代码中凡是引用spring中定义的bean元素,都要提供相对应的set/get方法

         

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SSH整合示例(详情见我博客专栏)之前的博客我们总结了spring基础、spring分别整合struts2hibernate、mybatis等,今天我们来同时整合下 strutsspringhibernate,也就是所谓的 ssh 。 整合流程: 1 首先整合springhibernate,这次我们在spring 中配置bean使用注解的方式 ,hibernate实体映射关系也使用注解的方式,配置完毕后用简单方法测试下hibernate是否整合成功。 a 加入支持:添加 spring核心包、hibernate 3.6 包、 spring整合hibernate包 , 在src下建立applicationContext.xml (先建立src下便于测试hibernate)。 b 编写实体类,加入hibernate注解,编写方法类测试类,在applicationContext.xml中添加hibernate模板类配置以及包扫描语句 。在类中添加spring bean注解。 c 测试类中 主动解析applicationContext.xml ,获取bean 执行dao层方法进行测试 2 将struts2 整合进去, 这次在struts.xml中我们使用通配符的方式配置action。 a 加入支持 : 添加struts2.3.15 必需包 以及 struts json包(ajax要用到),spring整合struts2包,spring web 包,在src目录下建立struts.xml,复制头文件进去。将applicationContext.xml移到WEB-INF目录下。web容器中(web.xml)中添加struts2 filter以及spring 监听器。 b 在struts.xml中添加action,使用通配符的方式 , 注意这里和单独struts2不同的地方: class属性指向的是bean 的 id ,这里我们配置bean采用spring ioc注解的方式, 所以默认的bean的id 为 类名(首字母小写) c 编写action类、页面进行测试

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值