SSH 组合框架模式小知识分享

简介: 【5月更文挑战第4天】SSH 组合框架模式小知识分享

SSH=Struts+Spring+Hibernate

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

     Struts 是一个很好的MVC框架,主要技术是Servlet和Jsp。Struts的MVC设计模式可以使我们的逻辑变得很清晰,让我们写的程序层次分明。基于Struts开发可以简化开发难度,提高开发效率。

  Spring 提供了管理业务对象的一致方法,并鼓励注入对接口编程而不是对类编程的良好习惯,使我们的产品在最大程度上解耦。

Hibernate 是用来持久化数据的,提供了完全面向对象的数据库操作。Hibernate对JDBC进行了非常轻量级的封装,它使得与关系型数据库打交道变得非常轻松。

在Struts+Spring+Hibernate系统中,对象之间的调用流程如下:

 Struts——>Spring——>Hibernate

  JSP——>Action——>Service——>DAO——>Hibernate

比如:

1.Spring的配置文件bean.xml

<?xml version="1.0" encoding="UTF-8"?><beans

       xmlns="http://www.springframework.org/schema/beans"

       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"

       xmlns:tx="http://www.springframework.org/schema/tx">



   <bean id="dataSource"

         class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">

       <property name="jdbcUrl"

                 value="jdbc:mysql://localhost:3306/samblog?useUnicode=true&amp;characterEncoding=UTF-8&amp;autoReconnect=true">

       </property>

       <property name="user" value="root"></property>

       <property name="password" value="123456"></property>

       <property name="driverClass" value="org.gjt.mm.mysql.Driver"/>

   </bean>

   <bean id="sessionFactory"

         class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">

       <property name="dataSource">

           <ref bean="dataSource"/>

       </property>

       <property name="hibernateProperties">

           <value>

               hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

               hibernate.hbm2ddl.auto=update

               hibernate.show_sql=false

               hibernate.format_sql=false            </value>

       </property>

       <property name="mappingResources">

           <list>

               <value>site/sambloger/domain/Users.hbm.xml</value>

               <value>site/sambloger/domain/Blog.hbm.xml</value>

               <value>site/sambloger/domain/Category.hbm.xml</value>

               <value>site/sambloger/domain/Comment.hbm.xml</value>

           </list>

       </property>

   </bean>


   <bean id="transactionManager"

         class="org.springframework.orm.hibernate5.HibernateTransactionManager">

       <property name="sessionFactory" ref="sessionFactory"/>

   </bean>

   <tx:annotation-driven transaction-manager="transactionManager"/>


   <!-- 配置Blog  spring进行管理  服务层直接调用实现与数据库的CRUD-->

   <bean id="blogDao" class="site.sambloger.dao.impl.BlogDAOImpl">

       <property name="sessionFactory" ref="sessionFactory"/>

   </bean>

   <bean id="blogService" class="site.sambloger.service.impl.BlogServiceImpl" scope="prototype">

       <property name="blogDao" ref="blogDao"/>

   </bean>

   <bean id="blogAction" class="site.sambloger.action.BlogAction">

       <property name="blogService" ref="blogService"/>

       <property name="commentService" ref="commentService"/>

   </bean>


   <!-- 配置Comment -->

   <bean id="commentDao" class="site.sambloger.dao.impl.CommentDAOImpl">

       <property name="sessionFactory" ref="sessionFactory"/>

   </bean>

   <bean id="commentService" class="site.sambloger.service.impl.CommentServiceImpl" scope="prototype">

       <property name="commentDao" ref="commentDao"/>

   </bean>

   <bean id="commentAction" class="site.sambloger.action.CommentAction">

       <property name="commentService" ref="commentService"/>

       <property name="blogService" ref="blogService"/>

   </bean>


   <!-- 配置Users -->

   <bean id="usersDao" class="site.sambloger.dao.impl.UsersDAOImpl">

       <property name="sessionFactory" ref="sessionFactory"></property>

   </bean>

   <bean id="usersService" class="site.sambloger.service.impl.UsersServiceImpl" scope="prototype">

       <property name="usersDao" ref="usersDao"/>

   </bean>

   <bean id="usersAction" class="site.sambloger.action.UsersAction">

       <property name="userService" ref="usersService"></property>

   </bean></beans>

2.Struts的配置文件 struts.xml

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

   <package name="samblog" extends="struts-default" namespace="/">

            <action name="init" class="blogAction" method="init">

                   <result name="success">/bloglist.jsp</result>

           </action>

           <action name="getBlog" class="blogAction" method="getBlog">

                   <result name="success">/displayBlog.jsp</result>

           </action>

           <action name="getAllNote" class="blogAction" method="getAllNote">

               <result name="success">/notelist.jsp</result>

           </action>

           <action name="addComment" class="commentAction" method="addComment">

               <result name="success"  type="redirect">/getBlog</result>

           </action>

   </package></struts>

