1. 程式人生 > >【Struts2(一)】Strust2入門XML配置-action編寫

【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的開發環境

http://struts.apache.org/

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物件
  1. default.properties
  2. struts-default.xml
  3. struts-plugin.xml
  4. struts.xml
  5. struts.properties
  6. 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();
	}
}

1.3.1.5 引入相應頁面

1.3.2 程式碼實現

1.3.2.1 修改請求路徑

1.3.2.2 編寫Action、Service、DAO 

1.3.2.3 配置Action 

1.3.2.4 編寫頁面,在頁面中顯示相應的資料

1.3.2.4 測試程式