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一般是導的包版本不對。