struts框架原理+Servlet的生命周期
Struts的起源
Struts 是作為Apache Jakarta項目的組成部分。該項目的目標(biāo)是為建立Java web 應(yīng)用程序而提供的一個開源框架,目前大家一般使用的版本為1.1,但也出現(xiàn)了1.2。通過使用struts 框架可以改進和提高Java Server Pages (JSPs)、Servlet、標(biāo)簽庫以及面向?qū)ο蟮募夹g(shù)在web應(yīng)用程序中的應(yīng)用。應(yīng)用Struts框架可以減少你應(yīng)用MVC(Model- View -Controller)設(shè)計模式的開發(fā)時間,從而提高開發(fā)效率。把Struts應(yīng)用于J2ee客戶端,應(yīng)該是一個不錯的選擇。
Struts的工作原理
談到Struts,我們就不得不提到MVC設(shè)計模式。MVC即Model-View-Controller的縮寫,它是web應(yīng)用當(dāng)中的常用的設(shè)計模式。MVC 減弱了業(yè)務(wù)邏輯接口和數(shù)據(jù)接口之間的耦合,以及讓視圖層更富于變化。
Struts是MVC的一種實現(xiàn),它很好的結(jié)合了Jsp,Java Servlet,Java Bean ,Taglib等技術(shù)。那么我們來看看Struts框架的工作原理:
控 制:在Struts中,ActionServlet起著一個控制器(Controller)的作用。ActionServlet是一個通用的控制組件。這 個控制組件提供了處理所有發(fā)送到Struts的HTTP請求的入口點。它截取和分發(fā)這些請求到相應(yīng)的動作類(這些動作類都是Action類的子類)。另外 控制組件也負責(zé)用相應(yīng)的請求參數(shù)填充 Action Form(通常稱之為FromBean),并傳給動作類(通常稱之為ActionBean)。動作類實現(xiàn)核心商業(yè)邏輯,它可以訪問java bean 或調(diào)用EJB。所有這些控制邏輯利用Struts-config.xml文件來配置。
視圖:主要是由Jsp來控制頁面輸出的。它接收到Action Form中的數(shù)據(jù),利用html,taglib,bean,logic等顯示數(shù)據(jù)。
模型:在Struts中,主要存在三種bean,分別是:Action,ActionForm,EJB或者Java Bean。ActionForm用來封裝客戶請求信息,Action取得ActionForm中的數(shù)據(jù),再由EJB或者Java Bean進行處理。
Struts 優(yōu)點與缺點
優(yōu)點:1.利用Struts提供的taglib可以大大節(jié)約開發(fā)時間。2. 表現(xiàn)與邏輯分離。 3.維護擴展比較方便。 4 便于團隊開發(fā)
缺點:大量的使用標(biāo)簽,對于初學(xué)者難度較大。
總結(jié)
通過使用Struts框架,可以提高系統(tǒng)的可維護性和可重用性。
==========================================================
Servlet運行在Servlet容器中,其生命周期由容器來管理。Servlet的生命周期通過javax.servlet.Servlet接口中的init()、service()和destroy()方法來表示。
Servlet的生命周期包含了下面4個階段:
(1)加載和實例化
Servlet容器負責(zé)加載和實例化Servlet。當(dāng)Servlet容器啟動時,或者在容器檢測到需要這個Servlet來響應(yīng)第一個請求時,創(chuàng) 建Servlet實例。當(dāng)Servlet容器啟動后,它必須要知道所需的Servlet類在什么位置,Servlet容器可以從本地文件系統(tǒng)、遠程文件系 統(tǒng)或者其他的網(wǎng)絡(luò)服務(wù)中通過類加載器加載Servlet類,成功加載后,容器創(chuàng)建Servlet的實例。因為容器是通過Java的反射API來創(chuàng)建 Servlet實例,調(diào)用的是Servlet的默認構(gòu)造方法(即不帶參數(shù)的構(gòu)造方法),所以我們在編寫Servlet類的時候,不應(yīng)該提供帶參數(shù)的構(gòu)造方 法。
(2)初始化
在Servlet實例化之后,容器將調(diào)用Servlet的init()方法初始化這個對象。初始化的目的是為了讓Servlet對象在處理客戶端請 求前完成一些初始化的工作,如建立數(shù)據(jù)庫的連接,獲取配置信息等。對于每一個Servlet實例,init()方法只被調(diào)用一次。在初始化期 間,Servlet實例可以使用容器為它準(zhǔn)備的ServletConfig對象從Web應(yīng)用程序的配置信息(在web.xml中配置)中獲取初始化的參數(shù) 信息。在初始化期間,如果發(fā)生錯誤,Servlet實例可以拋出ServletException異常或者UnavailableException異常 來通知容器。ServletException異常用于指明一般的初始化失敗,例如沒有找到初始化參數(shù);而UnavailableException異常 用于通知容器該Servlet實例不可用。例如,數(shù)據(jù)庫服務(wù)器沒有啟動,數(shù)據(jù)庫連接無法建立,Servlet就可以拋出 UnavailableException異常向容器指出它暫時或永久不可用。
(3)請求處理
Servlet容器調(diào)用Servlet的service()方法對請求進行處理。要注意的是,在service()方法調(diào)用之前,init()方法 必須成功執(zhí)行。在service()方法中,Servlet實例通過ServletRequest對象得到客戶端的相關(guān)信息和請求信息,在對請求進行處理 后,調(diào)用ServletResponse對象的方法設(shè)置響應(yīng)信息。在service()方法執(zhí)行期間,如果發(fā)生錯誤,Servlet實例可以拋出 ServletException異常或者UnavailableException異常。如果UnavailableException異常指示了該實 例永久不可用,Servlet容器將調(diào)用實例的destroy()方法,釋放該實例。此后對該實例的任何請求,都將收到容器發(fā)送的HTTP 404(請求的資源不可用)響應(yīng)。如果UnavailableException異常指示了該實例暫時不可用,那么在暫時不可用的時間段內(nèi),對該實例的任 何請求,都將收到容器發(fā)送的HTTP 503(服務(wù)器暫時忙,不能處理請求)響應(yīng)。
(4)服務(wù)終止
當(dāng)容器檢測到一個Servlet實例應(yīng)該從服務(wù)中被移除的時候,容器就會調(diào)用實例的destroy()方法,以便讓該實例可以釋放它所使用的資源, 保存數(shù)據(jù)到持久存儲設(shè)備中。當(dāng)需要釋放內(nèi)存或者容器關(guān)閉時,容器就會調(diào)用Servlet實例的destroy()方法。在destroy()方法調(diào)用之 后,容器會釋放這個Servlet實例,該實例隨后會被Java的垃圾收集器所回收。如果再次需要這個Servlet處理請求,Servlet容器會創(chuàng)建 一個新的Servlet實例。
在整個Servlet的生命周期過程中,創(chuàng)建Servlet實例、調(diào)用實例的init()和destroy()方法都只進行一次,當(dāng)初始化完成后,Servlet容器會將該實例保存在內(nèi)存中,通過調(diào)用它的service()方法,為接收到的請求服務(wù)。
如果需要讓Servlet容器在啟動時即加載Servlet,可以在web.xml文件中配置<load-on-startup>元素。
posted on 2009-07-20 22:08 彭偉 閱讀(1331) 評論(0) 編輯 收藏 所屬分類: 框架技術(shù)分區(qū)