SSH架構學習筆記

來源:互聯網
上載者:User

1、JaveEE的三層結構和MVC模式的關係:

     SSM架構:(Spring, Spring-mvc, Mybatis)


      SSH架構:(Spring, Struts, Hibernate)


2、Struts2架構

     (1)Struts2簡介:來自Apache基金會的軟體,http://struts.apache.org,Struts2與Struts1完全沒有關係,Struts2的前身是WebWorks。Spring MVC\Struts2\Struts1都是MVC模式的Web架構,MVC是非常流行的使用者介面設計模式。

     (2)Maven導包:struts2-core。

     (3)配置Struts2:

              <1>下載Struts2的jar包:1. 從struts.apache.org下載:解壓縮、將*.jar複製到/WEB-INF/lib檔案夾;2. 使用Maven下載:使用Eclipse內嵌搜尋,搜尋到struts2-core的座標(xml),儲存pom.xml;3. 使用maven.tedu.cn/nexus(maven.aliyun.com/nexus)線上搜尋,搜尋到struts2-core的座標(xml),儲存pom.xml。

              <2>配置主控制器:1. 控制器類:org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter在struts-core-xxxx.jar包中;2. 編輯檔案web.xml(部署描述檔案);

              <3>添加struts的設定檔:1. 位置:package中(classpath中);2. 檔案名稱:struts.xml,struts的filter會自動按照檔案名稱struts.xml找到這個檔案,檔案名稱不能錯。

      (4)建立HelloWorld項目步驟:

              <1>修改設定檔struts.xml,添加web請求的處理路徑

                     <package name="test" namespace="/test">

                      - namespace="/test" 表示處理一級路徑 /test

                     <action name="hello"class="com.tedu.HelloAction">

                      - name="hello"處理二級路徑 /test/hello.action

                      - class="com.tedu.HelloAction" 在處理請求時候執行HelloAction的execute()方法,execute方法一定有String傳回值,常見的值有“success”"error"

                     <result name="success">/WEB-INF/msg.jsp</result>

                      - 與action方法的傳回值配合,表示返回“success”時候,轉寄到msg.jsp頁面,msg.jsp 作為使用者看的視圖。

              <2>添加類com.tedu.HelloAction

                     - 包含String execute()

                     - 方法中 return "success"

              <3>添加 /WEB-INF/msg.jsp

              <4>將項目部署到Tomcat上

      (5)由控制器向頁面傳遞訊息:

              <1>在控制器中添加屬性,並且為屬性添加get方法;

              <2>在控制器方法中向屬性賦值;

              <3>在JSP頁面上使用EL運算式讀取屬性值;EL運算式實際上執行屬性的get方法,如果沒有get方法就無法擷取屬性值。

      (6)從頁面向控制器傳遞值:

              有兩種方式:

              <1>基本屬性傳遞方式

                     1. 在控制器中聲明與html表單項name屬性一致的Bean屬性;

                     2. 添加Bean屬性的getxxx setxxx方法;

                     3. Struts會在接受請求的時候,自動將表單屬性值注入到Bean屬性中。

              <2>領域模型屬性傳遞方式

                     利用領域模型打包傳遞表單資料,優點:

                     1. 可以便捷的處理表單輸入;

                     2. 特別是在表單被項目重用的時候,顯得更加方便。

                      步驟:

                     1. 建立領域模型對象  User,添加屬性id和pwd,添加bean屬性存取方法;

                     2. 在控制器中添加User屬性user和get set方法;

                     3. 在表單中的輸入項目name屬性值為user.id;

        (7)如何擷取session對象:

               <1>通過Factory 方法擷取session對象

               <2>利用注入獲得session對象

               <1>通過Factory 方法擷取session對象

                      Struts提供了ActionContext對象,這個對象可以擷取session,並且訪問session。Struts2為了降低耦合性,將HttpSession封裝在Map中,調用Map的put方法就可以將資料儲存到session中。

               <2>利用注入獲得session對象

                      使用ActionContext對象擷取Session對象,其缺點是將代碼與ActionContext對象耦合在一起,耦合度增加了。為了減少耦合,Struts2提供了Session注入方式。

               不僅僅Spring提供了注入功能,Struts2也利用注入方式工作。這裡的Session就是注入得到,還可以注入Request對象。注入的好處是徹底實現了松耦合代碼。

               步驟:

               1. 在Action類上實現SessionAware介面

                   class Login2Action implements SessionAware

               2. 在Action類中添加Session屬性,和屬性存取方法

                   private Map<String, Object> session;

                   public void setSession(Map<String, Object> session){

                            this.session = session;

                   }

               3. 在execute方法中就可以利用session屬性訪問session了

                   session.put("loginUser", user);

        Filter在容器一啟動就會建立,Servlet在第一次訪問的時候建立,如果在web.xml中加入<load-on-startup>,則在容器啟動的時候建立,Filter和Servlet建立時都調用init方法,可以在init方法裡測試什麼時候建立。

