天天看點

Struts架構詳解

<b>1</b><b>、Struts應用架構介紹</b>

<b>(1)架構</b>

架構最簡單的形式是指已開發過并已測試過的軟體的程式塊,這些程式塊可以在多個軟體開發工程中重用。架構提供了一個概括的體系結構模版,可以用這個模闆來建構特定領域中的應用程式。

Framework概念并不是很新了,伴随着軟體開發的發展,在多層的軟體開發項目中,可重用、易擴充的,而且是經過良好測試的軟體元件,越來越為人們所青睐。這意味着人們可以将充裕的時間用來分析、建構業務邏輯的應用上,而非繁雜的代碼工程。

于是人們将相同類型問題的解決途徑進行抽象,抽取成一個應用架構。這也就是我們所說的Framework。Framework的體系提供了一套明确機制,進而讓開發人員很容易的擴充和控制整個framework開發上的結構。

<b>(2</b><b>)</b><b>為什麼會出現應用架構</b>

您隻要細心地研究真實的應用程式,就會發現程式大緻上由兩類性質不同的元件組成,一類與程式要處理的具體事務密切相關,我們不妨把它們叫做業務元件;另一類是應用服務。

比如說:一個稅務征管系統和一個圖書管理系統會在處理它們的業務方面存在很大的差異,這些直接處理業務的元件由于業務性質的不同不大可能在不同的系統中重用,而另一些元件如決定程式流向的控制、輸入的校驗、錯誤處理及标簽庫等這些隻與程式相關的元件在不同的系統中可以很好地得到重用。

人們自然會想要是把這些在不同應用程式中有共性的一些東西抽取出來,做成一個半成品程式,這樣的半成品就是所謂的程式架構,再做一個新的東西時就不必白手起家,而是可以在這個基礎上開始搭建。實際上,有些大型軟體企業選擇自己搭建這樣的架構。<b></b>

<b>(3)為什麼要用架構?</b>

因為軟體系統發展到今天已經很複雜了,特别是伺服器端軟體,設計到的知識,内容,問題太多。在某些方面使用别人成熟的架構,就相當于讓别人幫你完成一些基礎工作,你隻需要集中精力完成系統的業務邏輯設計。而且架構一般是成熟,穩健的,他可以處理系統很多細節問題,比如,事物處理,安全性,資料流控制等問題。還有架構一般都經過很多人使用,是以結構很好,是以擴充性也很好,而且它是不斷更新的,你可以直接享受别人更新代碼帶來的好處。

架構一般處在低層應用平台(如J2EE)和高層業務邏輯之間的中間層。<b></b>

<b>(3)</b><b>Struts </b><b>Web</b><b>應用架構</b>

Struts 是 Apache 軟體基金會(Apache Software Foundation)資助的一個為開發基于MVC模式應用架構的開源架構,是利用Java Servlet和JSP、XML等方面的技術來實作建構Web應用的一項非常有用的技術,它也是基于MVC模式的Web應用最經典架構。

Struts架構的主要架構設計和開發者是Craig R.McClanahan。Struts 是目前Java Web MVC架構中不争的王者。經過長達五年的發展,Struts已經逐漸成長為一個穩定、成熟的架構,并且占有了MVC架構中最大的市場佔有率。

Struts把Servlet、JSP、自定義标簽和資訊資源(message resources)整合到一個統一的架構中,主要由一系列的架構類、輔助類和定制的JSP标記庫構成。開發人員利用其進行開發時不用再自己編碼實作全套MVC模式,極大的節省了時間。

<b>2</b><b>、架構的組成</b><b></b>

一個設計良好的架構一般分為三層:

<b>(1</b><b>)接口層</b>

這一層要盡量使用interface,在這一層中你要考慮到你現在的、将來的可能支援的功能,但不需要去實作它,隻定義到接口層次就可以了。如Struts中的插件接口PlugIn。

<b>(2</b><b>)抽象層</b>

這一層要針對你目前的需求做定制,對你的需求中的通用邏輯做實作。這一層應該出現大量的抽象類。如Struts中的ActionServlet、Action和ActionForm等類。

<b>(3</b><b>)實作層</b>

不用說了,把前面兩層沒有做掉的事情在這一層都做了吧。如Struts中背景實作的各種功能<b></b>

