【Struts2(一)】Strust2入門XML配置-action編寫
1.1 案例需求
1.1.1 需求概述
CRM系統中有客戶的顯示的功能,效果如圖:
我們實際的開發中會使用Struts2作為Web的架構
1.2 Struts2的概述
1.2.1 Struts2的概述
Struts是一種基於MVC模式的輕量級Web框架,它自問世以來,就受到了廣大Web開發者的關注,並廣泛應用於各種企業系統的開發中。目前掌握Struts框架幾乎成為Web開發者的必備技能之一。接下來將針對Struts2的特點、安裝以及執行流程等內容進行詳細的說明。
1.2.1.1 什麼是Struts2
在介紹Struts2之前,先來認識下Struts1。Struts1是最早的基於MVC模式的輕量級Web框架,它能夠合理的劃分程式碼結構,幷包含驗證框架、國際化框架等多種實用工具框架。但是隨著技術的進步,Struts1的侷限性也越來越多的暴露出來。為了符合更加靈活、高效的開發需求,Struts2框架應運而生。
Struts2是Struts1的下一代產品,是在Struts1和WebWork技術的基礎上進行合併後的全新框架(WebWork是由OpenSymphony組織開發的,致力於元件化和程式碼重用的J2EE Web框架,它也是一個MVC框架)。雖然Struts2的名字與Struts1相似,但其設計思想卻有很大不同。實質上,Struts2是以WebWork為核心的,它採用攔截器的機制來處理使用者的請求。這樣的設計也使得業務邏輯控制器能夠與ServletAPI完全脫離開,所以Struts2可以理解為WebWork的更新產品。
Struts2擁有優良的設計和功能,其優勢具體如下:
- 專案開源,使用及拓展方便,天生優勢。
- 提供Exception處理機制
- Result方式的頁面導航,通過Result標籤很方便的實現重定向和頁面跳轉。
- 通過簡單、集中的配置來排程業務類,使得配置和修改都非常容易。
- 提供簡單、統一的表示式語言來訪問所有可供訪問的資料。
- 提供標準、強大的驗證框架和國際化框架。
- 提供強大的、可以有效減少頁面程式碼的標籤。
- 提供良好的Ajax支援。
- 擁有簡單的外掛,只需放入相應的JAR包,任何人都可以擴充套件Struts2框架,比如自定義攔截器、自定義結果型別、自定義標籤等,為Struts2定製需要的功能,不需要什麼特殊配置,並且可以釋出給其他人使用。
- 擁有智慧的預設設定,不需要另外進行繁瑣的設定。使用預設設定就可以完成大多數專案程式開發所需要的功能。
Struts2是一個基於MVC設計模式的WEB層框架。
Struts2的核心相對於Struts1來講已經發生巨大變化。
上面列舉的就是Struts2的一系列技術優勢,只需對它們簡單瞭解即可,在學習了後面的知識後,會慢慢對這些技術優勢有更好的理解和體會。
那麼除了Struts2之外,還有那些優秀的Web層框架呢?
1.2.1.2 常見的web層框架
Struts2
Struts1
Webwork
SpringMVC
Web層框架都會有一個特點,就是基於前端控制器模式實現的。
1.2.1.3 Web層框架基於前端控制器模型設計
什麼是前端控制器模式呢?我們來看下圖,在圖中傳統方式的開發,有一次請求就會對應一個Servlet。這樣會導致出現很多Servlet。而Struts2將所有的請求都先經過一個前端控制器,在前段控制器中實現框架的部分功能,剩下具體操作要提交到具體的Action中。那麼所有的請求都會經過前段控制器,那用什麼來實現前端控制器呢?過濾器就是最好的一個實現方式,因為需要所有的請求都可以被過濾器攔截,然後在過濾器中實現部分的功能。所以Struts2的前端控制器也是有過濾器來實現的。
1.2.2 Struts2的入門
1.2.2.1 下載Struts2的開發環境
1.2.2.2 解壓Struts2開發包
apps :Struts2提供的應用,war檔案:web專案打成war包。直接放入到tomcat可以執行。
docs :Struts2的開發文件和API
lib :Strtus2框架的開發的jar包
src :Struts2的原始碼
1.2.2.3 建立web專案,引入jar包
首先,需要我們建立一個Web工程,引入相關的jar包檔案。引入哪些jar包呢?將struts-2.3.24框架目錄中的lib資料夾開啟,得到Struts2開發中可能用到的所有JAR包(此版本有107個JAR包)。實際的開發中,我們根本不用引入這麼多的jar包。
要進行struts2的基本的開發,可以struts-2.3.24中的apps下的一些示例程式碼,其中struts2-blank.war是一個struts的空工程。我們只需要將struts2-blank.war解壓後進入到WEB-INF下的lib中檢視。
struts-blank專案下找jar包
上面這些包就是struts2的基本的開發包了,那麼這些包都是什麼含義呢?
檔名 | 說明 |
---|---|
asm-3.3.jar | 操作Java位元組碼的類庫 |
asm-commons-3.3.jar | 提供了基本事件的表現形式 |
asm-tree-3.3.jar | 提供了基於物件的表現形式 |
struts-core-2.3.24.jar | Struts2框架的核心類庫 |
xwork-core-2.3.24.jar | WebWork核心庫,Struts2的構建基礎 |
freemarker-2.3.22.jar | Struts2標籤模板使用的類庫 |
javassist-3.11.0.GA.jar | javaScript位元組碼直譯器 |
commons-fileupload-1.3.1.jar | Struts2檔案上傳元件依賴包 |
commons-io-2.2.jar | Struts2的輸入輸出,傳檔案依賴的jar |
commons-lang-2.4.jar | 包含一些資料型別工具,是對java.lang包的增強 |
log4j-api-2.2.jar | Struts2的日誌管理元件依賴包的api |
log4j-core-2.2.jar | Struts2的日誌管理元件依賴包 |
從表可以看出,此版本的Struts2專案所依賴的基礎JAR包共13個。Struts2根據版本的不同所依賴的基礎JAR包可能不完全相同,不過基本上變化不大,讀者可以視情況而定。
需要注意的是,通常使用Struts2的Web專案並不需要利用到Struts2的全部JAR包,因此沒有必要一次將Struts2的lib目錄下的全部JAR包複製到Web專案的WEB-INF/lib路徑下,而是根據需要,再新增相應的JAR包。
那麼Struts2的基本jar包已經引入完成了,我們使用Struts2都是從頁面發起請求到伺服器,再有伺服器處理請求,響應到頁面的這個過程。接下來我們就從頁面開發進行Struts的開發吧。
1.2.2.4 建立一個JSP頁面
首先需要在WebContent下建立一個目錄demo1,在demo1下建立一個新的jsp。在jsp中編寫一個Action的訪問路徑。
點選該連線,需要提交請求到伺服器的Action。那麼接下來需要編寫Action去處理請求。
1.2.2.5 編寫Action的類
在src下建立一個包com.itheima.action,在該包下新建一個HelloAction的類。在這個類中編寫一個公有的、返回值為String型別的方法,這個方法叫做execute,且方法沒有任何引數。(因為這個方法最終要被反射執行)
Action類編寫好了以後,Struts2框架如何識別它就是一個Action呢,那麼我們需要對Action類進行配置。
1.2.2.6 對Action進行配置
這個時候,我們還需要觀察apps中的示例程式碼,WEB-INF的classes中,有一個名稱為struts.xml的檔案,這個檔案就是struts2的配置檔案。
我們在開發中需要將struts.xml檔案引入到工程的src下,因為src下內容釋出到web伺服器中就是WEB-INF下的classes中。將struts.xml中原有的內容刪除掉,然後配置上自己編寫的Action類就可以了。
在src下建立(提供)名稱叫做struts.xml的配置檔案
Action類已經配置好了,配置好了以後大家考慮下,現在是否可以執行呢?其實現在還不行,因為之前我們介紹過,Web層的框架都有一個特點就是基於前端控制器的模式,這個前端控制器是由過濾器實現的,所以我們需要配置Struts的核心過濾器。這個過濾器的名稱是StrutsPrepareAndExecuteFilter。
1.2.2.7 配置前端控制器(核心過濾器)
Struts框架要想執行,所有的請求都需要經過這個前端控制器(核心過濾器),所以需要配置這個核心過濾器。因為這個過濾器完成了框架的部分的功能。那麼我們接下來對過濾器進行配置。
web.xml中配置核心過濾器
那麼到這,我們程式就可以執行了,但是到了Action以後,頁面並沒有跳轉,只是會在控制檯輸出Action中的內容,往往我們在實際的開發中,處理了請求以後,還需要進行頁面的跳轉,如何完成完成Struts2的頁面的跳轉呢?
這個時候我們需要修改Action類中的execute方法的返回值了,這個方法返回了一個String型別,這個String型別的值就是一個邏輯檢視(邏輯檢視:相當於對一個真實的頁面,取了一個別名。)那麼我們來修改一個Action類。
1.2.2.8 改寫Action中的方法的返回值
修改Action中的execute方法的返回值,我們先任意給其返回一個字串,比如返回一個success的字串。這個字串就作為一個邏輯檢視名稱。
返回一個success的字串了,這個success的字串又怎麼能代表一個頁面呢?這個時候我們又要對struts2進行配置了。這個時候需要修改struts.xml,對Action的配置進行完善。
1.2.2.9 改寫struts.xml
開啟struts.xml檔案,對<action>標籤進行完善,在<action>標籤中配置一個<result>標籤,這個標籤中的name屬性就是之前方法返回的那個字串的邏輯檢視名稱success。標籤內部就是跳轉的頁面。
1.2.2.10 編寫success.jsp
到這兒,我們整個程式就執行完畢了。我們可以啟動伺服器並且測試專案。
1.2.3 Struts2的執行流程
1.2.3.1 分析Struts2的執行流程
從客戶端傳送請求過來,先經過前端控制器(核心過濾器 StrutsPrepareAndExecuteFilter)過濾器中執行一組攔截器(一組攔截器 就會完成部分功能程式碼),到底哪些攔截器執行了呢,在Struts2中定義很多攔截器,在其預設棧中的攔截器會得到執行,這個我們可以通過斷點除錯的方式測試,攔截器執行完成後,就會執行目標Action,在Action中返回一個結果檢視,根據Restult的配置進行頁面的跳轉。
當用戶訪問某一個Action的時候,先經過核心過濾器,在核心過濾器中執行一組攔截器(這組攔截器實現部分功能),執行目標Action,根據Action的返回值,進行頁面跳轉。
以上內容是Struts2的執行流程,但是可能大家在編寫測試的時候會遇到一些問題,比如在編寫XML配置檔案的時候沒有提示。
1.2.3.2 配置struts.xml中的提示(在不聯網的情況下)
開發過程中如果可以上網,struts.xml 會自動快取 dtd,提供提示功能。如果不能上網,則需要我們手動配置本地dtd,這樣才能夠使struts.xml產生提示。具體配置方法如下:
1.首先,在eclipse中,依次點選工具欄中的window和下方的preferences彈出對話方塊。然後在左側的搜尋框中輸入xml,顯示出所有與xml有關的選項後,點選XML Catalog。
2.接下來在已下載的Struts2解壓包的lib包中找到其核心包struts2-core-2.3.24.jar,使用解壓工具將其解壓成資料夾形式。解壓後,我們會看到資料夾中有幾個以.dtd結尾的檔案。我們所使用的是struts-2.3.dtd。
3.將此dtd使用notepad++等文字開啟後,找到圖中選中內容,將其http地址複製。
4.點選Eclipse中彈出對話方塊中右側的Add按鈕,此時會彈出Add XML Catalog Element介面。點選File System按鈕,找到本地剛才解壓資料夾中的struts-2.3.dtd,然後將介面中的Key type改為URI,並將剛才複製的地址黏貼到Key中。如圖所示。
在圖中點選OK後,關閉已開啟的struts.xml,然後再重新開啟struts.xml,此時再編寫struts.xml內容的時候,就會有提示了。
1.2.4.1 Struts2的配置檔案載入順序
每次從客戶端傳送請求到伺服器都要先經過Struts2的核心過濾器StrutsPrepareAndExecuteFilter,這個過濾器有兩個功能:預處理和執行。在預處理中主要就是來載入配置檔案的。對應的就是過濾器中的init方法,而執行是用來執行一組攔截器完成部分功能的,對應的是過濾器的doFilter方法。所以我們如果要去了解Struts2的配置檔案的載入順序,那麼我們需要查詢過濾器的init方法。
在init方法中,呼叫了init的initDispatcher的方法來載入配置檔案,進入到該程式碼中:
我們發現這個方法又呼叫了dispatcher的init方法。進入init方法內部:
- init_DefaultProperties() ; ----載入default.properties
- init_TraditionalXmlConfigurations(); ----載入struts-default.xml、struts-plugin.xml、struts.xml
- init_LegacyStrutsProperties(); ----載入struts.properties
- init_LegacyStrutsProperties(); ----載入struts.properties
- init_CustomConfigurationProviders(); ----載入配置提供類
- init_FilterInitParameters() ; // [6] ----載入web.xml中過濾器初始化引數
- init_AliasStandardObjects() ; // [7] ----載入Bean物件
- default.properties
- struts-default.xml
- struts-plugin.xml
- struts.xml
- struts.properties
- web.xml
注意:後配置的常量的值會覆蓋先配置的常量的值。
1.2.4.2 Action的配置
Struts2框架的核心配置檔案是struts.xml檔案,該檔案主要用來配置Action和請求的對應關係。
<package>相關配置
Struts2框架的核心元件是Action和攔截器,它使用包來管理Action和攔截器。每個包就是多個Action、多個攔截器、多個攔截器引用的集合。在struts.xml檔案中,package元素用於定義包配置,每個package元素定義了一個包配置。package元素的常用屬性,如表所示。
表中就是package元素的常用屬性,其中,在配置包時,必須指定name屬性,就是包的標識。除此之外,還可以指定一個可選的extends屬性,extends屬性值必須是另一個包的name屬性值,但該屬性值通常都設定為struts-default,這樣包中的Action就具有了struts2框架預設的攔截器等功能了。除此之外,struts2還提供了一種所謂的抽象包,抽象包不能包含Action定義。為了顯示指定一個包是抽象包,可以為該package元素增加abstract="true"屬性。
在package中還有namespace的配置,namespaces屬性與action標籤的name屬性共同決定了訪問路徑。
- package標籤稱為包,這個包與Java中的包的概念不一致。包為了更好管理action的配置。
- package標籤的屬性
name :包的名稱,只有在一個專案中不重名即可。
extends :繼承哪個包,通常值為struts-default。
namespace :名稱空間,與<action>標籤中的name屬性共同決定訪問路徑。
名稱空間有三種寫法:
帶名稱的名稱空間 :namespace=”/aaa”
根名稱空間 :namespance=”/”
預設名稱空間 :namespace=””
abstract :抽象的,用於其他包的繼承。
action相關配置
Action對映是框架中的基本“工作單元”。Action對映就是將一個請求的URL對映到一個Action類,當一個請求匹配某個Action名稱時,框架就使用這個對映來確定如何處理請求。在struts.xml檔案中,通過<action>元素對請求的Action和Action類進行配置。
<action>元素中共有4個屬性,這4個屬性的說明如下所示。
- action標籤配置Action類。
- action標籤的屬性
name :與namespace共同決定訪問路徑
class :Action類的全路徑
method :執行Action中的哪個方法的方法名,預設值execute
converter :用於設定型別轉換器
1.2.4.3 Struts2 常量的配置
Struts2的這些常量大多在預設的配置檔案中已經配置好,但根據使用者需求的不同,開發的要求也不同,可能需要修改這些常量,修改的方法就是在配置檔案對常量進行重新配置。
在Struts2的框架中,提供了非常多的常量:(在default.properties)
- struts.i18n.encoding=UTF-8 ----Struts2中所有的post請求的中文亂碼不用處理。
- struts.action.extension=action,, ----Struts2請求的預設的副檔名。預設副檔名是.action或者什麼都不寫。
在Struts2中修改一些常量的值:
- 修改常量的值,可以有三個位置進行修正
struts.xml中進行修改
struts.properties中進行修改
web.xml中進行修改
1.2.4.4 分模組開發的配置
在實際開發中,我們通常很多人都需要修改同一個配置檔案就是struts.xml。因為這個檔案是Struts2的核心配置檔案。而且這個檔案一旦改錯了一點,那麼會導致整個專案都會出現問題,所以Struts2提供了<include>標籤解決這個問題。
<include>元素用來在一個struts.xml配置檔案中包含其他的配置檔案,包含配置體現的是軟體工程中的“分而治之”原則。Struts2允許將一個配置檔案分解成多個配置檔案,從而提高配置檔案的可讀性。Struts2預設只加載WEB-INF/classes下的struts.xml檔案,但一旦通過多個xml檔案來配置Action,就必須通過struts.xml檔案來包含其他配置檔案。
為了讓大家更直觀地理解如何在struts.xml檔案中進行包含配置,接下來通過一段示例來說明,具體如下:
1.2.5 Struts2的 Action的訪問
在struts2的應用開發中,Action作為框架的核心類,實現對使用者請求的處理,Action類被稱為業務邏輯控制器。一個Action類代表一次請求或呼叫,每個請求的動作都對應於一個相應的Action類,一個Action類是一個獨立的工作單元。也就是說,使用者每次請求,都會轉到一個相應的Action類裡面,由這個Action類進行處理。簡而言之,Action就是用來處理一次使用者請求的物件。
實現Action控制類共有3種方式,接下來,分別對它們進行講解,具體如下。
1.2.5.1 Action的編寫方式
Action類是POJO的類
在Struts2中,Action可以不繼承特殊的類或不實現任何特殊的介面,僅僅是一個POJO。POJO全稱Plain Ordinary Java Object(簡單的Java物件),只要具有一部分getter/setter方法的那種類,就可以稱作POJO。一般在這個POJO類中,要有一個公共的無參構造方法(採用預設的構造方法就可以)和一個execute()方法。定義格式如下:
execute()方法的要求如下:
- 方法的許可權修飾符為public。
- 返回一個字串,就是指示的下一個頁面的result。
- 方法沒有引數
也就是說,滿足上述要求的POJO都可算作是Struts2的Action實現。
通常會讓開發者自己編寫Action類或者實現Action介面或者繼承ActionSupport類。
Action類實現一個Action的介面
為了讓使用者開發的Action類更規範,Struts2提供了一個Action介面,使用者在實現Action控制類時,可以實現Struts2提供的這個Action介面。
Action介面定義了Struts的Action處理類應該實現的規範,Action介面中的具體程式碼如下所示。
Action介面位於com.opensymphony.xwork2包中,這個接口裡只定義了一個execute()方法,該介面的規範規定了Action處理類應該包含一個execute()方法,該方法返回一個字串。除此之外,該介面還定義了5個字串常量,它們的作用是統一execute()方法的返回值。
Action介面中提供了5個已經定義的常量如下:
由於Xwork的Action介面簡單,為開發者提供的幫助較小,所以在實際開發過程中,Action類很少直接實現Action介面,通常都是從ActionSupport類繼承。
Action類繼承ActionSupport類(推薦)
ActionSupport類本身實現了Action介面,是Struts2中預設的Action介面的實現類,所以繼承ActionSupport就相當於實現了Action介面。ActionSupport類還實現了Validateable、ValidationAware、TextProvider、LocaleProvider和Serializable等介面,來為使用者提供更多的功能。
ActionSupport類中提供了許多預設方法,這些預設方法包括獲取國際化資訊的方法、資料校驗的方法、預設的處理使用者請求的方法等。實際上,ActionSupport類,則會大大簡化Action開發。
Action的類已經會編寫了,如果要執行這個Action,可以通過前面的配置來完成,但是之前的方式有一個缺點,就是多次請求不能對應同一個Action,因為實際開發中,一個模組的請求通常由一個Action類處理就好了 ,否則會造成Action類過多。
1.2.5.2 Action的訪問
Action的訪問不是難題,因為之前已經訪問過了,但是出現一個問題一次請求現在對應一個Action,那麼如果請求很多對應很多個Action 現在要處理的問題就是要讓一個模組的操作提交到一個Action中。
其實我們學過在<action>的標籤中有一個屬性method,通過method的配置來指定Action中的某個方法執行。
解決Action的訪問的問題的方式一:通過配置method屬性完成
但是這種方式我們會發現,同一個Action類就被配置了很多次,只是修改了後面的method的值。那麼能不能配置簡單化呢?也就是一個Action類,只配置一次就好了?這個時候我們就需要使用萬用字元的配置方式了。
解決Action的訪問的問題的方式二:通過萬用字元的方式進行配置(*****)
編寫Action:
配置Action:
在<action>的name屬性中使用的*代表任意字元,method中的{1}代表name屬性中出現的第1個*所代替的字元。
這個時候我們就只配置一個就可以了,在上述程式碼中,當客戶端傳送/linkman_save.action 這樣的請求時,action元素的name屬性就被設定成linkman_save,method屬性就被設定成save。當客戶端傳送/linkman_update.action這樣的請求時,action元素的name屬性就被設定為linkman_update,method屬性也被設定成update。
當然使用萬用字元是開發中常用的方式,Struts2還有一種解決這類問題的辦法,這種大家可以作為擴充套件內容來學習。
解決Action的訪問的問題的方式三:動態方法訪問
開啟動態方法訪問
動態方法訪問主要在Struts2中預設是不開啟的,如果想要使用需要先去開啟一個常量。
動態方法訪問主要的控制是在頁面端,所以編寫Action和配置Action都很簡單,關鍵是訪問路徑的編寫。
編寫訪問路徑
1.3 CRM的客戶列表顯示
1.3.1 搭建開發環境
1.3.1.1 建立web專案,引入jar包
Struts2
Hibernate
1.3.1.2 引入配置檔案
Struts2
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 配置Struts2的常量 -->
<constant name="struts.action.extension" value="action"/>
</struts>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>struts2_crm</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 配置Struts2的核心過濾器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
Hibernate
核心配置 hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 連線資料庫的基本引數 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///struts2_crm</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">abc</property>
<!-- 配置Hibernate的方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 可選配置================ -->
<!-- 列印SQL -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化SQL -->
<property name="hibernate.format_sql">true</property>
<!-- 自動建立表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 配置C3P0連線池 -->
<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<!--在連線池中可用的資料庫連線的最少數目 -->
<property name="c3p0.min_size">5</property>
<!--在連線池中所有資料庫連線的最大數目 -->
<property name="c3p0.max_size">20</property>
<!--設定資料庫連線的過期時間,以秒為單位,
如果連線池中的某個資料庫連線處於空閒狀態的時間超過了timeout時間,就會從連線池中清除 -->
<property name="c3p0.timeout">120</property>
<!--每3000秒檢查所有連線池中的空閒連線 以秒為單位-->
<property name="c3p0.idle_test_period">3000</property>
<!-- 設定事務隔離級別 -->
<property name="hibernate.connection.isolation">4</property>
<!-- 配置當前執行緒繫結的Session -->
<property name="hibernate.current_session_context_class">thread</property>
<!-- 引入對映 -->
</session-factory>
</hibernate-configuration>
對映檔案
日誌檔案 log4j.properties
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c\:mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### set log levels - for more verbose logging change 'info' to 'debug' ###
# error warn info debug trace
log4j.rootLogger= info, stdout
1.3.1.3 建立資料庫和表
CREATE TABLE `cst_customer` (
`cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客戶編號(主鍵)',
`cust_name` varchar(32) NOT NULL COMMENT '客戶名稱(公司名稱)',
`cust_source` varchar(32) DEFAULT NULL COMMENT '客戶資訊來源',
`cust_industry` varchar(32) DEFAULT NULL COMMENT '客戶所屬行業',
`cust_level` varchar(32) DEFAULT NULL COMMENT '客戶級別',
`cust_phone` varchar(64) DEFAULT NULL COMMENT '固定電話',
`cust_mobile` varchar(16) DEFAULT NULL COMMENT '行動電話',
PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
1.3.1.4 建立包結構
HibernateUtils.java
package com.itheima.utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/**
* Hibernate的工具類
*
*/
public class HibernateUtils {
public static final Configuration cfg;
public static final SessionFactory sf;
static{
cfg = new Configuration().configure();
sf = cfg.buildSessionFactory();
}
public static Session openSession(){
return sf.openSession();
}
public static Session getCurrentSession(){
return sf.getCurrentSession();
}
}