3、  UTF-8可以編碼10萬以上的文字,包括大多數現存的文字,一個中文編碼為3個位元組;GBK只可以處理中英文,包括2萬文字,一個中文編碼為2個位元組。response.setCharacterEncoding("utf-8");設定伺服器端編碼方案,response.setContentType("text/html; charset=UTF-8");設定用戶端解碼方案。

4、Spring整合Struts2

      (1)導包:struts2-core 2.3.8、struts2-spring-plugin 2.3.8、struts2-json-plugin

      (2)Struts2提供了Spring整合外掛程式struts2-spring-plugin.jar,只要將這個外掛程式添加到/WEB-INF/lib檔案夾中,就會自動將spring整合到struts2。整合以後Struts2的Action對象將由Spring容器建立。

      (3)手工整合:1. 分別到Spring和Struts2網站下載jar包;2. 將jar包複製到/WEB-INF/lib檔案夾中;3. 修改web.xml檔案添加Spring容器初始化監聽器; 4. 添加Spring設定檔。

               利用Maven整合:1. 建立Maven項目,匯入Struts2組件,並且配置struts.xml和web.xml; 2.找到struts2-spring組件座標添加到Struts2項目的pom.xml,外掛程式版本與Struts2的版本必須一致。maven會自動匯入外掛程式依賴的Spring包,這是Maven最便捷的特點。

5、(1)dispatcher:轉寄;

      (2)redirectAction:重新導向到其他Action;

      (3)stream:用於處理圖片或者下載;

      (4)json:用於處理ajax請求。

      轉寄類型是在Struts的主設定檔中定義struts-default.xml;json:在struts2-json-plugin外掛程式中定義。

      dispatcher:是預設的Result,也是最常用的類型。

      redirectAction:重新導向到其他Action,用於處理重新導向結果。org.apache.struts2.dispatcher.ServletActionRedirectResult

      stream:用於處理圖片或者下載。org.apache.struts2.dispatcher.StreamResult

      json:用於處理ajax請求。json不是struts預設的result類型,需要使用一個外掛程式來支援這個類型。org.apache.struts2.json.JSONResult

                 有兩種使用方式:(1)將Action的全部屬性發送到用戶端;

                                             (2)將Action的一個屬性發送到用戶端。

                 json返回結果必須使用struts2-json-plugin外掛程式支援,必須先匯入json外掛程式。

6、struts2也提供了攔截器功能,struts2的許多預設功能也是通過其內部的攔截器實現的。

7、值棧ValueStack

      (1)從控制器向頁面傳值的緩衝區;

      (2)ValueStack包含當前環境相關的全部對象: request、session、application等;

      (3)ValueStack包含兩個地區:一個地區是root,是一個List,儲存值,一個地區是context,是一個Map,儲存環境相關的全部對象;

      在Struts2中ValueStack是軟體的訊息中心,軟體的資料和相關環境資訊都緩衝在這個對象中,其作用與JSP中的pageContext類似,pageContext是JSP中的訊息中心。

      JSP頁面中使用<s: debug/>標籤可以展示ValueStack

8、OGNL運算式

      OGNL可以在網頁struts標籤中使用,在struts2中用於讀寫ValueStack的資料。

      (1)讀取root地區資料:從棧頂到棧底逐一搜尋Bean屬性,找到屬性就輸出;

      (2)讀寫context地區使用#key的方式尋找:#session.loginName。

      OGNL與ValueStack配合可以從控制器向頁面傳遞資料。

      ValueStack與EL

      Struts2中攔截了EL運算式,使其從ValueStack中擷取資料,也就是說使用EL就可以很好的訪問ValueStack。

9、Spring整合Struts2、Mybatis

      導包:struts2-core、struts2-spring-plugin、struts2-json-plugin、mybatis、mybatis-spring 1.2.3、dbcp 1.4、mysql 5.1.36、aspectjweaver、spring-aop、aopalliance、codec、junit。

10、Hibernate(冬眠)

      導包:hibernate-core 3.6.9、mysql。

      由於是開源軟體,其包的依賴關係不夠完善,有的Hibernate匯入以後會出現ClassNotFound異常,可以更換其他版本。

      其想法是將java的實體物件映射儲存到資料庫的表中,只需要將實體與表的映射關係定義好,Hibernate會自動的產生資料庫的SQL語句。

      Hibernate稱為ORM(對象關係映射)架構,是一種不需要寫SQL的架構。

      使用步驟:

      (1)匯入Hibernate相關包;

      (2)匯入資料庫的驅動程式;

      (3)添加Hibernate主設定檔;

      (4)添加Hibernate映射設定檔;

      (5)添加實體類,建議實體類實現equals和hashCode方法,使用Eclipse產生即可。

      (6)調用Hibernate API就可以自動產生SQL訪問資料庫了。