<b>3</b><b>、為什麼要提出</b><b>Struts</b>

<b>(1)背景</b>

<b>由于我們開發Web應用的複雜度随着系統的複雜度的要求越來越來複雜。特别是在代碼重用,代碼移植、代馬可插扒等問題上出現了許多重複開發、維護困難等</b>。進而提出了Struts開發架構。它的設計目的是從整體上減輕構造企業Web應用的負擔,并提供國際化和資料庫連接配接池支援。

Struts 是一組互相協作的類、servlet 和 JSP 标記,它們組成一個可重用的 MVC 2 設計。這個定義表示 Struts 是一個架構,而不是一個庫,但 Struts 也包含了豐富的标記庫和獨立于該架構工作的實用程式類。

<b>(2)采用Struts的優點</b>

在實際開發中,MVC架構開發相當費時,Struts 實作了MVC這種架構,但又擴充了該MVC架構。這樣使得系統的開發就像“填空”一樣進行,相當快速。<b></b>

l  采用Strust可以加快開發速度、增強系統的靈活性、降低系統的藕合性(因為它的三個應用層松散地耦合在一起)和易于系統的維護。

l  分工明确:業務層與表示層分開,使得管理人員可以在小組内配置設定責任。網頁設計人員與JAVA程式員各司其職。

l  簡化頁面:使用标記,把邏輯處理的代碼分離開來。

l  通過将問題劃分為更小的元件,當技術空間或問題空間中出現變化時,您就有更多的機會重用代碼。

<b>(3)Struts的缺點</b>

l  有限的适用範圍:Struts 是一種基于 Web 的 MVC 解決方案,是以必須用 HTML、JSP 檔案和 Servlet 來實作它。

l  J2EE 應用程式支援

l  複雜性:在将問題分為幾個部分的同時也引入了複雜性(在強健性增強的同時,也意味着複雜性的增加)。<b></b>

<b>4</b><b>、</b><b>Struts</b><b>壓縮包内容</b>

下載下傳後的*.zip封包件包含兩個目錄,lib和webapps。在lib目錄中有使用struts建立應用程式是所需的檔案:

<b>檔案</b>

<b>描述</b>

jdbc2_0-stdext.jar

包含JDBC2.0 Optional Package API類。如果我們要使用struts提供的資料資源,就需要将這個檔案拷貝到WEB-INF\lib下

Struts.jar

包含struts中所有的java類。同樣也需要拷貝到WEB-INF\lib下

*.tld

标記庫描述器檔案,描述了多個struts标記庫中的自定義标記。同樣要拷貝到WEB-INF\lib下

在webapps目錄下有如下檔案:

<b>Web</b><b>應用程式</b>

Struts-blank.war

一個簡單的web應用程式

Struts-documentation.war

包含struts站點上所有struts文檔

Struts-example.war

Struts很多特性的示範

Struts-exercisetaglib.war

主要用于對自定義标簽庫進行增加而使用的測試頁,但也可以示範如何使用struts标記

Struts-template.war

包含struts模闆标記的介紹和範例

Struts-upload.war

一個簡單的例子,示範如何使用struts架構上傳檔案

<b> </b>

<b>5</b><b>、Struts的整體架構</b>

(1)Struts架構的MVC元件結構圖

在struts架構中,模型分為兩個部分:系統的内部狀态和可以改變狀态的操作(事務邏輯)。内部狀态通常由一組ActinForm JavaBean表示。根據設計或應用程式複雜度的不同,這些Bean可以是自包含的并具有持續的狀态,或隻在需要時才獲得資料(從某個資料庫)。

大型應用程式通常在方法内部封裝事務邏輯(操作),這些方法可以被擁有狀态資訊的bean調用。比如購物車bean,它擁有使用者購買商品的資訊,可能還有checkOut()方法用來檢查使用者的信用卡,并向倉庫發定貨資訊。

小型程式中,操作可能會被内嵌在Action類,它是struts架構中控制器角色的一部分。當邏輯簡單時這個方法很适合。建議使用者将事務邏輯(要做什麼)與Action類所扮演的角色(決定做什麼)分開。

Struts為Model部分提供了Action和ActionForm兩種Bean對象:所有的Action處理器對象都是開發者從Struts的Action類派生的子類。Action處理器對象封裝了具體的處理邏輯,調用業務邏輯子產品,并且把響應送出到合适的View元件以産生響應。

