spring+hibernate+struts2; spring +mybaits+struts2框架分析和搭建
一:spring+hibernate +struts框架理解
1. 框架簡介:首先,我們要明確的是,ssh並不是一個單獨的框架,而是由三個框架的一種整合,用於構建靈活多變,易於拓展的B/S web應用程式。
SSH從分工職責上面可以分成四層:表示層,業務邏輯層,資料持久層和模型(實體)。
struts2作為應用程式的整體基礎架構,負責MVC的分離工作,控制業務跳轉,hibernate負責對持久層進行支援,Spring作為一個輕量級的Ioc容器,主要負責兩方面的工作。一方面負責查詢,定位,建立,和管理物件以及 物件關係之間的依賴關係。另一方面,spring可以給hibernate和struts提供很好的支援。
ssh應用程式基本工作流程:
1.在表示層中,通過jsp頁面實現頁面之間的互動,通過傳送請求(request)和接受響應(response),然後Struts根據配置檔案(struts-config.xml)將ActionServlet接收到的Request委派給相應的Action處理。
2.在業務層中,管理嗚嗚元件的spring Ioc容器負責向Action提供業務模型元件和該元件的協同物件資料處理元件完成業務邏輯,並提供事物處理,
3.在持久層中,則依賴hibernate的對物件化對映(orm)和資料庫互動,處理dao元件請求的資料,並返回處理結果。
優點:實現試圖,控制器,模型的徹底分離,而且還實現了業務邏輯層和資料持久層的分離,這樣前端進行修改,後端只需要進行很小的改變即可,並且資料庫的改變也不會對前端產生影響,提高了系統的可複用性,而且降低了各層之間的耦合性,更適合進行團隊開發。
spring是一個輕量級的Ioc和Aop的輕量級框架,特性:Ioc容器,輕量,面向切面,面向介面,促進其他框架。Spring的以上特性使得開發人員使用基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅限於伺服器端的開發。從簡單性、可測試性和鬆耦合的角度而言,任何Java應用都可以從Spring中受益。
struts 採用java Servlert/jsp技術,實現了基於Java EEWeb應用的MVC設計模式的應用框架,是MVC經典設計模式中的一個經典產品。Struts 2是Struts的下一代產品,是在 struts 1和WebWork的技術基礎上進行了合併的全新的Struts 2框架。其全新的Struts 2的體系結構與Struts 1的體系結構差別巨大。Struts 2以WebWork為核心,採用攔截器的機制來處理使用者的請求,這樣的設計也使得業務邏輯控制器能夠與ServletAPI完全脫離開,所以Struts 2可以理解為WebWork的更新產品
struts工作流程:
當web容器收到請求(httpServletRequest),它將請求傳遞給一個標準的過濾鏈, 流程過濾器(ActionContextCleanUp)然後經過Other filters(SiteMesh ,etc),
呼叫核心控制器FilterDispatcher,然後它呼叫ActionMapper確定請求哪個action,ActionMapper返回一個收集Action詳細資訊的ActionMaping物件。
接下來FilterDispatcher將控制權委派給ActionProxy,ActionProxy呼叫配置管理器(ConfigurationManager) 從配置檔案中讀取配置資訊(struts.xml),然後建立ActionInvocation物件,ActionInvocation在呼叫Action之前會依次的呼叫所用配置攔截器(Interceptor N) 一旦執行結果返回結果字串ActionInvocation負責查詢結果字串對應的(Result)然後執行這個Result Result會呼叫一些模版(JSP)
來呈現頁面,之後攔截器(Interceptor N)會在被執行(順序和Action執行之前相反)最後響應(HttpServletResponse)被返回在web.xml中配置的那些過濾器和(核心控制器)(FilterDispatcher)。
Struts 是MVC的一種實現,它將 Servlet和 JSP 標記(屬於 J2EE 規範)用作實現的一部分。Struts繼承了MVC的各項特性,並根據J2EE的特點,做了相應的變化與擴充套件,減弱了業務邏輯介面和資料介面之間的耦合,以及讓檢視層更富於變化
另外, struts具有頁面導航功能,使系統的脈絡更加清晰。通過一個配置檔案,即可把握整個系統各部分之間的聯絡,這對於後期的維護有著莫大的好處。
hibernate:Hibernate是一個開放原始碼的物件關係對映框架,它對JDBC進行了非常輕量級的物件封裝,使得Java程式設計師可以隨心所欲的使用物件程式設計思維來操縱資料庫。 Hibernate可以應用在任何使用JDBC的場合,既可以在Java的客戶端程式使用,也可以在Servlet/JSP的Web應用中使用,最具革命意義的是,Hibernate可以在應用EJB的J2EE架構中取代CMP,完成資料持久化的重任
hibernate核心介面:
session , sessionFactory, Configuration, Transaction ,Query
Criteria
Hibernate執行流程
1. 對JDBC訪問資料庫的程式碼做了封裝,大大簡化了資料訪問層繁瑣的重複性程式碼。
2、Hibernate是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工作,將軟體開發人員從大量相同的資料持久層相關程式設計工作中解放出來,使開發更物件化了。
3、移植性好,支援各種資料庫,如果換個資料庫只要在配置檔案中變換配置就可以了,不用改變hibernate程式碼。
4、支援透明持久化,因為hibernate操作的是純粹的(pojo)java類,沒有實現任何介面,沒有侵入性。所以說它是一個輕量級框架。
框架搭建:
環境:Win7(64) + eclipse(64)+ tomcat7(64)+ jdk7(64)環境配置
1.下載Jar包,在官網下載hibernate,sturts,spring對應版本jar包
2.建立web專案ssh
3.將對應jar包放入WebContent/WEB-INT/lib目錄下
4.配置hibernater.cfg.xml
<hibernate-configuration>
<session-factory name="">
<!-- 放入連線資料庫jar包
連線驅動
連線字串
賬戶
密碼
展示sql語句
資料庫方言
自動建立|更新|驗證資料庫表結構。如果不是此方面的需求建議set value="none"。
-->
<property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property>
<property name="hibernate.connection.password">ssh</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="hibernate.connection.username">ssh</property>
<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.format">true</property>
<!-- 載入POJO類或者.xml對映 -->
<mapping class="com.jialin.entity.User"/>
</session-factory>
</hibernate-configuration>
5.配置applicationContext.xml
<!-- 啟用spring註解支援 -->
<context:annotation-config />
如果要把資料來源之類的東西配置在spring配置檔案裡面
<!--配資料來源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl" />
<property name="username" value="ssh" />
<property name="password" value="ssh" />
</bean>
定義sessionFactory
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="default_schema">ssh</prop>
</props>
</property>
<!-- 如果使用配置檔案 -->
<!-- <property name="mappingLocations"> <list> <value>classpath:com/jialin/entity/User.hbm.xml</value>
</list> </property> -->
<property name="annotatedClasses">
<list>
<value>com.jialin.entity.User</value>
</list>
</property>
</bean>
配置事物管理器
<!-- 配置事務管理器 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 事務的傳播特性 -->
<tx:advice id="txadvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="modify*" propagation="REQUIRED" />
<!--hibernate4必須配置為開啟事務 否則 getCurrentSession()獲取不到-->
<tx:method name="*" propagation="REQUIRED" read-only="true" />
</tx:attributes>
</tx:advice>
<!-- 那些類那些方法使用事務 -->
<aop:config>
<!-- 只對業務邏輯層實施事務 -->
<aop:pointcut id="allManagerMethod"
expression="execution(* com.jialin.service.*.*(..))" />
<aop:advisor pointcut-ref="allManagerMethod" advice-ref="txadvice" />
</aop:config>
6.配置struts.xml
<!-- 將Action的建立交給spring來管理 -->
<constant name="struts.objectFactory" value="spring" />
<!-- 更改struts2請求Action的字尾名,預設為action。若想去掉字尾,設為","即可 -->
<constant name="struts.action.extension" value=","></constant>
引用其他struts檔案
<!-- 包含的配置檔案 -->
<include file="/config/struts-user.xml"></include>
<package name="abstract_struts" abstract="true" extends="struts-default"
namespace="/">
<interceptors>
<interceptor name="checkLogin" class="checkLoginInterceptor" />
<interceptor-stack name="myInterceptor">
<interceptor-ref name="checkLogin" />
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
<!-- <default-interceptor-ref name="myInterceptor" /> -->
<global-results>
<result name="checkLoginFail">/login.jsp</result>
</global-results>
</package>
<!-- 與spring整合的寫法,action等交予spring管理 -->
<package name="loginAction" namespace="/" extends="abstract_struts">
<action name="login" class="loginAction">
<result name="success" type="redirect">userMain</result>
<result name="fail">/fail.jsp</result>
</action>
<!-- 該action只負責跳轉,用struts提供的ActionSupport -->
<action name="userMain" class="userMainAction">
<result name="success">/userMain.jsp</result>
<interceptor-ref name="myInterceptor" />
</action>
</package>
<package name="userActions" namespace="/user" extends="abstract_struts">
<action name="*_*" class="userAction" method="{1}">
<result name="success" type="redirect">/{2}.jsp</result>
<result name="fail">/fail.jsp</result>
<interceptor-ref name="myInterceptor" />
</action>
</package>