3.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"><!--

   Mapping file autogenerated by MyEclipse Persistence Tools--><hibernate-mapping>

   <class name="site.sambloger.domain.Blog" table="blog">

       <!--id标签表示映射到数据库中是作为主键 其他property表示普通键-->

       <id name="id" type="java.lang.Integer">

           <column name="id" />

           <generator class="increment" />

       </id><!--该标签加N方 会有一个字段叫category_id作为外键参照1(Category)的主键字段 并且用来存储这个主键的信息-->

       <many-to-one name="category" class="site.sambloger.domain.Category"  lazy="false" cascade="all">

           <column name="category_id" not-null="true" />

       </many-to-one>


       <property name="title" type="java.lang.String">

           <column name="title" length="400" not-null="true" />

       </property>


       <property name="content" type="java.lang.String">

           <column name="content" length="4000" not-null="true" />

       </property>


       <property name="createdTime" type="java.util.Date">

           <column name="created_time" length="10" not-null="true" />

       </property><!--在一对多的关联中,在一的一方(Blog)设置inverse=”true”让多的一方来维护关联关系更有助于优化,因为可以减少执行update语句-->

       <set name="comments" inverse="true">

           <key>

               <column name="blog_id" not-null="true" />

           </key>

           <one-to-many class="site.sambloger.domain.Comment" />

       </set>

   </class></hibernate-mapping>

Spring框架的作用和好处:

   Spring框架提供了一个容器,该容器可以管理应用程序的组件,还提供了IoC和AoP机制,实现组件之间解耦,提高程序结构的灵活性,增强系统的可维护和可扩展性。

    在SSH整合开发中,利用Spring管理Service、DAO等组件,利用IoC机制实现Action和Service,Service和DAO之间低耦合调用。利用AoP机制实现事务管理、以及共通功能的切入等。

    功能是整合,好处是解耦。

Hibernate中操作并发处理(乐观锁和悲观锁)

   Hibernate框架可以使用锁的机制来解决操作并发。

   a.悲观锁

        在数据查询出来时,就给数据加一个锁,锁定。这样其他用户再执行删、改操作时不允许。当占用着事务结束,锁会自动解除。

         Hibernate采用的是数据库锁机制实现悲观锁控制。

       缺点:将并发用户操作同步开,一个一个处理。当一个用户处理时间比较长时,效率会比较低。

     b.乐观锁

        允许同时更新提交,但是最快的会成功,慢的失败。

        在记录中追加一个字段值,用该字段值当做版本。当最先提交者提交后,会自动将版本字段值提升,这样其他用户提交,会发现版本低于数据库记录目前版本,因此抛出异常提示失败。

   特点:允许用户同时处理,但只能有一个成功,其他失败,以异常方式提示。

SSH工作流程

      a.启动服务器,加载工程以及web.xml.

          (实例化Lisener,Filter等组件,将Spring容器和Struts2控制创建)

      b.客户端发送请求,所有请求进入Struts2控制器。控制器根据请求类型不同,分别处理。

          (action请求,*.action会进入struts.xml寻找<action>配置.

           其他请求,*.jsp会直接调用请求资源,生成响应信息)

      c.Struts2控制器根据<action>配置调用一个Action对象处理。

        整合方法一:将Action交给Spring容器

         (Action对象由struts2-spring-plugin.jar插件提供的                      

StrutsSpringObjectFactory负责去Spring容器获取)

        整合方法二:将Action置于Spring容器之外

         (Action对象由struts2-spring-plugin.jar插件提供的                      

StrutsSpringObjectFactory负责创建,然后到Spring容器中寻找与Action属性匹配的Bean对象,给Action对象注入。(默认采用名称匹配规则)

      d.Struts2控制器执行defaultStack拦截器、Action对象、Result等组件处理.

      e.执行Action的execute业务方法时,如果使用Service或DAO采用Spring的IoC机制调用。

      f.执行Result生成响应信息,执行后续拦截器处理

      g.将响应信息输出。

目录
相关文章
|
9月前
|
Java 关系型数据库 MySQL
JSP SSH公车拍卖系统myeclipse开发mysql数据库bs框架java编程网结构
JSP SSH公车拍卖系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0,使用java语言开发,系统主要采用B/S模式开发。
56 0
|
14天前
|
网络安全 数据安全/隐私保护
分布式系统详解--框架(Hadoop-Ssh免密登陆配置)
分布式系统详解--框架(Hadoop-Ssh免密登陆配置)
14 0
|
2月前
|
前端开发 Java 网络安全
基于SSH框架甜品商城管理系统【源码+数据库】
基于SSH框架甜品商城管理系统【源码+数据库】
|
9月前
|
SQL 前端开发 Java
JSP SSH图书系统myeclipse开发sql数据库BS模式java编程mvc结构
JSP SSH图书系统(借阅管理) 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,比较流行的ssh框架系统具有完整的源代码和数据库,myeclipse开发系统主要采用B/S模式开发。
39 0
|
9月前
|
前端开发 Java 关系型数据库
JSP仓库进销存系统ssh框架mysql数据库myeclipse开发mvc结构java
JSP 仓库进销存系统(struts2+hibernate) 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。
37 0
|
10月前
|
Java 网络安全 Spring
SSH框架学习中遇到的问题
SSH框架学习中遇到的问题
36 0
|
12月前
|
Java 应用服务中间件 网络安全
【ssh系列一】——框架搭建
建立项目(SpringMVC+Spring+hibernate的maven项目)
|
12月前
|
设计模式 开发框架 缓存
SSH框架简介篇
SSH框架简介篇
280 0
|
SQL 缓存 Java
《SSH框架》---Hibernate
《SSH框架》---Hibernate
|
Java 数据库连接 网络安全
《SSH框架》---spring
《SSH框架》---spring