Struts提供的ActionForm元件對象,它可以通過定義屬性描述用戶端表單資料。開發者可以從它派生子類對象,利用它和Struts提供的自定義标記庫結合可以實作對用戶端的表單資料的良好封裝和支援,Action處理器對象可以直接對它進行讀寫,而不再需要和request、response對象進行資料互動。

(2)Struts架構的處理流程

l  首先,控制器(ActionServlet)進行初始化工作,讀取配置檔案(struts-config.xml),為不同的Struts子產品初始化相應的ModuleConfig對象。比如配置檔案中的Action映射定義都儲存在ActionConfig集合中。相應地有ControlConfig集合、FormBeanConfig集合、ForwardConfig集合和MessageResourcesConfig集合等。

l  Struts架構的處理流程清楚的展現了MVC系統的特點,所有的頁面請求都将發送到Struts的前端控制器ActionServlet中(是以如果要進行前置處理,可以繼承ActionServlet并重寫process()方法),同時ActionServlet也将根據struts-config.xml配置檔案中的設定(<b>&lt;action&gt;标簽</b>)來決定轉向到那個後端控制器Action類。

l  當頁面中的Form表單被送出時,ActionForm将自動地封裝和處理該Form表單中的資料。同時在Action的子類中可以存取存儲在ActionForm中的Form表單資料。

l  Action的子類将處理所獲得的存儲在ActionForm中的Form表單資料,處理和響應客戶請求,它還調用背景的JavaBean元件完成具體的業務邏輯。同時也按照在struts-config.xml檔案内的forward标簽内容(如&lt;forward name="sayHello" path="/sayHello.jsp"/&gt;),将結果交由某個JSP頁面顯示。

<b>(3)</b><b>Struts</b><b>體系組成</b><b></b>

<b>       </b>Struts體系可以看成兩個相對獨立的部分:

第一個部分是Struts API,用于編寫支援Struts的應用元件;

第二部分是Struts的JSP标記庫,由html、bean、logic和template四個标記組成。

Struts的兩個部分有着各自不同的使用者。對于規模較小的項目,同一個使用者可能同時使用這兩個部分;但對于規模較大的項目,通常開發者使用API元件,而負責HTML頁面布局的人使用标記庫。<b></b>

<b>(4</b><b>)</b>struts-config.xml配置檔案<b></b>

架構中的模型(M)、視圖(V)、控制器(C) 三個部分是通過struts-config.xml配置檔案将其聯系在一起。一個标準的struts-config檔案包含如下結構,有一點要引起大家的注意的,就是,struts-config.xml中配置的各個項目是有一定的順序要求的,幾個主要項目的順序大緻是這樣的:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"

注意:各個标簽項目是有一定的順序要求的!

"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd >

<struts-config>

<b><data-sources /</b><b>> // </b><b>定義資料源</b>

<b><form-beans /</b><b>> // </b><b>定義ActionForm</b>

<b><global-exceptions /</b><b>> // </b><b>定義全局異常</b>

<b><global-forwards /</b><b>> // </b><b>定義全局轉向url</b>

<b><action-mappings /</b><b>> // </b><b>定義action</b>

<b><controller /</b><b>> // </b><b>配置Controller</b>

<b><message-resources /</b><b>> // </b><b>配置資源檔案</b>

<b><plug-in /</b><b>> // </b><b>配置資源檔案</b>

</struts-config>

<b>(5)Struts與其它</b><b>架構的不同</b><b></b>

<b>       </b>在Struts應用中,有一個稱為ActionServlet的主排程程式(或稱為配置設定器)。不過,并非所有的請求都必須通過ActionServlet(以“*.do”結尾的URL都是Struts請求)。使用者的請求目标可以是非Struts的頁面,也可以是那些使用了Struts标記庫但不使用Struts請求配置設定服務的頁面。這正是Struts體系的優點之一:按需使用。許多程式設計架構要求你要麼不用,要麼全部使用,而且一旦你決定使用,以後要悔改從前的錯誤就會付出高昂的代價。Struts按需使用的優點與這類系統形成了強烈對比。

本文轉自 weijie@java 51CTO部落格,原文連結:http://blog.51cto.com/weijie/87113,如需轉載請自行聯系原作者