ssh框架怎么运行 ssh框架工作流程



文章插图
ssh框架怎么运行 ssh框架工作流程

文章插图
SSH不是一个框架 , 而是多个框架(struts+spring+hibernate)的集成 , 是目前较流行的一种Web应用程序开源集成框架 , 用于构建灵活、易于扩展的多层Web应用程序 。
集成SSH框架的系统从职责上分为四层:表示层、业务逻辑层、数据持久层和域模块层 , 以帮助开发人员在短期内搭建结构清晰、可复用性好、维护方便的Web应用程序 。其中使用Struts作为系统的整体基础架构 , 负责MVC的分离 , 在Struts框架的模型部分 , 控制业务跳转 , 利用Hibernate框架对持久层提供支持 , Spring做管理 , 管理struts和hibernate 。
SSH框架的系统是基于MVC的 。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/beanshttp://www.springframework.org/schema/beans/spring-beans-3.1.xsdhttp://www.springframework.org/schema/txhttp://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=http://www.mnbkw.com/jxjc/172518/”jdbc:mysql://localhost:3306/samblog?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true”>
</property>
<property name=”user” value=http://www.mnbkw.com/jxjc/172518/”root”>
<property name=”password” value=http://www.mnbkw.com/jxjc/172518/”123456″>
<property name=”driverClass” value=http://www.mnbkw.com/jxjc/172518/”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 Configuration2.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″?>
<!DOCTYPEhibernate-mapping PUBLIC “-//Hibernate/Hibernate Mapping DTD3.0//EN””http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd”>
<!–
Mappingfile 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生成响应信息 , 执行后续拦截器处理
【ssh框架怎么运行 ssh框架工作流程】g.将响应信息输出 。