1
、Struts應用框架介紹
(1)框架
框架最簡單的形式是指已開發過並已測試過的軟件的程序塊,這些程序塊可以在多個軟件開發工程中重用。框架提供了一個概括的體系結構模版,可以用這個模板來構建特定領域中的應用程序。
Framework概念並不是很新了,伴隨着軟件開發的發展,在多層的軟件開發項目中,可重用、易擴展的,而且是經過良好測試的軟件組件,越來越為人們所青睞。這意味着人們可以將充裕的時間用來分析、構建業務邏輯的應用上,而非繁雜的代碼工程。
於是人們將相同類型問題的解決途徑進行抽象,抽取成一個應用框架。這也就是我們所說的Framework。Framework的體系提供了一套明確機制,從而讓開發人員很容易的擴展和控制整個framework開發上的結構。
(2)為什么會出現應用框架
您只要細心地研究真實的應用程序,就會發現程序大致上由兩類性質不同的組件組成,一類與程序要處理的具體事務密切相關,我們不妨把它們叫做業務組件;另一類是應用服務。
比如說:一個稅務征管系統和一個圖書管理系統會在處理它們的業務方面存在很大的差異,這些直接處理業務的組件由於業務性質的不同不大可能在不同的系統中重用,而另一些組件如決定程序流向的控制、輸入的校驗、錯誤處理及標簽庫等這些只與程序相關的組件在不同的系統中可以很好地得到重用。
人們自然會想要是把這些在不同應用程序中有共性的一些東西抽取出來,做成一個半成品程序,這樣的半成品就是所謂的程序框架,再做一個新的東西時就不必白手起家,而是可以在這個基礎上開始搭建。實際上,有些大型軟件企業選擇自己搭建這樣的框架。
(3)為什么要用框架?
因為軟件系統發展到今天已經很復雜了,特別是服務器端軟件,設計到的知識,內容,問題太多。在某些方面使用別人成熟的框架,就相當於讓別人幫你完成一些基礎工作,你只需要集中精力完成系統的業務邏輯設計。而且框架一般是成熟,穩健的,他可以處理系統很多細節問題,比如,事物處理,安全性,數據流控制等問題。還有框架一般都經過很多人使用,所以結構很好,所以擴展性也很好,而且它是不斷升級的,你可以直接享受別人升級代碼帶來的好處。
框架一般處在低層應用平台(如J2EE)和高層業務邏輯之間的中間層。
(3)
Struts
Web應用框架
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模式,極大的節省了時間。

2
、框架的組成
一個設計良好的框架一般分為三層:
(1)接口層
這一層要盡量使用interface,在這一層中你要考慮到你現在的、將來的可能支持的功能,但不需要去實現它,只定義到接口層次就可以了。如Struts中的插件接口PlugIn。
(2)抽象層
這一層要針對你當前的需求做定制,對你的需求中的通用邏輯做實現。這一層應該出現大量的抽象類。如Struts中的ActionServlet、Action和ActionForm等類。
(3)實現層
不用說了,把前面兩層沒有做掉的事情在這一層都做了吧。如Struts中后台實現的各種功能
3
、為什么要提出
Struts
(1)背景
由於我們開發Web應用的復雜度隨着系統的復雜度的要求越來越來復雜。特別是在代碼重用,代碼移植、代馬可插扒等問題上出現了許多重復開發、維護困難等。從而提出了
Struts開發框架。
它的設計目的是從整體上減輕構造企業Web應用的負擔,並提供國際化和數據庫連接池支持。
Struts 是一組相互協作的類、servlet 和 JSP 標記,它們組成一個可重用的 MVC 2 設計。這個定義表示 Struts 是一個框架,而不是一個庫,但 Struts 也包含了豐富的標記庫和獨立於該框架工作的實用程序類。
(2)采用Struts的優點
在實際開發中,MVC框架開發相當費時,Struts 實現了MVC這種框架,但又擴充了該MVC框架。這樣使得系統的開發就像“填空”一樣進行,相當快速。
l
采用Strust可以加快開發速度、增強系統的靈活性、降低系統的藕合性(因為它的三個應用層松散地耦合在一起
)和易於系統的維護。
l
分工明確:業務層與表示層分開,使得管理人員可以在小組內分配責任。網頁設計人員與JAVA程序員各司其職。
l
簡化頁面:使用標記,把邏輯處理的代碼分離開來。
l
通過將問題划分為更小的組件,當技術空間或問題空間中出現變化時,您就有更多的機會重用代碼。
(3)Struts的缺點
l
有限的適用范圍:Struts 是一種基於 Web 的 MVC 解決方案,所以必須用 HTML、JSP 文件和 Servlet 來實現它。
l
J2EE 應用程序支持
l
復雜性:在將問題分為幾個部分的同時也引入了復雜性(在強健性增強的同時,也意味着復雜性的增加)。
4、Struts壓縮包內容
下載后的*.zip包文件包含兩個目錄,lib和webapps。在lib目錄中有使用struts創建應用程序是所需的文件:
文件
|
描述
|
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目錄下有如下文件:
Web
應用程序
|
描述
|
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框架上傳文件
|
5
、Struts的整體框架
(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配置文件中的設置(<action>標簽)來決定轉向到那個后端控制器Action類。
l
當頁面中的Form表單被提交時,ActionForm將自動地封裝和處理該Form表單中的數據。同時在Action的子類中可以存取存儲在ActionForm中的Form表單數據。
l
Action的子類將處理所獲得的存儲在ActionForm中的Form表單數據,處理和響應客戶請求,它還調用后台的
JavaBean組件
完成具體的業務邏輯。同時也按照在struts-config.xml文件內的forward標簽內容(如<forward name="sayHello" path="/sayHello.jsp"/>),將結果交由某個JSP頁面顯示。
(3)Struts體系組成
Struts體系可以看成兩個相對獨立的部分:
第一個部分是Struts API,用於編寫支持Struts的應用組件;
第二部分是Struts的JSP標記庫,由html、bean、logic和template四個標記組成。
Struts的兩個部分有着各自不同的用戶。對於規模較小的項目,同一個用戶可能同時使用這兩個部分;但對於規模較大的項目,通常開發者使用API組件,而負責HTML頁面布局的人使用標記庫。
(4)struts-config.xml配置文件
框架中的模型(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"
注意:各個標簽項目是有一定的順序要求的!
|
<struts-config>
<data-sources /> // 定義數據源
<form-beans /> // 定義ActionForm
<global-exceptions /> // 定義全局異常
<global-forwards /> // 定義全局轉向url
<action-mappings /> // 定義action
<controller /> // 配置Controller
<message-resources /> // 配置資源文件
<plug-in /> // 配置資源文件
</struts-config>
(5)Struts與其它框架的不同
在Struts應用中,有一個稱為ActionServlet的主調度程序(或稱為分配器)。不過,並非所有的請求都必須通過ActionServlet(以“*.do”結尾的URL都是Struts請求)。用戶的請求目標可以是非Struts的頁面,也可以是那些使用了Struts標記庫但不使用Struts請求分配服務的頁面。這正是Struts體系的優點之一:按需使用。許多編程框架要求你要么不用,要么全部使用,而且一旦你決定使用,以后要悔改從前的錯誤就會付出高昂的代價。Struts按需使用的優點與這類系統形成了強烈對比。
本文出自 “魏傑的技術專欄” 博客,請務必保留此出處http://weijie.blog.51cto.com/340746/87113