




已閱讀5頁,還剩26頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
Struts使用手冊 0 序2 0.1猜想2 0.2 HTTP,HTML,User Agents2 0.3 HTTP 請求/響應(yīng)周期2 0.4 Java語言和應(yīng)用框架2 0.5 JavaBeans2 0.6屬性文件和資源綁定3 0.7 JavaServlet3 1介紹5 1.1Struts的歷史5 1.2 MVC模式6 1.3 Struts控制流程7 2 創(chuàng)建模型組件8 2.1概述8 2.2 JavaBean和作用域8 2.3 ActionForm Bean9 2.4系統(tǒng)狀態(tài)Bean9 2.5商業(yè)邏輯Bean9 3 創(chuàng)建視圖組件9 3.1 概述9 3.2 國際化信息9 3.3Forms 和 FormBeans的交互11 3.4 其他表示層技術(shù)13 4 創(chuàng)建控制(Controller)組件15 4.1 概述15 4.2 ActionServlet15 4.3 ActionForm類16 4.4 Action類19 4.5 異常處理器20 4.6 插件類20 4.7 ActionMapping的實(shí)現(xiàn)20 4.8 編寫Action Mappings21 4.9 在頁面中使用ActionMapping22 4.10 在ActionMapping中使用通配符22 4.11 公共的Log 接口23 5. 配置應(yīng)用23 5.1 概述23 5.2 Struts配置文件23 5.3 為應(yīng)用配置模塊25 5.4 WEB應(yīng)用部署描述符25 0 序0.1猜想本手冊適合于有創(chuàng)建Java Web 應(yīng)用經(jīng)驗(yàn)的Web開發(fā)人員.在開始學(xué)習(xí)Struts之前你應(yīng)該了解如下的技術(shù):1. HTTP,HTML,User Agents2. HTTP 請求/響應(yīng)生命周期3. Java語言和應(yīng)用框架4. JavaBeans5. 屬性文件和資源綁定6. Java Servlets7. Java Server Pages ,JSP Tag Librariy8. XML0.2 HTTP,HTML,User AgentsWWW是基于超文本傳輸協(xié)議和超文本標(biāo)識語言建立的.用戶代理,比如瀏覽器,他們使用HTTP去請求一個文檔然后格式化顯示.0.3 HTTP 請求/響應(yīng)周期對于Web開發(fā)者來說,理解HTTP的請求和響應(yīng)周期是很重要的.你要使用HTTP發(fā)送一個請求,然后服務(wù)器給你一個響應(yīng).當(dāng)你創(chuàng)建WEB應(yīng)用時,你需要返回一個響應(yīng)對象來回應(yīng)請求.0.4 Java語言和應(yīng)用框架Struts是用JAVA編寫的.JAVA是面向?qū)ο蟮恼Z言,而Struts充分利用了面向?qū)ο蟮募夹g(shù).除此而外JAVA支持線程.如果你很好的掌握了JAVA,特別是面向?qū)ο缶幊毯途€程,這將會有益于最有效的使用Struts和這個手冊.0.5 JavaBeans象大多數(shù)JAVA應(yīng)用一樣,大多數(shù)Struts對象都是JavaBean.遵循JavaBean設(shè)計模式使得Struts更容易被開發(fā)者和JAVA開發(fā)工具使用.盡管JavaBean的最初是用來開發(fā)可視元素的,但它對開發(fā)可重用組件也非常有益.0.5.1反射和內(nèi)省反射是決定什么樣的函數(shù)或域存在某對象中的方法.內(nèi)省是反射的特殊形式.使用內(nèi)省就可以知道哪些方法將會被其他對象使用(如getter,setter)Struts框架使用內(nèi)省來轉(zhuǎn)換HTTP參數(shù)到JAVABEAN的屬性中和把JAVABEAN中的屬性數(shù)據(jù)組裝到HTML的域.0.5.2 MAPJAVABEAN把數(shù)據(jù)存在屬性中.JAVABEAN雖然是靈活而功能強(qiáng)的對象,但它并不是編程者存儲數(shù)據(jù)的唯一對象.另一個熟為人知的對象是java.util.Map.Map它是一個名字/值對的數(shù)據(jù)集合,它經(jīng)常用來存儲動態(tài)數(shù)據(jù).0.5.3 DynaBeansDynaBeans集成了JAVABEAN 的擴(kuò)展性和MAP的靈活性.編寫JAVABEAN要創(chuàng)建一個新類,并且要為每個屬性編寫方法.DynaBeans則將屬性放在XML中配置.在Struts應(yīng)用中,你可以使用DynaBeans來描述你的HTML Form,這個策略可以避免編寫普通的JAVABEAN來存儲很簡單的屬性.0.6屬性文件和資源綁定JAVA應(yīng)用包括WEB應(yīng)用的配置經(jīng)常使用屬性文件來完成. Struts的消息資源都是通過資源綁定和屬性文件實(shí)現(xiàn)的.JAVA資源綁定使用一個或多個屬性文件來實(shí)現(xiàn)應(yīng)用的國際化.0.7 JavaServlet由于JAVA是面向?qū)ο蟮恼Z言,因此JAVA平臺已經(jīng)將HTTP轉(zhuǎn)換成對象的形式.這將會使JAVA 程序員關(guān)注于應(yīng)用本身而不是HTTP.HTTP提供了一個標(biāo)準(zhǔn)的機(jī)制來擴(kuò)展服務(wù)器的功能,我們稱之為CGI. 服務(wù)器將請求發(fā)送到CGI程序,CGI程序則返回一個響應(yīng).同樣的任何JAVA服務(wù)器則會接收請求,然后轉(zhuǎn)發(fā)到Servlet.Servelt 是javax.servlet.http.HttpServlet的子類,每個Servlet必須完成四個方法: public void init(ServletConfig config) public void doGet(HttpServletRequest request, HttpServletResponse response) public void doPost(HttpServletRequest request, HttpServletResponse response) public void destroy() Struts提供了一個可用的Servlet-org.apache.struts.action.ActionServlet. 作為一個Struts開發(fā)者,你只需要編寫對象供ActionServlet調(diào)用就行了.但是,理解Servlet并熟悉他在JAVA WEB應(yīng)用中扮演的角色那是最好不過了.0.7.1 Servlets 和多線程為了提高性能,Servlet設(shè)計程多線程.每個Servlet僅創(chuàng)建一個實(shí)例,每一個請求都傳遞到同一個對象.這將有利于Servlet容器充分的利用資源.因此doGet,doPos在編程時必須保證他是線程安全的.0.7.2 Servlet Context ServletContext(javax.servlet.ServletContext)定義了Web 應(yīng)用中Servlet的視圖.在Servlet中通過getServletConfig()可以訪問得到,在JSP中則通過隱式對象application得到.ServletContext提供了幾個對于創(chuàng)建Struts應(yīng)用來說非常有用的幾個方法: 1.訪問WEB應(yīng)用資源 Servlet通過getResource(),getResourceAsStream()可以訪問WEB應(yīng)用中的靜態(tài)資源文件. 2.Servlet Context屬性 Servlet上下文可以存儲JAVA對象到屬性中.這些屬性對整個WEB應(yīng)用都可見. 0.7.3 Servlet請求 Servlet請求就是javax.servlet.http.HttpServletRequest,通過它可以訪問HTTP請求的所有信息: 1. Cookies 通過getCookies()可以得到當(dāng)前請求的所有cookie 2. HTTP頭 HTTP請求的頭可以通過對應(yīng)的名字來訪問.你當(dāng)然可以通過枚舉來列出所有的頭. 3. 參數(shù) 你可以通過參數(shù)來訪問HTTP請求的URL的參數(shù)或表單中的內(nèi)容. 4. 請求特性 HTTP請求表單的提交方式(GET/POST),用的是什么協(xié)議(HTTP/HTTPS) 5. 請求URI信息 通過getRequestURI()可以得到最初的請求URI,除此之外,我們還可以得到contextPath,servletPath,pathInfo 6. 用戶信息 如果你正使用容器來進(jìn)行安全管理,你可以得到一個Principal對象來代表當(dāng)前用戶,并確認(rèn)該用戶是否擁有某叫角色的權(quán)限. Servlet請求擁有請求級別的屬性,與前面提到的應(yīng)用級別屬性類似.請求級別的屬性經(jīng)常用來傳遞狀態(tài)信息到可視化組件(如JSP). Servlet容器保證被Servlet處理的請求處于單線程內(nèi).因此你不必?fù)?dān)心在訪問request對象的屬性時會有多線程的問題. 0.7.4 Servlet響應(yīng)Servlet的功能就是接收請求,然后生成相應(yīng)的響應(yīng). 這是通過調(diào)用javax.servlet.http.HttpServletResponse的方法實(shí)現(xiàn)的. 1.設(shè)置頭 你可以設(shè)置包含在響應(yīng)中的頭.最重要的頭就是Content-Type,它用來告訴客戶端內(nèi)容的格式,比如:text/html代表html,text/xml代表XML 2.設(shè)置Cookies 你可以加入cookie到當(dāng)前的響應(yīng)中 3.發(fā)送錯誤響應(yīng) 你可以使用sendError()發(fā)送一個HTTP錯誤編號 4.重定向到其他資源 你可以使用sendRedirect()定向到另外一個URL 使用Response API的一個最重要的原則就是:操作Header,Cookie的任何方法必須在第一次輸出緩沖區(qū)滿且發(fā)送到客戶端前調(diào)用.0.7.5過濾如果你的Servlet容器是基于Servlet規(guī)范2.3或更高,那么你就可以使用javax.servlet.Filter來對請求和響應(yīng)作些處理.許多filter聚合在一起,每一個filter都有機(jī)會來對請求和響應(yīng)做處理.Struts1.0,1.1,1.2只需要Servlet規(guī)范2.2,因此這些版本的Struts并不支持filter.Struts從1.3開始就需要Servlet規(guī)范2.3的容器了.0.7.6 SessionHTTP的一個關(guān)鍵特性就是無狀態(tài),因此我們不知道某個請求是否是來自同一用戶的請求,這將會使跨請求的會話變得很艱難.為了解決這個問題,Servelet實(shí)現(xiàn)了一個javax.servlet.http.HttpSession.Servlet容器將采用Cookie或URL Rewriting來保證接鄰近的請求包含session id來標(biāo)識該請求是同一個session.因此保存在session中的屬性可以被多個請求共享. 為了不浪費(fèi)資源,Session有一個可配置的超時時間設(shè)置.如果兩個請求間的時間差超過了超時時間間隔,那么session中的數(shù)據(jù)會失效.你可以定義一個默認(rèn)的超時時間在WEB應(yīng)用部署描述文件中,或者你也可以通過setMaxInactiveInterval()動態(tài)改變它. 與request不一樣的是,你必須關(guān)心session的屬性是線程安全的,(bean提供的方法,并不是session的getAttribute和setAttribute) 比較重要的一點(diǎn)需要考慮的是:因?yàn)閟ession的屬性是占用內(nèi)存的時間較長,因此在用戶量大時,要考慮session的屬性占用內(nèi)存的大小. 0.7.7分發(fā)請求 1介紹1.1Struts的歷史Servlet剛出道時,很多Java開發(fā)者意識到它將會比CGI更快,更有效,更容易移植.但是通過println()將HTML輸出到客戶端是很煩人和容易出錯的.于是人們在JSP中找到了答案,通過將JAVA代碼與HTML混合在一起.JAVA WEB應(yīng)用開發(fā)隨之也變得以JSP為中心點(diǎn).這并不是壞事.關(guān)鍵的是它沒有給WEB應(yīng)用的流程控制及其它問題提供更多的解決方法.許多聰明的開發(fā)者意識到可以將Servlet,JSP同時部署到WEB應(yīng)用中.Servlet來做控制流程,JSP來生成HTML頁面.一個新的名詞Model 2 由此而生.Model 2 對于SUN來說并不是新奇的事物.許多人指出Model 2遵循從Smalltalk MVC框架抽象出來的MVC模式.從而人們開始把Model 2 與MVC關(guān)聯(lián)到一起.1.2 MVC模式在MVC模式中,流程由控制器(Controller)管理.控制器將請求委派到相應(yīng)的處理器,處理器與Model連在一起,每個處理器在請求與Model之間充當(dāng)一個適配的角色.Model封裝了商業(yè)邏輯或狀態(tài).然后控制流程將會轉(zhuǎn)到View. 轉(zhuǎn)向動作可以由存儲在數(shù)據(jù)庫或文件中的轉(zhuǎn)向定義來決定.這會讓View和Model之間的關(guān)系松散,從而有利于應(yīng)用的創(chuàng)建和維護(hù).1.2.1 Model(系統(tǒng)狀態(tài)和商業(yè)邏輯JavaBean)基于MVC的系統(tǒng)可以的Model可分為兩部分:一個是系統(tǒng)的狀態(tài),另一個是改變這些狀態(tài)的行為.大多數(shù)系統(tǒng)將系統(tǒng)狀態(tài)存儲在JAVABEAN中.根據(jù)系統(tǒng)復(fù)雜度的不同,有些Beans是自包含的(也就是BEAN本身知道如何持久化數(shù)據(jù)),有些是通過其它方式取得數(shù)據(jù)(數(shù)據(jù)庫,搜索引擎,EJB,LDAP).在大型系統(tǒng)中JAVABEAN可能有很多方法來維護(hù)狀態(tài)信息.在小型系統(tǒng)中,這些JAVABEAN的方法極有可能放到Struts框架的Action類中.如果商業(yè)邏輯很簡單或者它不會在其它地方重復(fù)調(diào)用,這是可以的. Struts提供了許多靈活的方式來訪問Model,但我們強(qiáng)烈建議你將商業(yè)邏輯和Action類分離開來. 1.2.2 視圖(View)-JSP和可視組件Struts應(yīng)用的視圖部分經(jīng)常是基于JSP的.JSP可以包含HTML,XML,及標(biāo)簽.Struts擁有一個標(biāo)簽庫可以讓你創(chuàng)建國際化的用戶界面以及很好的與ActionForm beans集成在一起. ActionForm 捕獲,校驗(yàn)應(yīng)用的輸入數(shù)據(jù).1.2.3控制器-ActionServlet,ActionMapping控制器負(fù)責(zé)接受來自客戶端的請求,并且決定將執(zhí)行哪個業(yè)務(wù)邏輯功能,然后再委托相應(yīng)的View來顯示用戶界面.在Struts中,主要的控制器組件就是ActionServlet,它有一組ActionMapping,每一個ActionMapping會有某個請求URL的路徑和該URL對應(yīng)的Action 類.每一個Action都是org.apache.struts.action.Action的子類.Action去調(diào)用業(yè)務(wù)邏輯類,最終將控制權(quán)交給View組件. 1.3 Struts控制流程 Struts用幾個組件組成了MVC框架的控制層.它們由Controller servlet,開發(fā)者自定義的請求處理器(handler)和其它一些輔助類構(gòu)成.Struts的自定義標(biāo)簽庫為View層提供直接的支持.有些標(biāo)簽可以訪問Control層的對象,有些則是為了方便開發(fā)應(yīng)用而寫的.其他的標(biāo)簽庫如JSTL也可以與Struts一起使用.Model層對不同的項(xiàng)目來說有很多不同.Struts讓model很容易被應(yīng)用的后臺邏輯所使用.讓我們來看看Controller,View,Model是如何融合在一起的.當(dāng)初始化時,Controller解釋struts-config.xml并且使用它部署一些控制層的對象,這些對象構(gòu)成了Struts的基礎(chǔ).這個基礎(chǔ)當(dāng)然少不了ActionMappingorg.apache.struts.action.ActionMappings.當(dāng)Struts要將請求傳遞到框架的其他組件時它就得參考ActionMapping,請求將會轉(zhuǎn)移到一個JSP或者Action-org.apache.struts.action.Action.通常,一個請求先派發(fā)到Action,然后再到JSP. 一個ActionMapping通常包含如下的屬性: 1. 請求路徑(或者URI) 2. 響應(yīng)請求的對象(Action 子類) 3. 其它所需要的屬性 Action對象可以處理請求和響應(yīng),或者將控制流轉(zhuǎn)向到其它地方.例如,如果登陸成功,將轉(zhuǎn)向到主頁面. Action對象可以訪問應(yīng)用的Controller servlet,當(dāng)控制流發(fā)生改變時,他可以將JAVABEAN放在合適的上下文中供多個Servlet共享. 例如,一個Action對象創(chuàng)建了一個購物車Bean,并且往購物車中加入所夠物品,然后把這個BEAN放在session中,當(dāng)轉(zhuǎn)向到其他URL時,就可以用到先前創(chuàng)建的購物車. 在Struts應(yīng)用中,大多數(shù)的商業(yè)邏輯都放在JAVABEAN中,Action調(diào)用JAVABEAN的方法而不需要知道它是如何實(shí)現(xiàn)的.這樣一來就封裝了商業(yè)邏輯,而Action本身將集中到錯誤處理和轉(zhuǎn)向(Forward)的處理上.JAVABEAN也可以用來管理輸入表單,設(shè)計WEB應(yīng)用的一個關(guān)鍵問題是如何保持和校驗(yàn)在兩個請求之間的用戶所輸入的數(shù)據(jù).有了Struts,你就可以用org.apache.struts.action.ActionForm來存儲和校驗(yàn)輸入表單.ActionForm被自動保存在合適的上下文中,因此它可以被其他的對象共享,如Action對象,JSP. FormBean可以被JSP用來收集用戶數(shù)據(jù),也可以由Action對象來校驗(yàn)用戶所輸入的數(shù)據(jù),還可由JSP把數(shù)據(jù)組裝到HTML的輸入域中.Struts擁有共享的拋出錯誤,顯示錯誤的機(jī)制. 另外一個Struts的培植元素就是ActionFormBeans -org.apache.struts.action.ActionFormBeans,它是一個描述性對象的集合,主要用于運(yùn)行時動態(tài)創(chuàng)建ActionForm的實(shí)例.當(dāng)一個URL映射需要ActionForm,Servlet就會通過名字去查找form-bean的描述對象,從而用它去創(chuàng)建ActionForm的實(shí)例.下面是請求需要ActionForm時的事件序列:1. Controller servlet檢索或者創(chuàng)建ActionForm 2. Controller servlet 將bean傳遞到ActionObject 3. 如果請求提交了一個輸入頁面,Action 對象可以檢查數(shù)據(jù). 4. 如果請求將要創(chuàng)建一個輸入界面, Action 對象將會組裝數(shù)據(jù)到任何輸入頁面中.2 創(chuàng)建模型組件 2.1概述許多創(chuàng)建WEB應(yīng)用的文檔都關(guān)注于View,然而我們應(yīng)該在Model的角度清晰定義需求的處理邏輯或過程.總之,Model的開發(fā)者將會創(chuàng)建JAVABEAN來實(shí)現(xiàn)功能需求.一個應(yīng)用的JAVABEAN需要什么樣的功能完全取決于需求,但它可以分為如下三類,在介紹他們之前,讓我們先看一下JAVABEAN的作用域2.2 JavaBean和作用域在WEB應(yīng)用中,JAVABEAN存儲許多不同的屬性集合中。每一個不同的屬性集合都有不同的生命周期規(guī)則。該規(guī)則定義了生命周期和可見性我們稱之為作用域(Scope),JSP定義的作用域如下:1. page Bean在當(dāng)前請求的單個JSP頁面可見(相當(dāng)于Servlet的service方法中的局部變量)2. Request Bean不僅在單個頁面可見,也可以在被頁面包含(include)的頁面或servlet中可見,或者轉(zhuǎn)向(Forward)的頁面可見。3. Session Bean在特殊用戶session的所有JSP或Servlet中可見。4. Application Bean在WEB 應(yīng)用中的所有JSP,或Servelt中可見。必須記住的是JSP和Servlet在同一個WEB應(yīng)用中共享同一組Bean。例如一個Bean在Servlet中存在request的屬性中:MyCart mycart = new MyCart(.);request.setAttribute(cart, mycart); Mycart在該Servlet轉(zhuǎn)向的JSP頁面中馬上可見。你可以在JSP中如下聲明它: 2.3 ActionForm Bean注意:ActionForm Bean的屬性經(jīng)常會對應(yīng)Model中Bean的屬性。Form bean應(yīng)該被看作是Controller的組件,同樣的,它能在Model和View兩層之間傳遞數(shù)據(jù)。Struts假定你已經(jīng)為應(yīng)用的Form定義了ActionForm.ActionForm也通常成為form bean(表單bean)。一個bean可以服務(wù)于一個form,也可一服務(wù)于多個form或者整個應(yīng)用,這完全取決于你在設(shè)計form bean時的粒度。如果你定義了ActionForm Bean在Struts的配置文件中,那么Struts框架會在執(zhí)行Action對象的方法之前為你自動執(zhí)行如下服務(wù):1檢查Bean是不是在適當(dāng)?shù)淖饔糜?如果Bean不存在,則創(chuàng)建一個實(shí)例,并且加入到適當(dāng)?shù)淖饔糜蛏舷挛闹小?如果請求的參數(shù)的名字與Bean中的屬性名字一致,對應(yīng)的setter方法就會被調(diào)用。4填滿數(shù)據(jù)的ActionForm Bean將會傳到org.apache.struts.Action的excute方法,因而系統(tǒng)狀態(tài)Bean和商業(yè)邏輯Bean就會有數(shù)據(jù)可用。2.4系統(tǒng)狀態(tài)Bean一個系統(tǒng)的狀態(tài)實(shí)際上是由許多JAVABEAN組成的。例如一個購物車系統(tǒng)對于用戶有個購物車的Bean,它里面有用戶當(dāng)前購買的商品。系統(tǒng)里還有Bean來保存用戶的信息2.5商業(yè)邏輯Bean你需要封裝你的商業(yè)邏輯在JAVABEAN的方法中。這些方法可能放在系統(tǒng)狀態(tài)Bean中,但盡可能用一個單獨(dú)類來實(shí)現(xiàn)。如果是用單獨(dú)的類來實(shí)現(xiàn),你可能需要將系統(tǒng)狀態(tài)Bean 作為參數(shù)傳到商業(yè)邏輯Bean的方法中。3 創(chuàng)建視圖組件3.1 概述這章將集中在Sruts的視圖部分。很多應(yīng)用依賴于JSP來創(chuàng)建展現(xiàn)層。Struts包含了支持國際化應(yīng)用的標(biāo)簽,也有提供輸入表單交互的標(biāo)簽。3.2 國際化信息多年以前,應(yīng)用開發(fā)者只需要支持自己國家的公民來使用軟件,他們可能使用一種語言或一種度量衡標(biāo)準(zhǔn)。隨著WEB應(yīng)用在全世界快速增長,應(yīng)用的國界也逐漸消失。因此應(yīng)用需要國際化和本地化。Struts在JAVA平臺的基礎(chǔ)上來支持國際化和本地化。回顧一下我們熟悉的概念:1. Locale JAVA中支持國際化的最基本的類,它代表一個國家和語言,同時也假定了數(shù)字或時間的格式。2.ResourceBundle JAVA中工具類用來支持不同國家的信息。3.PropertyResourceBundle ResourceBundle的一個實(shí)現(xiàn),它允許你使用”name=value”的格式來初始化屬性文件。這對于準(zhǔn)備WEB應(yīng)用的信息是非常方便的,因?yàn)檫@些信息都是文本。4.MessageFormat java.text.MessageFormat允許你在運(yùn)行時用參數(shù)替換信息字符串中的部分信息。當(dāng)某些信息在運(yùn)行時將會顯示不同的順序或不同的語言時,MessageFormat將會非常有用。占位符0將被第一個參數(shù)代替,1將被第二個參數(shù)代替,依此類推。 5.MessageResource org.apache.struts.util.MessageResources類把所有的資源綁定當(dāng)作一個數(shù)據(jù)庫來看待,允許你請求不同的Locale的信息字符串(通常與當(dāng)前用戶相關(guān)),而不是服務(wù)器上的Locale。 必須注意的是:Struts框架支持國際化僅僅限于展現(xiàn)給用戶的文本和圖片,支持本地化的輸入方法(例如使用何種語言)則由客戶端的設(shè)備(通常是瀏覽器)實(shí)現(xiàn)。 讓我們來了解一下將屬性文件綁定到WEB應(yīng)用的步驟, 假如你的代碼在com.mycompany.mypackage,為了實(shí)現(xiàn)資源綁定,你需要創(chuàng)建如下文件: 1MyAperties 默認(rèn)語言的所有信息,如果默認(rèn)語言是英語,在你的屬性文件中可能有如下入口prompt.hello=Hello2MyApplication_perties ISO語言代碼所對應(yīng)語言的所有信息,如果語言是法語,屬性文件中可能有如下入口prompt.hello=Bonjour當(dāng)你在WEB應(yīng)用的部署描述文件中定義Controller Servlet時,你可能需要把應(yīng)用的資源綁定名稱作為初始化參數(shù)傳進(jìn)去。 action org.apache.struts.action.ActionServlet application com.mycompany.mypackage.MyResources 最重要的是要保證資源綁定能在你的應(yīng)用的CLASSPATH找得到。另外一個方法就是把MyRperties放在classes目錄,然后用MyResoureces來引用就行了。 3.3Forms 和 FormBeans的交互很多WEB開發(fā)者使用HTML本身的功能來實(shí)現(xiàn)表單,比如Input。用戶期望交互應(yīng)用能具備某些必備的功能,比如錯誤處理(當(dāng)出現(xiàn)錯誤時,只需要修改導(dǎo)致錯誤出現(xiàn)的地方,而不要重新輸入頁面或表單中的信息)。用標(biāo)準(zhǔn)的HTML和JSP來實(shí)現(xiàn)錯誤處理是麻煩而且很乏味。一個輸入用戶名的界面在JSP中如下表示:input type=text name=username value=/ 輸入如上的字符對于沒有編程理念的HTML編寫者來說是很容易出錯的。Struts在提供了一些自定義標(biāo)簽來實(shí)現(xiàn)上述的功能: ; 上述表示法并不要很明顯的指定與JAVABEAN相關(guān)聯(lián),它的處理完全由框架實(shí)現(xiàn)。 3.3.1索引和映射屬性JSP頁面中的標(biāo)簽屬性可以引用JAVABEAN中的屬性。大多數(shù)都是引用簡單類型或簡單對象。但Struts允許你利用Jakarta Commons Beanutils library提供的功能來引用Array,Conllection,Map的單個項(xiàng)。 3.3.2 輸入域的支持Srust支持如下的輸入域:1Checkbox2Hidden field3Password4Radio5Reset6Select7Option8Options9Submit10 Text11 TextArea在任何情況下,這些標(biāo)簽必須嵌套在 form標(biāo)簽中,只有這樣輸入域才知道它要使用那個Bean 。3.3.3 一些有用的標(biāo)簽IteratePresentNopresentLinkImgParametr3.3.4 自動表單校驗(yàn)Strust提供了校驗(yàn)表單的功能,為了使用此功能,你需要重載ActionForm的如下方法:validate(ActionMapping mapping,HttpServletRequest request); 當(dāng)Bean的屬性的數(shù)據(jù)被填充后,在調(diào)用Action的excute方法之前,Controller Servlet來調(diào)用validate方法。Validate方法的執(zhí)行有如下幾種情況: 1.執(zhí)行校驗(yàn)但沒有錯誤 返回NULL或0長度的ActionErrors實(shí)例,Controller Servlet將繼續(xù)執(zhí)行Action的方法。 2.執(zhí)行校驗(yàn)但有錯誤 返回ActionErrors實(shí)例,每一個ActionError有對應(yīng)的錯誤消息關(guān)鍵值。Controller Servlet將把錯誤消息數(shù)組保存到請求級別的上下文中供標(biāo)簽使用。 3.3.5 Struts校驗(yàn)器為表單配置校驗(yàn)器是很簡單的。1ActionForm須繼承ValidatorForm 2表單所在的JSP頁面須包含標(biāo)簽用于客戶端的校驗(yàn)3你需要定義校驗(yàn)規(guī)則在XML文件中 4最后,你必須在struts-config.xml文件中激活ValidatorPlugin 3.4 其他表示層技術(shù)盡管外觀可以用JSP或Struts的標(biāo)簽來實(shí)現(xiàn),但你仍然應(yīng)該考慮融合其他技術(shù)來提高組件的重用,減少維護(hù)工作量,減少錯誤。3.4.1 特定應(yīng)用標(biāo)簽忽略3.4.2使用包含組合頁面將一個頁面放在一個JSP文件中是一個普遍的設(shè)計方法,但是許多應(yīng)用需要將應(yīng)用中的不同部分顯示在一個頁面中。例如一個門戶應(yīng)用需要如下功能:1. 訪問門戶的搜索引擎2. 訪問門戶的討論區(qū)3. 用戶感興趣的話題4. 郵件等待指示器將這些不同的功能交給不同的開發(fā)者開發(fā),要完成這個門戶應(yīng)用是比較容易的。然后你就可以使用包含(include)來將它們組合到一個頁面中。有三種不同的包含方式,選擇哪種取決于你希望整個輸出在什么時候整合:1. 2. 3. bean:include3.4.3 使用Tiles組合頁面Tiles是一個功能很強(qiáng)的模板庫,它可以將很多tile組合成最終的視圖。以下是設(shè)置向?qū)В?創(chuàng)建layout/layout.jsp,它包含標(biāo)準(zhǔn)外觀 2創(chuàng)建你的主頁/index.jspThis is my homepage 3創(chuàng)建文件/WEB-INF/tiles-defs.xml 4在文件struts-config.xml中設(shè)置TilesPlugin 5在struts-config.xml文件中設(shè)置一個Action指向你的主頁 3.4.4 圖片渲染組件一些應(yīng)用需要動態(tài)產(chǎn)生圖片,有兩種方法符合如下需求:1. 產(chǎn)生一個執(zhí)行Servlet請求的超鏈接 Servlet將使用圖形庫來產(chǎn)生圖片2. 將JAVA Applet嵌入在HTML頁面中來產(chǎn)生圖片3.4.5 文本輸出一些應(yīng)用需要動態(tài)的產(chǎn)生文本(如XML),因?yàn)檎麄€頁面將通過PrinterWriter輸出,我們可以通過設(shè)置PrinterWriter的屬性來做到:response.setContentType(text/plain); / or text/xml PrintWriter writer = response.getWriter(); / use writer to render text return(null); 3.4.6 Struts EL 標(biāo)簽庫Struts基本的標(biāo)簽都是依賴rtexprvalue(runtime scriptlet expression)來動態(tài)計算屬性 的值,例如,要根據(jù)資源關(guān)鍵值打印來自屬性文件中的信息 bean:message key=/ 這樣寫是假定stringvar是JSP中的 腳本變量,如果使用Struts的EL標(biāo)簽庫就會是如下形式: 4 創(chuàng)建控制(Controller)組件4.1 概述我們已經(jīng)知道如何去構(gòu)建Model和View組件,現(xiàn)在我們將集中到Controller組件。Struts包含了一個映射請求URI到Action類的Servlet。因此你編寫WEB應(yīng)用時在Controller組件這方面要做的工作如下:1編寫AtionForm作為Model和View的中介2編寫Action(繼承org.apache.struts.action.Action)來處理請求3為每一個邏輯請求在struts-config.xml.中編寫一個ActionMapping4.2 ActionServlet對于熟悉MVC架構(gòu)的人來講,ActionServlet就代表著C Controller。Controller的任務(wù)是:1處理用戶請求2根據(jù)用戶請求來決定用戶將要完成什么任務(wù)3將Model的數(shù)據(jù)傳到視圖(View)4選擇合適的視圖響應(yīng)請求Controller會將大部分工作放到Request Processor和Action 類中。 4.2.1 請求處理器(Request Processor)RequestProcessor對每個請求做核心處理的地方,它要做的處理如下:1. processPath 確定請求的路徑,以備后面的處理檢索ActionMapping 2. processLocale 為請求選擇一個locale3. processContent 設(shè)置默認(rèn)的內(nèi)容(Content)類型.4. processNoCache 設(shè)置響應(yīng)頭:Pragma,Cache-Control,Expires5. processPreprocess RequestProcessor讓子類重載實(shí)現(xiàn),默認(rèn)返回真(True),如果子類重載此方法并返回真,則該請求將繼續(xù)處理流程,如果返回假,則意味著你處理了該請求,處理流程直接返回。6. processMapping 確定請求所對應(yīng)路徑的ActionMapping7. processRoles 保證請求的用戶具備特定的角色8. processActionForm 實(shí)例化ActioForm并且把它放在適當(dāng)?shù)淖饔糜蛑小?. processPopulate 用請求中的數(shù)據(jù)組裝ActionForm10. processValidate 校驗(yàn)ActionForm中的數(shù)據(jù)11. processForward 如果映射是一個轉(zhuǎn)向( Forward)指令,就轉(zhuǎn)向到特定的路徑。12. processInclude 如果映射是一個包含(Include)指令,就將映射指定的路徑的輸出結(jié)果包含進(jìn)來。13. processActionCreate 實(shí)例化映射指定的Action.14. processActionPerform 執(zhí)行Action的perform或excute方法。15. processForwardConfig 最后RequetProcessor使用Action類返回的ActionForward來選擇下一個資源。大多數(shù)的AtionForward將會導(dǎo)航到顯示頁面輸出響應(yīng)。4.3 ActionForm類一個ActionForm代表著一個與用戶交互的HTML表單。ActionForm中的屬性來存儲表單中的狀態(tài),并且有g(shù)etter,setter方法來訪問他們。ActionForm可以存儲在session或request的作用域中(默認(rèn)的是session).如果ActionForm放在session中記得要實(shí)現(xiàn)reset方法,以備每次使用ActionForm時都會初始化。Struts根據(jù)請求中的參數(shù)設(shè)置ActionForm的屬性并且把經(jīng)過校驗(yàn)后的ActionForm傳到Action的execute方法。當(dāng)你在編寫ActionForm時必須堅(jiān)持如下原則:1ActionForm本身沒有任何特定的方法被實(shí)現(xiàn)。僅僅用來表示它是整個框架中一個特定的角色。ActinForm中只有g(shù)etter,setter方法,并沒有任何商業(yè)邏輯。2AtionForm提供標(biāo)準(zhǔn)的校驗(yàn)機(jī)制。如果你重載了ActionForm的validate方法,并且在資源屬性文件中提供了錯誤消息,那么Struts就會自動校驗(yàn)表單中的數(shù)據(jù)。當(dāng)然你也可以忽略ActionForm中的校驗(yàn),在Action類中來實(shí)現(xiàn)校驗(yàn)。3為輸入表單中的每一個輸入定義屬性。輸入域的名稱和ActionForm中屬性的名稱必須符合JAVA規(guī)范。例如一個輸入域的名稱username將會導(dǎo)致ActionForm中的setUsername被調(diào)用。4也可以為Form中的按鈕或其他控件定義屬性。當(dāng)提交表單時這將有利于你知道哪個控件被選中了。5把ActionForm當(dāng)作HTTP和Action之間的防火墻。ActionForm的方法可以校驗(yàn)所有必須的屬性已經(jīng)存在了并且包含合理的值。如果校驗(yàn)失敗請求將不會被Action類處理。6你可能會放一個Bean的實(shí)例在ActinForm中,這樣你就會用到嵌套屬性引用。例如,你可能有一個“customer”在ActionForm中,然后在頁面中用“”來引用屬性。4.3.1 DynaActionForm維護(hù)一個具體的ActionForm是要耗費(fèi)時間的。特別是ActionForm越來越多并且都是校驗(yàn)一些簡單的屬性時你可能會感覺到一股挫折感。這個瓶頸通過DynaActionForm會有所減輕。通過在Struts的配置文件中列出屬性,類型和默認(rèn)值來替代以前的定義一個新類,并且添加getter/setter方法。例如,在struts-config.xml中添加一個UserForm: DynaActionForm支持的數(shù)據(jù)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 子宮頸腫瘤教學(xué)
- 秘書入職培訓(xùn)
- 電廠安全教育
- 擔(dān)當(dāng)力培訓(xùn)課件
- 中醫(yī)內(nèi)科心衰診療要點(diǎn)
- 公司人事行政制度培訓(xùn)
- 實(shí)習(xí)調(diào)研報告范文3000字
- 精益生產(chǎn)助理內(nèi)訓(xùn)師培訓(xùn)
- 農(nóng)村會計基礎(chǔ)培訓(xùn)課件
- 作業(yè)治療技術(shù)及康復(fù)護(hù)理
- GB/T 19844-2005鋼板彈簧
- 湖南常德2022生地會考試卷及答案
- 2023年濟(jì)南綜??毓杉瘓F(tuán)有限公司招聘筆試題庫及答案解析
- 電力拖動自動控制系統(tǒng)-運(yùn)動控制系統(tǒng)(第5版)習(xí)題答案
- 禾川x3系列伺服說明書
- 細(xì)胞生物學(xué)(全套1047張課件)
- 魚丸生產(chǎn)加工項(xiàng)目可行性研究報告
- 架空乘人裝置專項(xiàng)設(shè)計(一采區(qū)運(yùn)輸下山)
- 六年級下冊“快樂讀書吧”練習(xí)題試題及答案
- ★教導(dǎo)型組織-行動管理模式(三)
- 朗文英語2B英語復(fù)習(xí)資料
評論
0/150
提交評論