您好,登錄后才能下訂單哦!
這篇文章主要講解了“SSH框架中對象調(diào)用流程是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“SSH框架中對象調(diào)用流程是什么”吧!
SSH不是一個框架,而是多個框架(struts+spring+hibernate)的集成,是目前較流行的一種Web應(yīng)用程序開源集成框架,用于構(gòu)建靈活、易于擴展的多層Web應(yīng)用程序。
集成SSH框架的系統(tǒng)從職責(zé)上分為四層:表示層、業(yè)務(wù)邏輯層、數(shù)據(jù)持久層和域模塊層,以幫助開發(fā)人員在短期內(nèi)搭建結(jié)構(gòu)清晰、可復(fù)用性好、維護方便的Web應(yīng)用程序。其中使用Struts作為系統(tǒng)的整體基礎(chǔ)架構(gòu),負責(zé)MVC的分離,在Struts框架的模型部分,控制業(yè)務(wù)跳轉(zhuǎn),利用Hibernate框架對持久層提供支持,Spring做管理,管理struts和hibernate。
SSH框架的系統(tǒng)是基于MVC的。Struts 是一個很好的MVC框架,主要技術(shù)是Servlet和Jsp。Struts的MVC設(shè)計模式可以使我們的邏輯變得很清晰,讓我們寫的程序?qū)哟畏置鳌;赟truts開發(fā)可以簡化開發(fā)難度,提高開發(fā)效率。
Spring 提供了管理業(yè)務(wù)對象的一致方法,并鼓勵注入對接口編程而不是對類編程的良好習(xí)慣,使我們的產(chǎn)品在最大程度上解耦。
Hibernate 是用來持久化數(shù)據(jù)的,提供了完全面向?qū)ο蟮臄?shù)據(jù)庫操作。Hibernate對JDBC進行了非常輕量級的封裝,它使得與關(guān)系型數(shù)據(jù)庫打交道變得非常輕松。
在Struts+Spring+Hibernate系統(tǒng)中,對象之間的調(diào)用流程如下:
Struts——>Spring——>Hibernate
JSP——>Action——>Service——>DAO——>Hibernate
比如:
<?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&characterEncoding=UTF-8&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進行管理 服務(wù)層直接調(diào)用實現(xiàn)與數(shù)據(jù)庫的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>
<?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>
<?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標(biāo)簽表示映射到數(shù)據(jù)庫中是作為主鍵 其他property表示普通鍵--> <id name="id" type="java.lang.Integer"> <column name="id" /> <generator class="increment" /> </id> <!--該標(biāo)簽加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> <!--在一對多的關(guān)聯(lián)中,在一的一方(Blog)設(shè)置inverse=”true”讓多的一方來維護關(guān)聯(lián)關(guān)系更有助于優(yōu)化,因為可以減少執(zhí)行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框架提供了一個容器,該容器可以管理應(yīng)用程序的組件,還提供了IoC和AoP機制,實現(xiàn)組件之間解耦,提高程序結(jié)構(gòu)的靈活性,增強系統(tǒng)的可維護和可擴展性。
在SSH整合開發(fā)中,利用Spring管理Service、DAO等組件,利用IoC機制實現(xiàn)Action和Service,Service和DAO之間低耦合調(diào)用。利用AoP機制實現(xiàn)事務(wù)管理、以及共通功能的切入等。
功能是整合,好處是解耦。
Hibernate框架可以使用鎖的機制來解決操作并發(fā)。
a.悲觀鎖
在數(shù)據(jù)查詢出來時,就給數(shù)據(jù)加一個鎖,鎖定。這樣其他用戶再執(zhí)行刪、改操作時不允許。當(dāng)占用著事務(wù)結(jié)束,鎖會自動解除。
Hibernate采用的是數(shù)據(jù)庫鎖機制實現(xiàn)悲觀鎖控制。
缺點:將并發(fā)用戶操作同步開,一個一個處理。當(dāng)一個用戶處理時間比較長時,效率會比較低。
b.樂觀鎖
允許同時更新提交,但是最快的會成功,慢的失敗。
在記錄中追加一個字段值,用該字段值當(dāng)做版本。當(dāng)最先提交者提交后,會自動將版本字段值提升,這樣其他用戶提交,會發(fā)現(xiàn)版本低于數(shù)據(jù)庫記錄目前版本,因此拋出異常提示失敗。
特點:允許用戶同時處理,但只能有一個成功,其他失敗,以異常方式提示。
a.啟動服務(wù)器,加載工程以及web.xml.
(實例化Lisener,Filter等組件,將Spring容器和Struts2控制創(chuàng)建)
b.客戶端發(fā)送請求,所有請求進入Struts2控制器??刂破鞲鶕?jù)請求類型不同,分別處理。
(action請求,*.action會進入struts.xml尋找<action>配置.
其他請求,*.jsp會直接調(diào)用請求資源,生成響應(yīng)信息)
c.Struts2控制器根據(jù)<action>配置調(diào)用一個Action對象處理。
整合方法一:將Action交給Spring容器
(Action對象由struts2-spring-plugin.jar插件提供的
StrutsSpringObjectFactory負責(zé)去Spring容器獲取)
整合方法二:將Action置于Spring容器之外
(Action對象由struts2-spring-plugin.jar插件提供的
StrutsSpringObjectFactory負責(zé)創(chuàng)建,然后到Spring容器中尋找與Action屬性匹配的Bean對象,給Action對象注入。(默認采用名稱匹配規(guī)則)
d.Struts2控制器執(zhí)行defaultStack攔截器、Action對象、Result等組件處理.
e.執(zhí)行Action的execute業(yè)務(wù)方法時,如果使用Service或DAO采用Spring的IoC機制調(diào)用。
f.執(zhí)行Result生成響應(yīng)信息,執(zhí)行后續(xù)攔截器處理
g.將響應(yīng)信息輸出。
感謝各位的閱讀,以上就是“SSH框架中對象調(diào)用流程是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對SSH框架中對象調(diào)用流程是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。