




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、.序經(jīng)過了兩個(gè)星期不懈努力,今天終于完成了對(duì)strtus整體架構(gòu)及核心標(biāo)簽庫(kù)的介紹。從幾乎不懂struts和HTML標(biāo)簽,到可以給別人解決涉及struts的一些小問題,這與朋友的幫助和我的努力是分不開的,但我更希望它能給那些想要學(xué)的,正在學(xué)的和已經(jīng)學(xué)過的人帶來不同的益處。我知道我是個(gè)新手,但我會(huì)用百倍的努力繼續(xù)在這個(gè)領(lǐng)域進(jìn)行深入性的和擴(kuò)展性的學(xué)習(xí)與研究。同時(shí),就象我說的,我們會(huì)用實(shí)際行動(dòng)證明我們?yōu)槟闾峁┑膸椭_@章適合做參考資料,他不僅包含了對(duì)struts的整體架構(gòu)及主要組件的詳細(xì)和清晰的介紹,而且對(duì)于很多人都關(guān)注的struts標(biāo)簽庫(kù)也進(jìn)行了細(xì)致的介紹,可以說它是你手頭一個(gè)可以用來進(jìn)行參考的資
2、料。當(dāng)你哪里不清楚,你完全可以到這里查詢。為了你查詢方便,我做了一個(gè)目錄。由于開源軟件不斷發(fā)展,所以這不可能是最后版本,我會(huì)不斷進(jìn)行內(nèi)容的修改和新特性的添加。比如strus1.1的Nested Tag,但由于個(gè)人技術(shù)水平和時(shí)間等多方面原因,速度不會(huì)太快,這就需要大家的幫助,希望大家共同參加一些資料的整理。我已經(jīng)盡力避免在文字或代碼中出現(xiàn)錯(cuò)誤,但是人無(wú)完,疏漏總是難免的。如果你在閱讀發(fā)現(xiàn)了其中的錯(cuò)誤,比如文字的錯(cuò)誤或錯(cuò)誤的代碼,我非常希望你將這些信息反饋給我,這樣會(huì)幫助其他人解決遇到的問題,也會(huì)不斷完善這套資料。我的郵件是:davidyu_2003希望本資料能給你帶來幫助! 2004年 08 月
3、 3 日 午夜目錄序1目錄2Struts框架1. struts壓縮包內(nèi)容32. struts體系結(jié)構(gòu)(模型-視窗-控制器)33. struts框架的組件43.1 struts配置文件53.2 ActionServlet類73.3 ActionMapping類93.4 Action類93.5 ActionForm類103.6 ActionForward類113.7 錯(cuò)誤處理11Struts標(biāo)記庫(kù)4. struts標(biāo)記庫(kù)134.1 Bean標(biāo)記134.1.1 Bean復(fù)制標(biāo)記134.1.2 定義腳本變量標(biāo)記134.1.3 顯示bean屬性144.1.4 消息國(guó)際化標(biāo)記154.2 邏輯標(biāo)記16 4.
4、2.1 條件標(biāo)記16 4.2.2 重復(fù)標(biāo)記18 4.2.3 轉(zhuǎn)發(fā)和重定向標(biāo)記184.3 HTML標(biāo)記194.3.1 顯示表單元素和輸入控件194.3.2 顯示錯(cuò)誤信息的標(biāo)記234.3.3 其他HTML標(biāo)記24 4.4 模板標(biāo)記24 Struts框架struts框架具有組件的模塊化,靈活性和重用性的優(yōu)點(diǎn),同時(shí)簡(jiǎn)化了基于MVC的Web應(yīng)用程序的開發(fā)。本章詳細(xì)討論struts架構(gòu)。我們將看到struts是如何清晰地區(qū)分控制,事務(wù)邏輯和外觀,從而簡(jiǎn)化了開發(fā)應(yīng)用程序過程的。我們還將介紹struts提供的類如何使得開發(fā)工作更加簡(jiǎn)單,這些類包括:l 控制程序流程的類l 實(shí)現(xiàn)和執(zhí)行程序事務(wù)邏輯的類l 自定義的
5、標(biāo)記庫(kù)使得創(chuàng)建和驗(yàn)證HTML表單更加容易1 Struts壓縮包內(nèi)容文件夾jakarta-struts-1.0.2包含兩個(gè)目錄,lib和webapps。在lib目錄中有使用struts創(chuàng)建應(yīng)用程序是所需的文件:文件描述jdbc2_0-stdext.jar包含JDBC2.0 Optional Package API類。如果我們要使用struts提供的數(shù)據(jù)資源,就需要將這個(gè)文件拷貝到WEB-INFlib下Struts.jar包含struts中所有的java類。同樣也需要拷貝到WEB-INFlib下*.tld標(biāo)記庫(kù)描述器文件,描述了多個(gè)struts標(biāo)記庫(kù)中的自定義標(biāo)記。同樣要拷貝到WEB-INFlib
6、下在webapps目錄下有如下文件:Web應(yīng)用程序描述Struts-blank.war一個(gè)簡(jiǎn)單的web應(yīng)用程序Struts-documentation.war包含struts站點(diǎn)上所有struts文檔Struts-example.warStruts很多特性的示范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框架上傳文件2.Struts體系結(jié)構(gòu)讓我們從MVC角度觀察
7、struts框架中的組件框架中三個(gè)部分:模型,視窗和控制器。模型在struts框架中,模型分為兩個(gè)部分:l 系統(tǒng)的內(nèi)部狀態(tài)l 可以改變狀態(tài)的操作(事務(wù)邏輯) 內(nèi)部狀態(tài)通常由一組ActinForm JavaBean表示。根據(jù)設(shè)計(jì)或應(yīng)用程序復(fù)雜度的不同,這些Bean可以是自包含的并具有持續(xù)的狀態(tài),或只在需要時(shí)才獲得數(shù)據(jù)(從某個(gè)數(shù)據(jù)庫(kù))。 大型應(yīng)用程序通常在方法內(nèi)部封裝事務(wù)邏輯(操作),這些方法可以被擁有狀態(tài)信息的bean調(diào)用。比如購(gòu)物車bean,它擁有用戶購(gòu)買商品的信息,可能還有checkOut()方法用來檢查用戶的信用卡,并向倉(cāng)庫(kù)發(fā)定貨信息。 小型程序中,操作可能會(huì)被內(nèi)嵌在Action類,它是s
8、truts框架中控制器角色的一部分。當(dāng)邏輯簡(jiǎn)單時(shí)這個(gè)方法很適合。 建議用戶將事務(wù)邏輯(要做什么)與Action類所扮演的角色(決定做什么)分開。視窗 由JSP建立,struts包含擴(kuò)展自定義標(biāo)簽庫(kù),可以簡(jiǎn)化創(chuàng)建完全國(guó)際化用戶界面的過程??刂破?struts中,基本的控制器組件是ActionServlet類中的實(shí)例servelt,實(shí)際使用的servlet在配置文件中由一組映射(由ActionMapping類進(jìn)行描述)進(jìn)行定義。3.Struts框架中的組件 (由于ROSE工具還未能下載,只能找來這幅圖,它說明了一定問題,特別是ActionErrors,但它并沒有將ActionMapping,JSP
9、和Tag Library包含進(jìn)來,有時(shí)間作完替換)框架中所使用的組件:ActionServlet控制器ActionClass包含事務(wù)邏輯ActionForm顯示模塊數(shù)據(jù)ActionMapping幫助控制器將請(qǐng)求映射到操作ActionForward用來指示操作轉(zhuǎn)移的對(duì)象ActionError用來存儲(chǔ)和回收錯(cuò)誤Struts標(biāo)記庫(kù)可以減輕開發(fā)顯示層次的工作下面我們看看各自在框架中所扮演的角色和責(zé)任。3.1 Struts配置文件這是將struts組件結(jié)合在一起的東東:struts-config.xml。默認(rèn)值WEB-INFstruts-config.xml。配置文件可以定義:l 全局轉(zhuǎn)發(fā)l Actio
10、nMapping類l ActionForm beanl JDBC數(shù)據(jù)源配置全局轉(zhuǎn)發(fā)全局轉(zhuǎn)發(fā)用來在JSP頁(yè)之間創(chuàng)建邏輯名稱映射。轉(zhuǎn)發(fā)都可以通過對(duì)調(diào)用操作映射的實(shí)例來獲得,例如:actionMappingInstace.findForward(“l(fā)ogicalName”);全局轉(zhuǎn)發(fā)的例子:(所有的例子我沒有進(jìn)行解釋,一是結(jié)合表可以理解,二是例子大部分來自系列四的示例,你應(yīng)該在作完實(shí)驗(yàn)后,再來看一便)<global-forwards><forward name="bookCreated" path="/BookView.jsp"/>&l
11、t;/global-forwards> 屬性描述Name全局轉(zhuǎn)發(fā)的名字Path與目標(biāo)URL的相對(duì)路徑配置ActionMappingActionMapping對(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()方法實(shí)現(xiàn)特定應(yīng)用程序代碼,返回一個(gè)ActionForward對(duì)象,其中包括響應(yīng)轉(zhuǎn)發(fā)的目標(biāo)資源名稱。例如:<action-mappings><action path
12、="/createBook" type="BookAction" name="bookForm" scope="request" input="/CreateBook.jsp"></action><forward name=”failure” path=”/CreateBook.jsp”/><forward name=”cancel” path=”/index.jsp”/></action-mappings>屬性描述Path Action類的
13、相對(duì)路徑Name與本操作關(guān)聯(lián)的Action bean的名稱Type連接到本映射的Action類的全稱(可有包名)ScopeActionForm bean的作用域(請(qǐng)求或會(huì)話)Prefix用來匹配請(qǐng)求參數(shù)與bean屬性的前綴Suffix用來匹配請(qǐng)求參數(shù)與bean屬性的后綴attribute作用域名稱。classNameActionMapping對(duì)象的類的完全限定名默認(rèn)的類是org.apache.struts.action.ActionMappinginput輸入表單的路徑,指向bean發(fā)生輸入錯(cuò)誤必須返回的控制unknown設(shè)為true,操作將被作為所有沒有定義的ActionMapping的UR
14、I的默認(rèn)操作validate設(shè)置為true,則在調(diào)用Action對(duì)象上的perform()方法前,ActionServlet將調(diào)用ActionForm bean的validate()方法來進(jìn)行輸入檢查通過<forward>元素,可以定義資源的邏輯名稱,該資源是Action類的響應(yīng)要轉(zhuǎn)發(fā)的目標(biāo)。屬性描述IdIDClassNameActionForward類的完全限定名,默認(rèn)是org.apache.struts.action.ActionForwardName操作類訪問ActionForward時(shí)所用的邏輯名Path響應(yīng)轉(zhuǎn)發(fā)的目標(biāo)資源的路徑redirect若設(shè)置為true,則Actio
15、nServlet使用sendRedirect()方法來轉(zhuǎn)發(fā)資源配置ActionForm BeanActionServlet使用ActionForm來保存請(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>屬性描述IdIDclassNameActionForm bean
16、的完全限定名,默認(rèn)值是org.apache.struts.action.ActionFormBeanName表單bean在相關(guān)作用域的名稱,這個(gè)屬性用來將bean與ActionMapping進(jìn)行關(guān)聯(lián)Type類的完全限定名配置JDBC數(shù)據(jù)源用<data-sources>元素可以定義多個(gè)數(shù)據(jù)源。屬性描述IdIDKeyAction類使用這個(gè)名稱來尋找連接Type實(shí)現(xiàn)JDBC接口的類的名稱下面屬性需要<set-property>元素定義,在框架1.1版本中已不在使用,但你可用<data-source>元素。例子:<data-sources><dat
17、a-source id=”DS1”key=”conPool” type=”org.apache.struts.util.GenericDataSource”<set-property id=”SP1”autoCommit="true"description="Example Data Source Configuration"driverClass="org.test.mm.mysql.Driver"maxCount="4"minCount="2"url="jdbc:mysql:
18、/localhost/test"user="struts"password="wrox" /><data-source/></data-sources>屬性描述desciption數(shù)據(jù)源的描述autoCommit數(shù)據(jù)源創(chuàng)建的連接所使用的默認(rèn)自動(dòng)更新數(shù)據(jù)庫(kù)模式driverClass數(shù)據(jù)源所使用的類,用來顯示JDBC驅(qū)動(dòng)程序接口loginTimeout數(shù)據(jù)庫(kù)登陸時(shí)間的限制,以秒為單位maxCount最多能建立的連接數(shù)目minCount要?jiǎng)?chuàng)建的最少連接數(shù)目password數(shù)據(jù)庫(kù)訪問的密碼readOnly創(chuàng)建只讀的連接Us
19、er訪問數(shù)據(jù)庫(kù)的用戶名urlJDBC的URL通過指定關(guān)鍵字名稱,Action類可以訪問數(shù)據(jù)源,比如:javax.sql.DataSource ds = servlet.findDataSource(“conPool”);javax.sql.Connection con = ds.getConnection();3.2 ActionServlet類框架中的控制器組件是有org.apache.struts.action.ActionServlet類實(shí)現(xiàn)的,這個(gè)類是javax.servlet.http.HttpServlet類的擴(kuò)展。Struts controller基本功能是:1. 截獲用戶的Ht
20、tp請(qǐng)求2. 把這個(gè)請(qǐng)求映射到相應(yīng)的Action類,如果這是此類收到的第一個(gè)請(qǐng)求,將初始化實(shí)例并緩寸。3. 創(chuàng)建或發(fā)現(xiàn)一個(gè)ActionForm bean實(shí)例(看配置文件是否定義),然后將請(qǐng)求過程移植到 bean.4. 調(diào)用Action實(shí)例的execute()方法并將ActioForm bean,Action Mapping對(duì)象,request和response對(duì)象傳給它。如:public ActionForword perform(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletRes
21、ponse response)5.execute()返回一個(gè)ActionForword對(duì)象,此對(duì)象連接到相應(yīng)的jsp頁(yè)面.ActionServlet配置我們需要在web.xml中聲明ActionServlet,并且將它配置成啟動(dòng)時(shí)進(jìn)行加載。以下為可以配置的初始化參數(shù):參數(shù)默認(rèn)值描述applicationnull應(yīng)用程序的資源集合的類bufferSize4096文件上傳的緩沖區(qū)大小config/WEB-INF/struts-config.xml配置文件的位置和名稱contentText/html默認(rèn)的內(nèi)容類型debug0程序調(diào)試的級(jí)別detail0程序調(diào)試細(xì)節(jié)的級(jí)別factorynull消息資源
22、工廠,用于國(guó)際化中解釋消息資源formBeanorg.apache.struts.action.ActionFormBean封裝ActionForm bean信息的類的名稱forwardorg.apache.struts.action.ActionForward封裝ActionForward對(duì)象信息的類的名稱localetrue為true,將在用戶會(huì)話中存儲(chǔ)一個(gè)本地對(duì)象mappingorg.apache.struts.action.ActionForward封裝ActionMapping信息的類的名稱maxFileSize250M上傳文件的最大尺寸multipartClassorg.apach
23、e.struts.action.ActionForward處理多部分請(qǐng)求的類的名稱noCacheFalseHTTP標(biāo)頭是否要設(shè)置為禁止緩寸NullTrue設(shè)置為true,對(duì)于無(wú)效的信息關(guān)鍵字將返回nulltempDir作為一個(gè)servlet參數(shù)提供給程序的工作目錄處理下載文件是使用的臨時(shí)工作目錄validateTrue是否使用新格式的配置文件vallidatingTrue是否對(duì)配置文件進(jìn)行有效性分析大多數(shù)情況下,標(biāo)準(zhǔn)的servlet就能夠滿足用戶需要。第一次收到特定請(qǐng)求的URI時(shí),ActionServlet將適當(dāng)?shù)腁ction類進(jìn)行實(shí)例化,然后ActionServlet在Action類實(shí)例中以
24、servlet為變量名存儲(chǔ)一個(gè)引用。當(dāng)被實(shí)例化后,Action類會(huì)被暫存以備再用。ActionServlet也提供一些方法,由Action類用來訪問數(shù)據(jù)源和轉(zhuǎn)發(fā)目標(biāo)之類的資源。ActionServlet方法ActinServlet提供了一組能夠被Action對(duì)象使用的方法。 Struts API的全部信息在struts-documentation.war中可以找到。動(dòng)態(tài)的添加或刪除,這些方法只影響應(yīng)用程序當(dāng)前的實(shí)例:public void addFormBean(ActionFormBean formBean)public void removeFormBean(ActionFormBean
25、formBean)public void addForward(ActionForward actionForward)public void removeForward(ActionForward actionForward)public void addMapping(ActionMapping actionMapping)public void removeMapping(ActionMapping actionMapping)根據(jù)名稱查找對(duì)象:public ActionFormBean findFormBean(String name)public ActionForward find
26、Forward(String name)public ActionMapping findMapping(String name)用來處理數(shù)據(jù)源: public void addDataSource(String key , DataSource ds) public DataSource findDataSource(String key)我們還可以:l 使用destroy()方法結(jié)束ActionServletl 使用reload()方法從struts配置文件將信息重新加載。3.3 ActionMapping類將特定請(qǐng)求映射到特定Action的相關(guān)信息存儲(chǔ)在ActionMapping中,Ac
27、tionServelt將ActionMapping傳送到Action類的execute()方法,Action將使用ActionMapping的findForward()方法,此方法返回一個(gè)指定名稱的ActionForward,這樣Action就完成了本地轉(zhuǎn)發(fā)。若沒有找到具體的ActionForward,就返回一個(gè)null.public ActionForward findForward(String name)可在映射中動(dòng)態(tài)添加ActionForward:public void addForward(ActionForward forward)可返回與映射關(guān)聯(lián)的表單bean:public St
28、ring getName()可返回映射的屬性域(會(huì)話或請(qǐng)求) public String getScope()3.4 Action類Action類真正實(shí)現(xiàn)應(yīng)用程序的事務(wù)邏輯,它們負(fù)責(zé)處理請(qǐng)求。在收到請(qǐng)求后,ActionServlet會(huì):l 為這個(gè)請(qǐng)求選擇適當(dāng)?shù)腁ctionl 如果需要,創(chuàng)建Action的一個(gè)實(shí)例l 調(diào)用Action的execute()方法如果ActionServlet不能找到有效的映射,它會(huì)調(diào)用默認(rèn)的Action類(在配置文件中定義)。如果找到了ActionServlet將適當(dāng)?shù)腁ctionMapping類轉(zhuǎn)發(fā)給Action,這個(gè)Action使用ActionMapping找到本
29、地轉(zhuǎn)發(fā),然后獲得并設(shè)置ActionMapping屬性。根據(jù)servlet的環(huán)境和被覆蓋的execute()方法的簽名,ActionServlet也會(huì)傳送ServletRequest對(duì)象或HttpServletRequest對(duì)象。所有Action類都擴(kuò)展org.apache.struts.action.Action類,并且覆蓋類中定義的某一個(gè)execute()方法。有兩個(gè)execute()方法:處理非HTTP(一般的)請(qǐng)求:public ActionForward execute(ActionMapping action, AcionForm form,ServletRequest reques
30、t,ServletResponse response) throws IOException,ServletException處理HTTP請(qǐng)求:public ActionForward execute(ActionMapping action, AcionForm form,HttpServletRequest request,HttpServletResponse response) throws IOException,ServletExceptionAction類必須以“線程安全”的方式進(jìn)行編程,因?yàn)榭刂破鲿?huì)令多個(gè)同時(shí)發(fā)生的請(qǐng)求共享同一個(gè)實(shí)例,相應(yīng)的,在設(shè)計(jì)Action類時(shí)就需要注意以下
31、幾點(diǎn):l 不能使用實(shí)例或靜態(tài)變量存儲(chǔ)特定請(qǐng)求的狀態(tài)信息,它們會(huì)在同一個(gè)操作中共享跨越請(qǐng)求的全局資源l 如果要訪問的資源(如JavaBean和會(huì)話變量)在并行訪問時(shí)需要進(jìn)行保護(hù),那么訪問就要進(jìn)行同步Action類的方法除了execute()方法外,還有以下方法:可以獲得或設(shè)置與請(qǐng)求相關(guān)聯(lián)的區(qū)域:public Locale getLocale(HttpServletRequest request)public void setLocale(HttpServletRequest request,Locale locale)為應(yīng)用程序獲得消息資源:public MessageResources get
32、Resources()檢查用戶是否點(diǎn)擊表單上的“取消”鍵,如果是,將返回true:public Boolean isCancelled(HttpServletRequest request)當(dāng)應(yīng)用程序發(fā)生錯(cuò)誤時(shí),Action類能夠使用下面方法存儲(chǔ)錯(cuò)誤信息:public void saveErrors(HttpServletRequest request,ActionErrors errors)ActionError實(shí)例被用來存儲(chǔ)錯(cuò)誤信息,這個(gè)方法在錯(cuò)誤關(guān)鍵字下的請(qǐng)求屬性列表中存儲(chǔ)ActionError對(duì)象。通過使用在struts標(biāo)記庫(kù)中定義的自定義標(biāo)記,JSP頁(yè)能夠顯示這些錯(cuò)誤信息,稍后我們就
33、介紹。3.5 ActionForm類框架假設(shè)用戶在應(yīng)用程序中為每個(gè)表單都創(chuàng)建了一個(gè)ActionForm bean,對(duì)于每個(gè)在struts-config.xml文件中定義的bean,框架在調(diào)用Action類的execute()方法之前會(huì)進(jìn)行以下操作:l 在相關(guān)聯(lián)的關(guān)鍵字下,它檢查用于適當(dāng)類的bean實(shí)例的用戶會(huì)話,如果在會(huì)話中沒有可用的bean,它就會(huì)自動(dòng)創(chuàng)建一個(gè)新的bean并添加到用戶的會(huì)話中。l 對(duì)于請(qǐng)求中每個(gè)與bean屬性名稱對(duì)應(yīng)的參數(shù),Action調(diào)用相應(yīng)的設(shè)置方法。l 當(dāng)Action execute()被調(diào)用時(shí),最新的ActionForm bean傳送給它,參數(shù)值就可以立即使用了。Ac
34、tionForm類擴(kuò)展org.apache.struts.action.ActionForm類,程序開發(fā)人員創(chuàng)建的bean能夠包含額外的屬性,而且ActionServlet可能使用反射(允許從已加載的對(duì)象中回收信息)訪問它。ActionForm類提供了另一種處理錯(cuò)誤的手段,提供兩個(gè)方法:Public ActionErrors validate(ActionMappin mapping,ServletRequest request)Public ActionErrors validate(ActionMappin mapping,HttpServletRequest request)你應(yīng)該在自己
35、的bean里覆蓋validate()方法,并在配置文件里設(shè)置<action>元素的validate為true。在ActionServlet調(diào)用Action類前,它會(huì)調(diào)用validate(),如果返回的ActionErrors不是null,則ActinForm會(huì)根據(jù)錯(cuò)誤關(guān)鍵字將ActionErrors存儲(chǔ)在請(qǐng)求屬性列表中。如果返回的不是null,而且長(zhǎng)度大于0,則根據(jù)錯(cuò)誤關(guān)鍵字將實(shí)例存儲(chǔ)在請(qǐng)求的屬性列表中,然后ActionServlet將響應(yīng)轉(zhuǎn)發(fā)到配置文件<action>元素的input屬性所指向的目標(biāo)。如果需要執(zhí)行特定的數(shù)據(jù)有效性檢查,最好在Action類中進(jìn)行這個(gè)操作
36、,而不是在ActionForm類中進(jìn)行。方法reset()可將bean的屬性恢復(fù)到默認(rèn)值: public void reset(ActionMapping mapping,HttpServletRequest request) public void reset(ActionMapping mapping,ServletRequest request)典型的ActionFrom bean只有屬性的設(shè)置與讀取方法(getXXX),而沒有實(shí)現(xiàn)事務(wù)邏輯的方法。只有簡(jiǎn)單的輸入檢查邏輯,使用的目的是為了存儲(chǔ)用戶在相關(guān)表單中輸入的最新數(shù)據(jù),以便可以將同一網(wǎng)頁(yè)進(jìn)行再生,同時(shí)提供一組錯(cuò)誤信息,這樣就可以讓用戶
37、修改不正確的輸入數(shù)據(jù)。而真正對(duì)數(shù)據(jù)有效性進(jìn)行檢查的是Action類或適當(dāng)?shù)氖聞?wù)邏輯bean。3.6 ActionForward類目的是控制器將Action類的處理結(jié)果轉(zhuǎn)發(fā)至目的地。Action類獲得ActionForward實(shí)例的句柄,然后可用三種方法返回到ActionServlet,所以我們可以這樣使用findForward():l ActionServlet根據(jù)名稱獲取一個(gè)全局轉(zhuǎn)發(fā)l ActionMappin實(shí)例被傳送到execute()方法,并根據(jù)名稱找到一個(gè)本地轉(zhuǎn)發(fā)另一種是調(diào)用下面的一個(gè)構(gòu)造器來創(chuàng)建它們自己的一個(gè)實(shí)例:public ActionForward()public Actio
38、nForward(String path)public ActionForward(String path,Boolean redirect)3.7 錯(cuò)誤處理struts提供了兩個(gè)類來處理錯(cuò)誤:ActionErrors和ActionError,它們分別擴(kuò)展org.apache.struts.action.ActionMessage和org.apache.struts.action.ActionMessages。ActionErrors保存著ActionError對(duì)象的集合,其中每一個(gè)代表了獨(dú)立的錯(cuò)誤信息。每個(gè)ActionError都包含了關(guān)鍵字,能夠映射到資源文件中存儲(chǔ)的錯(cuò)誤信息,而這個(gè)資源文
39、件是在ActionServlet初始化參數(shù)中指定的。ActionError類ActionError類定義了一組重載的構(gòu)造器來創(chuàng)建錯(cuò)誤信息,第一個(gè)構(gòu)造器方法使用一個(gè)字符串作為參數(shù),例如: ActionError error = new ActionError(“error.Invalid”);實(shí)例error映射到應(yīng)用程序資源文件中的一個(gè)錯(cuò)誤消息: error.invalid=<b>Invalid Number</b>如果在JSP頁(yè)使用<html:error>,用戶就會(huì)看見加粗的Invalid Number。另一種使用了java.text.MessageForm
40、at類,可在消息中指定替換字符串,例如:error.invalid=<b>Invalid Number0</b>創(chuàng)建一個(gè)錯(cuò)誤消息:ActionError error = new ActionError(error.invalid,new Double(-1);JSP頁(yè)顯示:Invalild Number 1 還有獲得特定消息的錯(cuò)誤關(guān)鍵字:public String getKey() 還有獲得替換字符串?dāng)?shù)組:public String getValues()ActionError類ActionError類從不獨(dú)立進(jìn)行錯(cuò)誤處理,它們總是被存儲(chǔ)在ActionErrors對(duì)象中
41、。ActionErrors對(duì)象保存ActionError類的集合以及它們特定的屬性值,我們可以使用自己定義的屬性值,或是使用ActionErrors.GLOBAL_ERROR.下面是典型Action類的execute()中錯(cuò)誤處理情況:MyForm form = (MyForm) form;if (number = -1) ActionErrors errors = new ActionErrors();ActionError error = new ActionError(“error.Invalid”,new Double(-1);errors.add(ActionErrors.GLOBA
42、L_ERROR,error);saveErrors(req,errors);String input = mapping.getInput();Return new ActionForward(input); ActionErrors有如下有用方法:方法描述clear()清除所有錯(cuò)誤信息empty()如果ActionErrors對(duì)象是空的,它返回trueget()返回錯(cuò)誤信息。若無(wú)參數(shù),所有信息將作為一個(gè)Iterator對(duì)象返回properties()返回包含屬性名稱的Iterator,這些屬性至少有一個(gè)錯(cuò)誤size()返回錯(cuò)誤的數(shù)目(整型數(shù))Struts標(biāo)記庫(kù)4.Struts標(biāo)記庫(kù)JSP視窗
43、組件所使用的 struts標(biāo)記庫(kù)由四類標(biāo)記組成:l Bean標(biāo)記:用來在JSP頁(yè)中管理beanl 邏輯標(biāo)記:用來在JSP頁(yè)中控制流程l HTML標(biāo)記:用來生成HTML標(biāo)記,在表單中顯示數(shù)據(jù),使用會(huì)話ID對(duì)URL進(jìn)行編程l 模板標(biāo)記:使用動(dòng)態(tài)模板構(gòu)造普通格式的頁(yè)4.1 Bean標(biāo)記這個(gè)標(biāo)記庫(kù)中包含用于定義新bean、訪問bean及其屬性的標(biāo)記。Struts框架提供了多種自定義標(biāo)記用來在JSP頁(yè)中處理JavaBean。這些標(biāo)記被封裝在一個(gè)普通的標(biāo)記庫(kù)中,在文件struts-bean.tld中定義了它的標(biāo)記庫(kù)描述器。Bean標(biāo)記庫(kù)將標(biāo)記定義在四個(gè)子類別中:l 創(chuàng)建和復(fù)制bean的標(biāo)記l 腳
44、本變量定義標(biāo)記l bean翻譯標(biāo)記l 消息國(guó)際化標(biāo)記4.1.1 Bean復(fù)制標(biāo)記可定義新bean,可復(fù)制現(xiàn)有bean,還可從現(xiàn)有bean復(fù)制屬性。<bean:define>標(biāo)記用來:l 定義新字符串常數(shù)l 將現(xiàn)有的bean復(fù)制到新定義的bean對(duì)象l 復(fù)制現(xiàn)有bean的屬性來創(chuàng)建新的bean <bean:define>標(biāo)記屬性: 屬性描述Id新定義的bean腳本變量名稱,必須設(shè)置Type定義引入腳本變量的類Value為id屬性定義的腳本變量分配一個(gè)新的對(duì)象Name目標(biāo)bean的名稱。若value屬性沒有設(shè)置,這個(gè)屬性就必須設(shè)置propertyName屬性定義的bean的
45、屬性名稱,用來定義新的beanScope源bean的作用域。若沒有設(shè)置,搜索范圍是從頁(yè)作用域到應(yīng)用程序作用域toScope目標(biāo)bean的作用域。若沒有設(shè)置,默認(rèn)值是頁(yè)作用域例如:定義一個(gè)bean:<bean:define id=”test” value=”this is a test”/>源bean在頁(yè)作用域中被拷貝到請(qǐng)求作用域中的另一個(gè)bean:<bean:define id=”targetBean” name=”sourceBean”scope=”page” toScope=”request”/>4.1.2 定義腳本變量的標(biāo)記從多種資源中定義和生成腳本變量,這些資源
46、包括cookie,請(qǐng)求參數(shù),HTTP標(biāo)頭等等。屬性如下:屬性描述Id腳本變量和要定義的頁(yè)作用域?qū)傩缘拿QNamecookie/標(biāo)頭/參數(shù)的名稱multiple如果這個(gè)屬性設(shè)置了任意一個(gè)數(shù)值,所有匹配的cookie都會(huì)被積累并存儲(chǔ)到一個(gè)Cookie(一個(gè)數(shù)組)類型的bean里。若無(wú)設(shè)置,指定cookie的第一個(gè)值將作為Cookie類型的值Value如果沒有匹配的cookie或數(shù)值,就返回這個(gè)屬性指定的默認(rèn)值例如:<bean:cookie id=”myCookie” name=”userName”/>腳本變量名稱是myCookie,用來創(chuàng)建這個(gè)屬性的cookie的名稱是userName
47、。<bean:header id=”myHeader” name=”Accept-Language”/>腳本變量名稱是myHeader,請(qǐng)求標(biāo)頭的名稱是Accept-Language.<bean:parameter id=”myParameter” name=”myParameter”>腳本變量名稱是myPatameter,它保存的請(qǐng)求參數(shù)的名稱也是myParameter.<bean:include>標(biāo)記將對(duì)一個(gè)資源的響應(yīng)進(jìn)行檢索,并引入一個(gè)腳本變量和字符串類型的頁(yè)作用域?qū)傩?。這個(gè)資源可以是一個(gè)頁(yè),一個(gè)ActionForward或一個(gè)外部URL。與<j
48、sp:include>的不同是資源的響應(yīng)被存儲(chǔ)到一個(gè)頁(yè)作用域的bean中,而不是寫入到輸出流。屬性如下:屬性描述Id腳本變量和要定義的頁(yè)作用域?qū)傩缘拿QPage一個(gè)內(nèi)部資源forward一個(gè)ActionForwardHref要包含的資源的完整URL例如:<bean:include id=”myInclude” page=”MyJsp?x=1”/>腳本變量的名稱是myInclude,要檢索的響應(yīng)來自資源MyJsp?x=1。<bean:resource>標(biāo)記將檢索web應(yīng)用中的資源,并引入一個(gè)腳本變量和InputStream或字符串類型的頁(yè)作用域?qū)傩?。如果在檢索資源時(shí)
49、發(fā)生問題,就會(huì)產(chǎn)生一個(gè)請(qǐng)求時(shí)間異常。屬性如下:屬性描述Id腳本變量和要定義的頁(yè)作用域?qū)傩缘拿QName資源的相對(duì)路徑Input如果這個(gè)屬性不存在,資源的類型就是字符串例如:<bean:resource id=”myResource” name=”/WEB-INF/images/myResource.xml”/>腳本變量的名稱是myResource,要檢索的資源的名稱是myResource.xml。4.1.3 顯示Bean屬性 標(biāo)記庫(kù)中定義了<bean:write>標(biāo)記,用來將bean的屬性輸送到封裝的JSP頁(yè)寫入器。這個(gè)標(biāo)記與<jsp:getProperty>
50、;類似,屬性如下:屬性描述Name要進(jìn)行屬性顯示的bean的名稱property要顯示的屬性的名稱。如果這個(gè)屬性類有java.beans.PropertyEditor,getAsText()或toString 方法會(huì)被調(diào)用ScopeBean的作用域,若沒有設(shè)置,搜索范圍是從頁(yè)到應(yīng)用程序作用域Filter如果設(shè)置true,屬性中的所有特殊HTML字符都將被轉(zhuǎn)化為相應(yīng)的實(shí)體引用Ignore如果設(shè)置false,當(dāng)發(fā)現(xiàn)屬性時(shí)會(huì)產(chǎn)生一個(gè)請(qǐng)求時(shí)間異常,否則返回null例如:<bean:write name=”myBean” property=”myProperty” scope=”request”
51、filter=”true”/>myBean的屬性myProperty將會(huì)被顯示,作用域?yàn)檎?qǐng)求,如果發(fā)現(xiàn)任何HTML特殊字符都將被轉(zhuǎn)化為相應(yīng)的實(shí)體引用。4.1.4 消息標(biāo)記和國(guó)際化strtus框架支持國(guó)際化和本地化。用戶在他們的計(jì)算機(jī)中定義自己所在的區(qū)域,當(dāng)web應(yīng)用程序需要輸出一條消息時(shí),它將引用一個(gè)資源文件,在這個(gè)文件中所有的消息都使用了適當(dāng)?shù)恼Z(yǔ)言。一個(gè)應(yīng)用程序可能提供了很多資源文件,每個(gè)文件提供了用不同語(yǔ)言編寫的消息。如果沒有找到所選語(yǔ)言的資源文件,就將使用默認(rèn)的資源文件。struts框架對(duì)國(guó)際化的支持是使用<bean:message>標(biāo)記,以及使用java.util數(shù)據(jù)
52、包中定義的Locale和ResourceBundle類來實(shí)現(xiàn)Java2平臺(tái)對(duì)這些任務(wù)的支持。Java.text.MessageFormat類定義的技術(shù)可以支持消息的格式。利用此功能,開發(fā)人員不需了解這些類的細(xì)節(jié)就可進(jìn)行國(guó)際化和設(shè)置消息的格式。用strtus實(shí)現(xiàn)國(guó)際化和本地化:第一步要定義資源文件的名稱,這個(gè)文件會(huì)包含用默認(rèn)語(yǔ)言編寫的在程序中會(huì)出現(xiàn)的所有消息。這些消息以“關(guān)鍵字-值”的形式存儲(chǔ),如下:error.validation.location = The entered location is invalid這個(gè)文件需要存儲(chǔ)在類的路徑下,而且它的路徑要作為初始化參數(shù)傳送給ActionSe
53、rvlet作為參數(shù)進(jìn)行傳遞時(shí),路徑的格式要符合完整Java類的標(biāo)準(zhǔn)命名規(guī)范。比如,如果資源文件存儲(chǔ)在WEB-INFclasses目錄中,文件名是ApplicationRperties,那么需要傳遞的參數(shù)值是ApplicationResources。如果文件在WEB-INFclassescomtest中,那么參數(shù)值就應(yīng)該是com.test. ApplicationResources.為了實(shí)現(xiàn)國(guó)際化,所有的資源文件必須都存儲(chǔ)在基本資源文件所在的目錄中。基本資源文件包含的是用默認(rèn)地區(qū)語(yǔ)言-本地語(yǔ)言編寫的消息。如果基本資源文件的名稱是ApplicationResources.p
54、roperties,那么用其他特定語(yǔ)言編寫的資源文件的名稱就應(yīng)該是ApplicationResources_perties(xx為ISO編碼,如英語(yǔ)是en)。因此這些文件應(yīng)包含相同的關(guān)鍵字,但關(guān)鍵字的值是用特定語(yǔ)言編寫的。ActionServlet的區(qū)域初始化參數(shù)必須與一個(gè)true值一起傳送,這樣ActionServlet就會(huì)在用戶會(huì)話中的Action.LOCALE_KEY關(guān)鍵字下存儲(chǔ)一個(gè)特定用戶計(jì)算機(jī)的區(qū)域?qū)ο蟆,F(xiàn)在可以運(yùn)行一個(gè)國(guó)際化的web站點(diǎn),它可以根據(jù)用戶計(jì)算機(jī)上的設(shè)置的區(qū)域自動(dòng)以相應(yīng)的語(yǔ)言顯示。我們還可以使用特定的字符串來替換部分消息,就象用java.text.MessageFormat的方法一樣:error.invalid.number = The number 0 is valid我們可以把字符串0
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 樂隊(duì)合同范例
- 公安機(jī)械租賃合同范例
- 出售天元廠房合同范例
- 加盟設(shè)備采購(gòu)合同范例
- 傳動(dòng)設(shè)備購(gòu)買合同范例
- 親戚購(gòu)房合同范例
- 《工人日?qǐng)?bào)》大慶石油工人媒介形象研究(2012-2023年)
- 基于玉米冠層NDVI的實(shí)時(shí)變量施肥決策與控制研究
- “故鄉(xiāng)的歌”-邱康碩士畢業(yè)音樂會(huì)設(shè)計(jì)
- 企業(yè)用電安裝合同范本
- 四川建設(shè)工程系統(tǒng)用戶滿意度測(cè)評(píng)實(shí)施辦法
- 控制工程基礎(chǔ)教案第四章
- 山田家的氣象報(bào)告--完整版PPT課件
- 煤礦2021年重大安全風(fēng)險(xiǎn)分析預(yù)判防控報(bào)告全文
- 粱昆淼第四版數(shù)學(xué)物理方法第10章
- 采礦學(xué)之采礦方法
- 急診腦卒中病人分診流程圖4.8
- 球閥使用說明書
- 對(duì)外漢語(yǔ)—春節(jié)學(xué)習(xí)教案
- 國(guó)泰安數(shù)據(jù)庫(kù)使用指南PPT課件
- 畢業(yè)設(shè)計(jì)(論文)800×800錘式破碎機(jī)
評(píng)論
0/150
提交評(píng)論