1.1 Struts 1.0 和1.1版本
當(dāng)前主要有兩個(gè)版本,struts 1.0 release 和 struts 1.1 beta 3。Struts 1.0 和1.1差別很大,主要有兩點(diǎn):
- Struts 1.1 中引用了很多 apache其他項(xiàng)目的類包,如:xml 解析、日志、驗(yàn)證等,因此struts1.1 的包結(jié)構(gòu)與1.0 完全不同。在struts 1.1環(huán)境下,一個(gè)webapp 要成功運(yùn)行,除了struts.jar 外,還需要引用12個(gè)包。
- Struts 1.1 增加了很多新功能,例如,支持sub-applications, 動(dòng)態(tài)FormBean,異常處理,驗(yàn)證,支持Tile templating等。
盡管struts 1.0 是正式發(fā)布版,但是結(jié)構(gòu)已經(jīng)老化,功能也已經(jīng)固化。所以我們的Framework不選用struts 1.0, 而選用 struts 1.1。
1.2支持struts的應(yīng)用服務(wù)器
根據(jù)apache官方網(wǎng)站的說(shuō)法,struts幾乎支持所有的servlet containers, 下面是幾種主要的servlet containers
Servlet Container |
版本 |
iPlanet Application Server | 6.0sp2 or higher, 6.5 |
Tomcat | 3.2.x, 4.0 or higher |
Weblogic | 6.0 or higher |
Websphere | 3.5 or higher |
Orion | 1.0 or higher |
Resin | 1.2 or higher |
JRun | 3.0 or higher |
1.3配置說(shuō)明
我們公司目前項(xiàng)目中使用較多的應(yīng)用服務(wù)器是iPlanet Application Server, Tomcat。Struts 1.1 在這兩個(gè)應(yīng)用服務(wù)器下已經(jīng)配置通過(guò)。
Tomcat 與struts結(jié)合的很好,只需要將xxx.war 放到 webapp 目錄下,啟動(dòng)Tomcat 即可,不需要其他額外的配置。
iPlanet 配置復(fù)雜一些,主要原因是xml parser 版本不一致,和struts 相關(guān)類不能加載。具體的配置說(shuō)明請(qǐng)見(jiàn)《如何在 iAS 6.x 中配置Struts 1.1 beta x》。
在其他的應(yīng)用服務(wù)器上,還沒(méi)有嘗試struts, 今后根據(jù)項(xiàng)目需要會(huì)作進(jìn)一步的研究。
struts框架
2.1 struts 體系結(jié)構(gòu)
struts framework是MVC 模式的體現(xiàn),下面分別從模型、視圖、控制來(lái)看看struts的體系結(jié)構(gòu)(Architecture)。下圖顯示了struts framework的體系結(jié)構(gòu)響應(yīng)客戶請(qǐng)求時(shí),各個(gè)部分工作的原理。
Struts體系結(jié)構(gòu)
2.1.1 從視圖角度(View)
主要由JSP建立,struts自身包含了一組可擴(kuò)展的自定義標(biāo)簽庫(kù)(TagLib),可以簡(jiǎn)化創(chuàng)建用戶界面的過(guò)程。目前包括:Bean Tags,HTML Tags,Logic Tags,Nested Tags,Template Tags。
2.1.2從模型角度(Model)
模型主要是表示一個(gè)系統(tǒng)的狀態(tài)(有時(shí)候,改變系統(tǒng)狀態(tài)的業(yè)務(wù)邏輯操作也也劃分到模型中)。在Struts中,系統(tǒng)的狀態(tài)主要有ActiomForm Bean體現(xiàn),一般情況下,這些狀態(tài)是非持久性的。如果需要將這些狀態(tài)轉(zhuǎn)化為持久性數(shù)據(jù)存儲(chǔ),Struts本身也提供了Utitle包,可以方便的與數(shù)據(jù)庫(kù)操作。
2.1.3 從控制器角度(Controller)
在Struts framework中, Controller主要是ActionServlet,但是對(duì)于業(yè)務(wù)邏輯的操作則主要由Action、ActionMapping、ActionForward這幾個(gè)組件協(xié)調(diào)完成。其中,Action扮演了真正的業(yè)務(wù)邏輯的實(shí)現(xiàn)者,而ActionMapping和ActionForward則指定了不同業(yè)務(wù)邏輯或流程的運(yùn)行方向。
2.2 struts 的組件
框架中所使用的組件:
ActionServlet | 控制器 |
ActionClass | 包含事務(wù)邏輯 |
ActionForm | 顯示模塊數(shù)據(jù) |
ActionMapping | 幫助控制器將請(qǐng)求映射到操作 |
ActionForward | 用來(lái)指示操作轉(zhuǎn)移的對(duì)象 |
ActionError | 用來(lái)存儲(chǔ)和回收錯(cuò)誤 |
Struts標(biāo)記庫(kù) | 可以減輕開(kāi)發(fā)顯示層次的工作 |
2.3 struts 配置文件
Struts-config.xml集中了所有頁(yè)面的導(dǎo)航定義。對(duì)于WEB項(xiàng)目,通過(guò)配置文件可迅速把握其脈絡(luò),這不管是對(duì)于前期的開(kāi)發(fā),還是后期的維護(hù)或升級(jí)都是方便的。掌握Struts-config.xml是掌握Struts的關(guān)鍵所在。
在struts的早先版本中,只有一個(gè)struts配置文件struts-config.xml。但是,對(duì)大型項(xiàng)目來(lái)說(shuō),使用和修改這個(gè)配置文件,會(huì)成為瓶頸。在struts1.1中,支持sub-Application ,可以定義多個(gè)配置文件協(xié)同工作。
通過(guò)struts配置文件struts-config.xml 將struts各個(gè)組件聯(lián)系在一起。在struts-config.xml 中可以定義下面內(nèi)容:
- 全局轉(zhuǎn)發(fā)
- ActionMapping類
- ActionForm bean
- JDBC數(shù)據(jù)源
2.3.1 配置全局轉(zhuǎn)發(fā)
全局轉(zhuǎn)發(fā)用來(lái)在JSP頁(yè)之間創(chuàng)建邏輯名稱映射。全局轉(zhuǎn)發(fā)的例子:
<global-forwards>
<forwardname="logoff"path="/logoff.do"/> <forwardname="logon"path="/logon.jsp"/> <forwardname="registration"path="/registration.jsp"/> <forwardname="success"path="/mainMenu.jsp"/> </global-forwards> |
屬性 | 描述 |
Name | 全局轉(zhuǎn)發(fā)的名字 |
Path | 與目標(biāo)URL的相對(duì)路徑 |
2.3.2 配置ActionMapping
ActionMapping對(duì)象幫助進(jìn)行框架內(nèi)部的流程控制,它們可將請(qǐng)求URI映射到Action類,并且將Action類與ActionForm bean相關(guān)聯(lián)。ActionServlet在內(nèi)部使用這些映射,并將控制轉(zhuǎn)移到特定Action類的實(shí)例。所有Action類使用perform()或者execute()方法實(shí)現(xiàn)特定應(yīng)用程序代碼,返回一個(gè)ActionForward對(duì)象,其中包括響應(yīng)轉(zhuǎn)發(fā)的目標(biāo)頁(yè)面名稱。例如:
<action-mappings>
<actionpath="/logon" type="org.apache.struts.webapp.example.LogonAction" name="logonForm" scope="session" input="logon"> </action> <forward name="failure" path="/error.jsp"/> <forward name="success" path="/index.jsp"/> </ action-mappings> |
屬性 |
描述 |
Path |
Action類的相對(duì)路徑 |
Name |
與本操作關(guān)聯(lián)的Action bean的名稱 |
Type |
連接到本映射的Action類的全稱(可有包名) |
Scope |
ActionForm bean的作用域(請(qǐng)求或會(huì)話) |
Prefix |
用來(lái)匹配請(qǐng)求參數(shù)與bean屬性的前綴 |
Suffix |
用來(lái)匹配請(qǐng)求參數(shù)與bean屬性的后綴 |
attribute |
作用域名稱。 |
className |
ActionMapping對(duì)象的類的完全限定名默認(rèn)的類是org.apache.struts.action.ActionMapping |
input |
輸入表單的路徑,指向bean發(fā)生輸入錯(cuò)誤必須返回的控制 |
unknown |
設(shè)為true,操作將被作為所有沒(méi)有定義的ActionMapping的URI的默認(rèn)操作 |
validate |
設(shè)置為true,則在調(diào)用Action對(duì)象上的perform()方法前,ActionServlet將調(diào)用ActionForm bean的validate()方法來(lái)進(jìn)行輸入檢查 |
通過(guò)<forward>元素,可以定義資源的邏輯名稱,該資源是Action類的響應(yīng)要轉(zhuǎn)發(fā)的目標(biāo)。
屬性 | 描述 |
Id | ID |
ClassName | ActionForward類的完全限定名,默認(rèn)是org.apache.struts.action.ActionForward |
Name | 操作類訪問(wèn)ActionForward時(shí)所用的邏輯名 |
Path | 響應(yīng)轉(zhuǎn)發(fā)的目標(biāo)資源的路徑 |
redirect | 若設(shè)置為true,則ActionServlet使用sendRedirect()方法來(lái)轉(zhuǎn)發(fā)資源 |
2.3.3 配置ActionForm Bean
ActionServlet使用ActionForm來(lái)保存請(qǐng)求的參數(shù),這些bean的屬性名稱與HTTP請(qǐng)求參數(shù)中的名稱相對(duì)應(yīng),控制器將請(qǐng)求參數(shù)傳遞到ActionForm bean的實(shí)例,然后將這個(gè)實(shí)例傳送到Action類。例子:
<form
beans > <form bean name="bookForm" type="BookForm"/> </form beans> |
屬性 |
描述 |
Id |
ID |
className |
ActionForm bean的完全限定名,默認(rèn)值是org.apache.struts.action.ActionFormBean |
Name |
表單bean在相關(guān)作用域的名稱,這個(gè)屬性用來(lái)將bean與ActionMapping進(jìn)行關(guān)聯(lián) |
Type |
類的完全限定名 |
2.3.4 配置JDBC數(shù)據(jù)源
例子:
<data-sources>
<data-source> <set-property property="autoCommit" value="false"/> <set-property property="description" value="Example Data Source Configuration"/> <set-property property="driverClass" value="org.postgresql.Driver"/> <set-property property="maxCount" value="4"/> <set-property property="minCount" value="2"/> <set-property property="password" value="mypassword"/> <set-property property="url" value="jdbc:postgresql://localhost/mydatabase"/> <set-property property="user" value="myusername"/> </data-source> </data-sources> |
屬性 | 描述 |
description | 數(shù)據(jù)源的描述 |
autoCommit | 數(shù)據(jù)源創(chuàng)建的連接所使用的默認(rèn)自動(dòng)更新數(shù)據(jù)庫(kù)模式 |
driverClass | 數(shù)據(jù)源所使用的類,用來(lái)顯示JDBC驅(qū)動(dòng)程序接口 |
loginTimeout | 數(shù)據(jù)庫(kù)登陸時(shí)間的限制,以秒為單位 |
maxCount | 最多能建立的連接數(shù)目 |
minCount | 要?jiǎng)?chuàng)建的最少連接數(shù)目 |
password | 數(shù)據(jù)庫(kù)訪問(wèn)的密碼 |
readOnly | 創(chuàng)建只讀的連接 |
User | 訪問(wèn)數(shù)據(jù)庫(kù)的用戶名 |
url | JDBC的URL |
通過(guò)指定關(guān)鍵字名稱,Action類可以訪問(wèn)數(shù)據(jù)源,比如:
javax.sql.DataSource ds = servlet.findDataSource(“conPool”);
javax.sql.Connection con = ds.getConnection();
struts標(biāo)記庫(kù)
struts 標(biāo)記庫(kù)包含4種類型的標(biāo)記,分別是:
- struts-bean taglib:在訪問(wèn)bean和bean屬性時(shí)使用的tag,也包含一些消息顯示的tag。
- struts-html taglib:用來(lái)生成動(dòng)態(tài)HTML用戶界面和窗體的tag。
- struts-logic taglib :用來(lái)管理根據(jù)條件生成輸出文本,和其它一些用來(lái)控制的信息。
- struts-template taglib:用來(lái)定義模板機(jī)制。
Struts提供了功能強(qiáng)大的Taglib,充分使用這些Tag,能最大限度的發(fā)揮Struts的作用。
由于標(biāo)記庫(kù)功能強(qiáng)大,所以掌握它需要花費(fèi)一定的時(shí)間。目前我們可以先從 struts-html taglib 學(xué)起,主要精力還是要先放在理解掌握struts導(dǎo)航功能上。
文檔《struts 標(biāo)記庫(kù)》可以幫助學(xué)習(xí)掌握struts taglib.
可視化設(shè)計(jì)工具和代碼生成器Camino
Camino 是基于 struts framework的可視化建模工具。使用camino 可以實(shí)現(xiàn)快速設(shè)計(jì)和開(kāi)發(fā),主要特點(diǎn)有:
- 支持struts 1.0 和 struts 1.1
- 通過(guò)storyboard , 可視化定義頁(yè)面導(dǎo)航流程,配置struts-config.xml 文件。
- Jsp converter wizard 功能可以將普通jsp 轉(zhuǎn)換成帶struts-html taglib 的jsp
- Code Generator wizard 功能可以自動(dòng)生成 Action 和 FormBean 類的框架。
- Camin 3.0 還提供了驗(yàn)證器和Preview Jsp 的功能。
目前Camino的版本有2.05 和 3.0, 可以下載試用版。Camino 自帶了幫助文檔,可以方便學(xué)習(xí)Camino。
Struts example
Struts 1.1 beta 3 的包中包含了幾個(gè)example, 可以幫助學(xué)習(xí)struts。
Web應(yīng)用程序 | 描述 |
Struts-blank.war | 一個(gè)簡(jiǎn)單的web應(yīng)用程序 |
Struts-documentation.war | 包含struts站點(diǎn)上所有struts文檔 |
Struts-example.war | Struts很多特性的示范 |
Struts-exercisetaglib.war | 主要用于對(duì)自定義標(biāo)簽庫(kù)進(jìn)行增加而使用的測(cè)試頁(yè),但也可以示范如何使用struts標(biāo)記 |
Struts-template.war | 包含struts模板標(biāo)記的介紹和范例 |
Struts-upload.war | 一個(gè)簡(jiǎn)單的例子,示范如何使用struts框架上傳文件 |
在Tomcat 4.1.18運(yùn)行環(huán)境下,只需要將 xxx.war 文件放到webapps 目錄下,啟動(dòng)Tomcat 即可。
建議從struts-example 開(kāi)始學(xué)習(xí),熟讀struts-config.xml, jsp, 和 java 源碼。
6、統(tǒng)一的IDE工具: eclipse
Eclipse 是由IBM支持的開(kāi)發(fā)源碼的IDE, 目前的最新版本是2.1。與Netbeans, JBuilder相比,由以下特點(diǎn):
- 界面設(shè)計(jì)精細(xì),布局合理,秉承了IBM的風(fēng)格。
- 功能齊全,具備了Netbeans, JBuilder(Enterprice fetature 除外)大部分功能,還有一些特有的功能,如:代碼歷史記錄比較、替換,代碼重構(gòu),自動(dòng)生成get,set方法, 小組協(xié)作方式的版本控制和權(quán)限控制。
- 速度快,執(zhí)行一個(gè)代碼格式化(14,000行)的操作,要比Netbeans快百倍以上。
- 功能強(qiáng)大的plug-in,可以與Ant, JUnit, Tomcat集成。將來(lái)我們也可以編寫自己的插件,有增強(qiáng)功能的潛力。
目前,每個(gè)項(xiàng)目使用的開(kāi)發(fā)工具都不同,有JBuilder, Netbeans等。從長(zhǎng)遠(yuǎn)考慮應(yīng)該采用開(kāi)發(fā)源碼的IDE, 不存在盜版問(wèn)題。現(xiàn)在開(kāi)發(fā)源碼的IDE有Netbeans, Eclipse兩大陣營(yíng),分別由Sun 和 IBM支持。綜合上面的Eclipse特性,我推薦統(tǒng)一使用Eclipse。
7、參考資料
- 網(wǎng)站:
struts 官方網(wǎng)站:http://jakarta.apache.org/struts
struts resource : http://jakarta.apache.org/struts/resources/index.html
Camino 網(wǎng)站:http://www.scioworks.com/index.html
其他網(wǎng)站:http://husted.com/struts/
http://struts.application-servers.com/main.html
http://www.synthis.com/products/architectures/struts/index.jsp
- 文章:
《struts框架詳細(xì)介紹》 - ppt 文檔,描述了struts 框架
《struts-intro》- ppt 文檔,其中的struts 導(dǎo)航流程圖非常好。
《Using Struts》 - ppt 文檔,概述了struts 框架和組成
《如何在 iAS 6.x 中配置Struts 1.1 beta x》- 講述在iPlanet 6.x 如何配置 struts 1.1
《Struts標(biāo)記庫(kù)》 - 詳細(xì)介紹了struts taglib的使用
《struts turorial》 - 一個(gè)網(wǎng)上購(gòu)書的示例,詳細(xì)講解了struts使用步驟