11、Hibernate

      (1)主鍵類型:

               利用<generator class=""></generator>支援主鍵建置原則

               <1>自增類型identity

                      文法:<generator class="identity"></generator>

                      添加使用者時,hibernate就是利用自增ID為Student產生ID,並讀取到實體物件中。自增列不能插入資料,必須由資料庫自動產生ID。

               <2>sequence序列

                      Oracle、DB2等資料庫提供了Sequence,用於產生ID,文法:

                      <generator class="sequence">

                                <param name="sequence">seq_name</param>

                      </generator>

                      只有Oracle、DB2資料庫支援,seq_name是Sequence對象的名稱。

                <3>UUID

                       Hibernate會自動調用UUID演算法產生ID。文法:

                       <generator class="uuid"></generator>

      (2)被Hibernate管理的實體物件有三種狀態:

               <1>臨時狀態:剛剛建立的對象,或者被刪除的對象,資料庫中沒有對應的記錄,這是對象的狀態為臨時狀態。調用了save或者saveOrUpdate方法以後,對象將被儲存到資料庫中,對象狀態將轉換為持久狀態。

               <2>持久狀態:儲存以後的對象或者從資料庫中擷取的對象,其狀態是持久狀態,持久狀態下改變對象的資料,將產生相應的sql語句,將對象的狀態儲存到資料庫中。

               <3>游離狀態:對象被從Session的緩衝中清理出來,對象狀態變成游離狀態,游離狀態物件脫離資料庫的聯絡,更改對象的屬性,不再影響資料庫。如果需要將游離狀態的對象資料更新到資料庫,可以調用update方法,update方法執行以後,對象又還原回持久狀態,並且將已經更改的屬性更新到資料庫。

      (3)HQL查詢

               (Hibernate Query Language)Hibernate提供一種新的查詢語言,與SQL類似,但是與資料庫無關。與SQL相近的文法,from類名,where條件,group by...,having...,select...,order by...。

              HQL與SQL不同點:

              (1)HQL物件導向,按照類名屬性進行查詢,SQL按照表、列進行查詢;

              (2)HQL不支援select *,省略就是select *,直接from;

              (3)HQL不支援函數,可以有分組函數;

              (4)HQL不支援join on。

              使用HQL:

              (1)開啟session;

              (2)建立Query對象;

              (3)使用Query對象執行HQL,返回集合;

              (4)關閉Session。

      (4)關聯關係

               在資料庫中表與表有關聯關係,反應到實體類上就體現了參考關聯性。

      (5)Hibernate的懶惰(lazy)載入現象:

               儘可能晚的情況下載入資料庫的資料到記憶體對象,使用消極式載入可以提高軟體效能。

               在對應檔上使用lazy="false"可以關閉消極式載入功能,在軟體中使用OpenSessionInViewFilter功能,可以在視圖層使用消極式載入功能。

12、Spring與Hibernate整合

      整合的目的:將Hibernate的對象交給Spring容器,由Spring容器進行管理。

      整合步驟: 

      (1)匯入Hibernate(匯入資料庫驅動,資料庫連接池(實現DataSource的類,dbcp,c3p0));分別匯入Hibernate、JDBC Driver以及串連池c3p0,串連池可以用dbcp,c3p0或阿里的druid;

      (2)匯入Spring;

      (3)匯入Spring-ORM,是Spring整合Hibernate的擴充外掛程式,這個外掛程式是Spring提供的,用於在Spring中整合支援Hibernate;

      (4)配置Spring:配置資料來源(串連池),配置Hibernate SessionFactory(把Hibernate的參數配置進去),配置交易管理,配置HibernateTemplate(封裝了Hibernate提供的CRUD方法);

               利用交易管理員,就可以將Hibernate的事務託管到Spring,利用Spring提供的註解就可以管理事務的開啟提交和關閉,可以大大簡化編碼。

      (5)編寫資料訪問層(DAO)介面;

      (6)實現DAO:利用Spring註解注入HibernateTemplate對象,就可以非常便捷的實現DAO介面,HibernateTemplate封裝了Hibernate提供的CRUD功能。

      導包:hibernate-core 3.6.9、mysql 5.1.36、c3p0 0.9.1、druid(com.alibaba)1.0.16、spring-core 3.0.5、spring-orm 3.0.5、struts2-core 2.3.24、struts2-spring-plugin 2.3.24、struts2-json-plugin 2.3.24。

      ClassNotFoundException一般是缺少包,MethodNotFoundException一般是導的包版本不對。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.