




已閱讀5頁,還剩26頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
Struts使用手冊(cè) 0 序2 0.1猜想2 0.2 HTTP,HTML,User Agents2 0.3 HTTP 請(qǐng)求/響應(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猜想本手冊(cè)適合于有創(chuàng)建Java Web 應(yīng)用經(jīng)驗(yàn)的Web開發(fā)人員.在開始學(xué)習(xí)Struts之前你應(yīng)該了解如下的技術(shù):1. HTTP,HTML,User Agents2. HTTP 請(qǐng)求/響應(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)識(shí)語言建立的.用戶代理,比如瀏覽器,他們使用HTTP去請(qǐng)求一個(gè)文檔然后格式化顯示.0.3 HTTP 請(qǐng)求/響應(yīng)周期對(duì)于Web開發(fā)者來說,理解HTTP的請(qǐng)求和響應(yīng)周期是很重要的.你要使用HTTP發(fā)送一個(gè)請(qǐng)求,然后服務(wù)器給你一個(gè)響應(yīng).當(dāng)你創(chuàng)建WEB應(yīng)用時(shí),你需要返回一個(gè)響應(yīng)對(duì)象來回應(yīng)請(qǐng)求.0.4 Java語言和應(yīng)用框架Struts是用JAVA編寫的.JAVA是面向?qū)ο蟮恼Z言,而Struts充分利用了面向?qū)ο蟮募夹g(shù).除此而外JAVA支持線程.如果你很好的掌握了JAVA,特別是面向?qū)ο缶幊毯途€程,這將會(huì)有益于最有效的使用Struts和這個(gè)手冊(cè).0.5 JavaBeans象大多數(shù)JAVA應(yīng)用一樣,大多數(shù)Struts對(duì)象都是JavaBean.遵循JavaBean設(shè)計(jì)模式使得Struts更容易被開發(fā)者和JAVA開發(fā)工具使用.盡管JavaBean的最初是用來開發(fā)可視元素的,但它對(duì)開發(fā)可重用組件也非常有益.0.5.1反射和內(nèi)省反射是決定什么樣的函數(shù)或域存在某對(duì)象中的方法.內(nèi)省是反射的特殊形式.使用內(nèi)省就可以知道哪些方法將會(huì)被其他對(duì)象使用(如getter,setter)Struts框架使用內(nèi)省來轉(zhuǎn)換HTTP參數(shù)到JAVABEAN的屬性中和把JAVABEAN中的屬性數(shù)據(jù)組裝到HTML的域.0.5.2 MAPJAVABEAN把數(shù)據(jù)存在屬性中.JAVABEAN雖然是靈活而功能強(qiáng)的對(duì)象,但它并不是編程者存儲(chǔ)數(shù)據(jù)的唯一對(duì)象.另一個(gè)熟為人知的對(duì)象是java.util.Map.Map它是一個(gè)名字/值對(duì)的數(shù)據(jù)集合,它經(jīng)常用來存儲(chǔ)動(dòng)態(tài)數(shù)據(jù).0.5.3 DynaBeansDynaBeans集成了JAVABEAN 的擴(kuò)展性和MAP的靈活性.編寫JAVABEAN要?jiǎng)?chuàng)建一個(gè)新類,并且要為每個(gè)屬性編寫方法.DynaBeans則將屬性放在XML中配置.在Struts應(yīng)用中,你可以使用DynaBeans來描述你的HTML Form,這個(gè)策略可以避免編寫普通的JAVABEAN來存儲(chǔ)很簡單的屬性.0.6屬性文件和資源綁定JAVA應(yīng)用包括WEB應(yīng)用的配置經(jīng)常使用屬性文件來完成. Struts的消息資源都是通過資源綁定和屬性文件實(shí)現(xiàn)的.JAVA資源綁定使用一個(gè)或多個(gè)屬性文件來實(shí)現(xiàn)應(yīng)用的國際化.0.7 JavaServlet由于JAVA是面向?qū)ο蟮恼Z言,因此JAVA平臺(tái)已經(jīng)將HTTP轉(zhuǎn)換成對(duì)象的形式.這將會(huì)使JAVA 程序員關(guān)注于應(yīng)用本身而不是HTTP.HTTP提供了一個(gè)標(biāo)準(zhǔn)的機(jī)制來擴(kuò)展服務(wù)器的功能,我們稱之為CGI. 服務(wù)器將請(qǐng)求發(fā)送到CGI程序,CGI程序則返回一個(gè)響應(yīng).同樣的任何JAVA服務(wù)器則會(huì)接收請(qǐng)求,然后轉(zhuǎn)發(fā)到Servlet.Servelt 是javax.servlet.http.HttpServlet的子類,每個(gè)Servlet必須完成四個(gè)方法: public void init(ServletConfig config) public void doGet(HttpServletRequest request, HttpServletResponse response) public void doPost(HttpServletRequest request, HttpServletResponse response) public void destroy() Struts提供了一個(gè)可用的Servlet-org.apache.struts.action.ActionServlet. 作為一個(gè)Struts開發(fā)者,你只需要編寫對(duì)象供ActionServlet調(diào)用就行了.但是,理解Servlet并熟悉他在JAVA WEB應(yīng)用中扮演的角色那是最好不過了.0.7.1 Servlets 和多線程為了提高性能,Servlet設(shè)計(jì)程多線程.每個(gè)Servlet僅創(chuàng)建一個(gè)實(shí)例,每一個(gè)請(qǐng)求都傳遞到同一個(gè)對(duì)象.這將有利于Servlet容器充分的利用資源.因此doGet,doPos在編程時(shí)必須保證他是線程安全的.0.7.2 Servlet Context ServletContext(javax.servlet.ServletContext)定義了Web 應(yīng)用中Servlet的視圖.在Servlet中通過getServletConfig()可以訪問得到,在JSP中則通過隱式對(duì)象application得到.ServletContext提供了幾個(gè)對(duì)于創(chuàng)建Struts應(yīng)用來說非常有用的幾個(gè)方法: 1.訪問WEB應(yīng)用資源 Servlet通過getResource(),getResourceAsStream()可以訪問WEB應(yīng)用中的靜態(tài)資源文件. 2.Servlet Context屬性 Servlet上下文可以存儲(chǔ)JAVA對(duì)象到屬性中.這些屬性對(duì)整個(gè)WEB應(yīng)用都可見. 0.7.3 Servlet請(qǐng)求 Servlet請(qǐng)求就是javax.servlet.http.HttpServletRequest,通過它可以訪問HTTP請(qǐng)求的所有信息: 1. Cookies 通過getCookies()可以得到當(dāng)前請(qǐng)求的所有cookie 2. HTTP頭 HTTP請(qǐng)求的頭可以通過對(duì)應(yīng)的名字來訪問.你當(dāng)然可以通過枚舉來列出所有的頭. 3. 參數(shù) 你可以通過參數(shù)來訪問HTTP請(qǐng)求的URL的參數(shù)或表單中的內(nèi)容. 4. 請(qǐng)求特性 HTTP請(qǐng)求表單的提交方式(GET/POST),用的是什么協(xié)議(HTTP/HTTPS) 5. 請(qǐng)求URI信息 通過getRequestURI()可以得到最初的請(qǐng)求URI,除此之外,我們還可以得到contextPath,servletPath,pathInfo 6. 用戶信息 如果你正使用容器來進(jìn)行安全管理,你可以得到一個(gè)Principal對(duì)象來代表當(dāng)前用戶,并確認(rèn)該用戶是否擁有某叫角色的權(quán)限. Servlet請(qǐng)求擁有請(qǐng)求級(jí)別的屬性,與前面提到的應(yīng)用級(jí)別屬性類似.請(qǐng)求級(jí)別的屬性經(jīng)常用來傳遞狀態(tài)信息到可視化組件(如JSP). Servlet容器保證被Servlet處理的請(qǐng)求處于單線程內(nèi).因此你不必?fù)?dān)心在訪問request對(duì)象的屬性時(shí)會(huì)有多線程的問題. 0.7.4 Servlet響應(yīng)Servlet的功能就是接收請(qǐng)求,然后生成相應(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ā)送錯(cuò)誤響應(yīng) 你可以使用sendError()發(fā)送一個(gè)HTTP錯(cuò)誤編號(hào) 4.重定向到其他資源 你可以使用sendRedirect()定向到另外一個(gè)URL 使用Response API的一個(gè)最重要的原則就是:操作Header,Cookie的任何方法必須在第一次輸出緩沖區(qū)滿且發(fā)送到客戶端前調(diào)用.0.7.5過濾如果你的Servlet容器是基于Servlet規(guī)范2.3或更高,那么你就可以使用javax.servlet.Filter來對(duì)請(qǐng)求和響應(yīng)作些處理.許多filter聚合在一起,每一個(gè)filter都有機(jī)會(huì)來對(duì)請(qǐng)求和響應(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的一個(gè)關(guān)鍵特性就是無狀態(tài),因此我們不知道某個(gè)請(qǐng)求是否是來自同一用戶的請(qǐng)求,這將會(huì)使跨請(qǐng)求的會(huì)話變得很艱難.為了解決這個(gè)問題,Servelet實(shí)現(xiàn)了一個(gè)javax.servlet.http.HttpSession.Servlet容器將采用Cookie或URL Rewriting來保證接鄰近的請(qǐng)求包含session id來標(biāo)識(shí)該請(qǐng)求是同一個(gè)session.因此保存在session中的屬性可以被多個(gè)請(qǐng)求共享. 為了不浪費(fèi)資源,Session有一個(gè)可配置的超時(shí)時(shí)間設(shè)置.如果兩個(gè)請(qǐng)求間的時(shí)間差超過了超時(shí)時(shí)間間隔,那么session中的數(shù)據(jù)會(huì)失效.你可以定義一個(gè)默認(rèn)的超時(shí)時(shí)間在WEB應(yīng)用部署描述文件中,或者你也可以通過setMaxInactiveInterval()動(dòng)態(tài)改變它. 與request不一樣的是,你必須關(guān)心session的屬性是線程安全的,(bean提供的方法,并不是session的getAttribute和setAttribute) 比較重要的一點(diǎn)需要考慮的是:因?yàn)閟ession的屬性是占用內(nèi)存的時(shí)間較長,因此在用戶量大時(shí),要考慮session的屬性占用內(nèi)存的大小. 0.7.7分發(fā)請(qǐng)求 1介紹1.1Struts的歷史Servlet剛出道時(shí),很多Java開發(fā)者意識(shí)到它將會(huì)比CGI更快,更有效,更容易移植.但是通過println()將HTML輸出到客戶端是很煩人和容易出錯(cuò)的.于是人們?cè)贘SP中找到了答案,通過將JAVA代碼與HTML混合在一起.JAVA WEB應(yīng)用開發(fā)隨之也變得以JSP為中心點(diǎn).這并不是壞事.關(guān)鍵的是它沒有給WEB應(yīng)用的流程控制及其它問題提供更多的解決方法.許多聰明的開發(fā)者意識(shí)到可以將Servlet,JSP同時(shí)部署到WEB應(yīng)用中.Servlet來做控制流程,JSP來生成HTML頁面.一個(gè)新的名詞Model 2 由此而生.Model 2 對(duì)于SUN來說并不是新奇的事物.許多人指出Model 2遵循從Smalltalk MVC框架抽象出來的MVC模式.從而人們開始把Model 2 與MVC關(guān)聯(lián)到一起.1.2 MVC模式在MVC模式中,流程由控制器(Controller)管理.控制器將請(qǐng)求委派到相應(yīng)的處理器,處理器與Model連在一起,每個(gè)處理器在請(qǐng)求與Model之間充當(dāng)一個(gè)適配的角色.Model封裝了商業(yè)邏輯或狀態(tài).然后控制流程將會(huì)轉(zhuǎn)到View. 轉(zhuǎn)向動(dòng)作可以由存儲(chǔ)在數(shù)據(jù)庫或文件中的轉(zhuǎn)向定義來決定.這會(huì)讓View和Model之間的關(guān)系松散,從而有利于應(yīng)用的創(chuàng)建和維護(hù).1.2.1 Model(系統(tǒng)狀態(tài)和商業(yè)邏輯JavaBean)基于MVC的系統(tǒng)可以的Model可分為兩部分:一個(gè)是系統(tǒng)的狀態(tài),另一個(gè)是改變這些狀態(tài)的行為.大多數(shù)系統(tǒng)將系統(tǒng)狀態(tài)存儲(chǔ)在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è)邏輯很簡單或者它不會(huì)在其它地方重復(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擁有一個(gè)標(biāo)簽庫可以讓你創(chuàng)建國際化的用戶界面以及很好的與ActionForm beans集成在一起. ActionForm 捕獲,校驗(yàn)應(yīng)用的輸入數(shù)據(jù).1.2.3控制器-ActionServlet,ActionMapping控制器負(fù)責(zé)接受來自客戶端的請(qǐng)求,并且決定將執(zhí)行哪個(gè)業(yè)務(wù)邏輯功能,然后再委托相應(yīng)的View來顯示用戶界面.在Struts中,主要的控制器組件就是ActionServlet,它有一組ActionMapping,每一個(gè)ActionMapping會(huì)有某個(gè)請(qǐng)求URL的路徑和該URL對(duì)應(yīng)的Action 類.每一個(gè)Action都是org.apache.struts.action.Action的子類.Action去調(diào)用業(yè)務(wù)邏輯類,最終將控制權(quán)交給View組件. 1.3 Struts控制流程 Struts用幾個(gè)組件組成了MVC框架的控制層.它們由Controller servlet,開發(fā)者自定義的請(qǐng)求處理器(handler)和其它一些輔助類構(gòu)成.Struts的自定義標(biāo)簽庫為View層提供直接的支持.有些標(biāo)簽可以訪問Control層的對(duì)象,有些則是為了方便開發(fā)應(yīng)用而寫的.其他的標(biāo)簽庫如JSTL也可以與Struts一起使用.Model層對(duì)不同的項(xiàng)目來說有很多不同.Struts讓model很容易被應(yīng)用的后臺(tái)邏輯所使用.讓我們來看看Controller,View,Model是如何融合在一起的.當(dāng)初始化時(shí),Controller解釋struts-config.xml并且使用它部署一些控制層的對(duì)象,這些對(duì)象構(gòu)成了Struts的基礎(chǔ).這個(gè)基礎(chǔ)當(dāng)然少不了ActionMappingorg.apache.struts.action.ActionMappings.當(dāng)Struts要將請(qǐng)求傳遞到框架的其他組件時(shí)它就得參考ActionMapping,請(qǐng)求將會(huì)轉(zhuǎn)移到一個(gè)JSP或者Action-org.apache.struts.action.Action.通常,一個(gè)請(qǐng)求先派發(fā)到Action,然后再到JSP. 一個(gè)ActionMapping通常包含如下的屬性: 1. 請(qǐng)求路徑(或者URI) 2. 響應(yīng)請(qǐng)求的對(duì)象(Action 子類) 3. 其它所需要的屬性 Action對(duì)象可以處理請(qǐng)求和響應(yīng),或者將控制流轉(zhuǎn)向到其它地方.例如,如果登陸成功,將轉(zhuǎn)向到主頁面. Action對(duì)象可以訪問應(yīng)用的Controller servlet,當(dāng)控制流發(fā)生改變時(shí),他可以將JAVABEAN放在合適的上下文中供多個(gè)Servlet共享. 例如,一個(gè)Action對(duì)象創(chuàng)建了一個(gè)購物車Bean,并且往購物車中加入所夠物品,然后把這個(gè)BEAN放在session中,當(dāng)轉(zhuǎn)向到其他URL時(shí),就可以用到先前創(chuàng)建的購物車. 在Struts應(yīng)用中,大多數(shù)的商業(yè)邏輯都放在JAVABEAN中,Action調(diào)用JAVABEAN的方法而不需要知道它是如何實(shí)現(xiàn)的.這樣一來就封裝了商業(yè)邏輯,而Action本身將集中到錯(cuò)誤處理和轉(zhuǎn)向(Forward)的處理上.JAVABEAN也可以用來管理輸入表單,設(shè)計(jì)WEB應(yīng)用的一個(gè)關(guān)鍵問題是如何保持和校驗(yàn)在兩個(gè)請(qǐng)求之間的用戶所輸入的數(shù)據(jù).有了Struts,你就可以用org.apache.struts.action.ActionForm來存儲(chǔ)和校驗(yàn)輸入表單.ActionForm被自動(dòng)保存在合適的上下文中,因此它可以被其他的對(duì)象共享,如Action對(duì)象,JSP. FormBean可以被JSP用來收集用戶數(shù)據(jù),也可以由Action對(duì)象來校驗(yàn)用戶所輸入的數(shù)據(jù),還可由JSP把數(shù)據(jù)組裝到HTML的輸入域中.Struts擁有共享的拋出錯(cuò)誤,顯示錯(cuò)誤的機(jī)制. 另外一個(gè)Struts的培植元素就是ActionFormBeans -org.apache.struts.action.ActionFormBeans,它是一個(gè)描述性對(duì)象的集合,主要用于運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建ActionForm的實(shí)例.當(dāng)一個(gè)URL映射需要ActionForm,Servlet就會(huì)通過名字去查找form-bean的描述對(duì)象,從而用它去創(chuàng)建ActionForm的實(shí)例.下面是請(qǐng)求需要ActionForm時(shí)的事件序列:1. Controller servlet檢索或者創(chuàng)建ActionForm 2. Controller servlet 將bean傳遞到ActionObject 3. 如果請(qǐng)求提交了一個(gè)輸入頁面,Action 對(duì)象可以檢查數(shù)據(jù). 4. 如果請(qǐng)求將要?jiǎng)?chuàng)建一個(gè)輸入界面, Action 對(duì)象將會(huì)組裝數(shù)據(jù)到任何輸入頁面中.2 創(chuàng)建模型組件 2.1概述許多創(chuàng)建WEB應(yīng)用的文檔都關(guān)注于View,然而我們應(yīng)該在Model的角度清晰定義需求的處理邏輯或過程.總之,Model的開發(fā)者將會(huì)創(chuàng)建JAVABEAN來實(shí)現(xiàn)功能需求.一個(gè)應(yīng)用的JAVABEAN需要什么樣的功能完全取決于需求,但它可以分為如下三類,在介紹他們之前,讓我們先看一下JAVABEAN的作用域2.2 JavaBean和作用域在WEB應(yīng)用中,JAVABEAN存儲(chǔ)許多不同的屬性集合中。每一個(gè)不同的屬性集合都有不同的生命周期規(guī)則。該規(guī)則定義了生命周期和可見性我們稱之為作用域(Scope),JSP定義的作用域如下:1. page Bean在當(dāng)前請(qǐng)求的單個(gè)JSP頁面可見(相當(dāng)于Servlet的service方法中的局部變量)2. Request Bean不僅在單個(gè)頁面可見,也可以在被頁面包含(include)的頁面或servlet中可見,或者轉(zhuǎn)向(Forward)的頁面可見。3. Session Bean在特殊用戶session的所有JSP或Servlet中可見。4. Application Bean在WEB 應(yīng)用中的所有JSP,或Servelt中可見。必須記住的是JSP和Servlet在同一個(gè)WEB應(yīng)用中共享同一組Bean。例如一個(gè)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)常會(huì)對(duì)應(yīng)Model中Bean的屬性。Form bean應(yīng)該被看作是Controller的組件,同樣的,它能在Model和View兩層之間傳遞數(shù)據(jù)。Struts假定你已經(jīng)為應(yīng)用的Form定義了ActionForm.ActionForm也通常成為form bean(表單bean)。一個(gè)bean可以服務(wù)于一個(gè)form,也可一服務(wù)于多個(gè)form或者整個(gè)應(yīng)用,這完全取決于你在設(shè)計(jì)form bean時(shí)的粒度。如果你定義了ActionForm Bean在Struts的配置文件中,那么Struts框架會(huì)在執(zhí)行Action對(duì)象的方法之前為你自動(dòng)執(zhí)行如下服務(wù):1檢查Bean是不是在適當(dāng)?shù)淖饔糜?如果Bean不存在,則創(chuàng)建一個(gè)實(shí)例,并且加入到適當(dāng)?shù)淖饔糜蛏舷挛闹小?如果請(qǐng)求的參數(shù)的名字與Bean中的屬性名字一致,對(duì)應(yīng)的setter方法就會(huì)被調(diào)用。4填滿數(shù)據(jù)的ActionForm Bean將會(huì)傳到org.apache.struts.Action的excute方法,因而系統(tǒng)狀態(tài)Bean和商業(yè)邏輯Bean就會(huì)有數(shù)據(jù)可用。2.4系統(tǒng)狀態(tài)Bean一個(gè)系統(tǒng)的狀態(tài)實(shí)際上是由許多JAVABEAN組成的。例如一個(gè)購物車系統(tǒng)對(duì)于用戶有個(gè)購物車的Bean,它里面有用戶當(dāng)前購買的商品。系統(tǒng)里還有Bean來保存用戶的信息2.5商業(yè)邏輯Bean你需要封裝你的商業(yè)邏輯在JAVABEAN的方法中。這些方法可能放在系統(tǒng)狀態(tài)Bean中,但盡可能用一個(gè)單獨(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平臺(tái)的基礎(chǔ)上來支持國際化和本地化?;仡櫼幌挛覀兪煜さ母拍睿?. Locale JAVA中支持國際化的最基本的類,它代表一個(gè)國家和語言,同時(shí)也假定了數(shù)字或時(shí)間的格式。2.ResourceBundle JAVA中工具類用來支持不同國家的信息。3.PropertyResourceBundle ResourceBundle的一個(gè)實(shí)現(xiàn),它允許你使用”name=value”的格式來初始化屬性文件。這對(duì)于準(zhǔn)備WEB應(yīng)用的信息是非常方便的,因?yàn)檫@些信息都是文本。4.MessageFormat java.text.MessageFormat允許你在運(yùn)行時(shí)用參數(shù)替換信息字符串中的部分信息。當(dāng)某些信息在運(yùn)行時(shí)將會(huì)顯示不同的順序或不同的語言時(shí),MessageFormat將會(huì)非常有用。占位符0將被第一個(gè)參數(shù)代替,1將被第二個(gè)參數(shù)代替,依此類推。 5.MessageResource org.apache.struts.util.MessageResources類把所有的資源綁定當(dāng)作一個(gè)數(shù)據(jù)庫來看待,允許你請(qǐng)求不同的Locale的信息字符串(通常與當(dāng)前用戶相關(guān)),而不是服務(wù)器上的Locale。 必須注意的是:Struts框架支持國際化僅僅限于展現(xiàn)給用戶的文本和圖片,支持本地化的輸入方法(例如使用何種語言)則由客戶端的設(shè)備(通常是瀏覽器)實(shí)現(xiàn)。 讓我們來了解一下將屬性文件綁定到WEB應(yīng)用的步驟, 假如你的代碼在com.mycompany.mypackage,為了實(shí)現(xiàn)資源綁定,你需要?jiǎng)?chuàng)建如下文件: 1MyAperties 默認(rèn)語言的所有信息,如果默認(rèn)語言是英語,在你的屬性文件中可能有如下入口prompt.hello=Hello2MyApplication_perties ISO語言代碼所對(duì)應(yīng)語言的所有信息,如果語言是法語,屬性文件中可能有如下入口prompt.hello=Bonjour當(dāng)你在WEB應(yīng)用的部署描述文件中定義Controller Servlet時(shí),你可能需要把應(yīng)用的資源綁定名稱作為初始化參數(shù)傳進(jìn)去。 action org.apache.struts.action.ActionServlet application com.mycompany.mypackage.MyResources 最重要的是要保證資源綁定能在你的應(yīng)用的CLASSPATH找得到。另外一個(gè)方法就是把MyRperties放在classes目錄,然后用MyResoureces來引用就行了。 3.3Forms 和 FormBeans的交互很多WEB開發(fā)者使用HTML本身的功能來實(shí)現(xiàn)表單,比如Input。用戶期望交互應(yīng)用能具備某些必備的功能,比如錯(cuò)誤處理(當(dāng)出現(xiàn)錯(cuò)誤時(shí),只需要修改導(dǎo)致錯(cuò)誤出現(xiàn)的地方,而不要重新輸入頁面或表單中的信息)。用標(biāo)準(zhǔn)的HTML和JSP來實(shí)現(xiàn)錯(cuò)誤處理是麻煩而且很乏味。一個(gè)輸入用戶名的界面在JSP中如下表示:input type=text name=username value=/ 輸入如上的字符對(duì)于沒有編程理念的HTML編寫者來說是很容易出錯(cuò)的。Struts在提供了一些自定義標(biāo)簽來實(shí)現(xiàn)上述的功能: ; 上述表示法并不要很明顯的指定與JAVABEAN相關(guān)聯(lián),它的處理完全由框架實(shí)現(xiàn)。 3.3.1索引和映射屬性JSP頁面中的標(biāo)簽屬性可以引用JAVABEAN中的屬性。大多數(shù)都是引用簡單類型或簡單對(duì)象。但Struts允許你利用Jakarta Commons Beanutils library提供的功能來引用Array,Conllection,Map的單個(gè)項(xiàng)。 3.3.2 輸入域的支持Srust支持如下的輸入域:1Checkbox2Hidden field3Password4Radio5Reset6Select7Option8Options9Submit10 Text11 TextArea在任何情況下,這些標(biāo)簽必須嵌套在 form標(biāo)簽中,只有這樣輸入域才知道它要使用那個(gè)Bean 。3.3.3 一些有用的標(biāo)簽IteratePresentNopresentLinkImgParametr3.3.4 自動(dòng)表單校驗(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)但沒有錯(cuò)誤 返回NULL或0長度的ActionErrors實(shí)例,Controller Servlet將繼續(xù)執(zhí)行Action的方法。 2.執(zhí)行校驗(yàn)但有錯(cuò)誤 返回ActionErrors實(shí)例,每一個(gè)ActionError有對(duì)應(yīng)的錯(cuò)誤消息關(guān)鍵值。Controller Servlet將把錯(cuò)誤消息數(shù)組保存到請(qǐng)求級(jí)別的上下文中供標(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ù)工作量,減少錯(cuò)誤。3.4.1 特定應(yīng)用標(biāo)簽忽略3.4.2使用包含組合頁面將一個(gè)頁面放在一個(gè)JSP文件中是一個(gè)普遍的設(shè)計(jì)方法,但是許多應(yīng)用需要將應(yīng)用中的不同部分顯示在一個(gè)頁面中。例如一個(gè)門戶應(yīng)用需要如下功能:1. 訪問門戶的搜索引擎2. 訪問門戶的討論區(qū)3. 用戶感興趣的話題4. 郵件等待指示器將這些不同的功能交給不同的開發(fā)者開發(fā),要完成這個(gè)門戶應(yīng)用是比較容易的。然后你就可以使用包含(include)來將它們組合到一個(gè)頁面中。有三種不同的包含方式,選擇哪種取決于你希望整個(gè)輸出在什么時(shí)候整合:1. 2. 3. bean:include3.4.3 使用Tiles組合頁面Tiles是一個(gè)功能很強(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è)置一個(gè)Action指向你的主頁 3.4.4 圖片渲染組件一些應(yīng)用需要?jiǎng)討B(tài)產(chǎn)生圖片,有兩種方法符合如下需求:1. 產(chǎn)生一個(gè)執(zhí)行Servlet請(qǐng)求的超鏈接 Servlet將使用圖形庫來產(chǎn)生圖片2. 將JAVA Applet嵌入在HTML頁面中來產(chǎn)生圖片3.4.5 文本輸出一些應(yīng)用需要?jiǎng)討B(tài)的產(chǎn)生文本(如XML),因?yàn)檎麄€(gè)頁面將通過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)來動(dòng)態(tài)計(jì)算屬性 的值,例如,要根據(jù)資源關(guān)鍵值打印來自屬性文件中的信息 bean:message key=/ 這樣寫是假定stringvar是JSP中的 腳本變量,如果使用Struts的EL標(biāo)簽庫就會(huì)是如下形式: 4 創(chuàng)建控制(Controller)組件4.1 概述我們已經(jīng)知道如何去構(gòu)建Model和View組件,現(xiàn)在我們將集中到Controller組件。Struts包含了一個(gè)映射請(qǐng)求URI到Action類的Servlet。因此你編寫WEB應(yīng)用時(shí)在Controller組件這方面要做的工作如下:1編寫AtionForm作為Model和View的中介2編寫Action(繼承org.apache.struts.action.Action)來處理請(qǐng)求3為每一個(gè)邏輯請(qǐng)求在struts-config.xml.中編寫一個(gè)ActionMapping4.2 ActionServlet對(duì)于熟悉MVC架構(gòu)的人來講,ActionServlet就代表著C Controller。Controller的任務(wù)是:1處理用戶請(qǐng)求2根據(jù)用戶請(qǐng)求來決定用戶將要完成什么任務(wù)3將Model的數(shù)據(jù)傳到視圖(View)4選擇合適的視圖響應(yīng)請(qǐng)求Controller會(huì)將大部分工作放到Request Processor和Action 類中。 4.2.1 請(qǐng)求處理器(Request Processor)RequestProcessor對(duì)每個(gè)請(qǐng)求做核心處理的地方,它要做的處理如下:1. processPath 確定請(qǐng)求的路徑,以備后面的處理檢索ActionMapping 2. processLocale 為請(qǐng)求選擇一個(gè)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),如果子類重載此方法并返回真,則該請(qǐng)求將繼續(xù)處理流程,如果返回假,則意味著你處理了該請(qǐng)求,處理流程直接返回。6. processMapping 確定請(qǐng)求所對(duì)應(yīng)路徑的ActionMapping7. processRoles 保證請(qǐng)求的用戶具備特定的角色8. processActionForm 實(shí)例化ActioForm并且把它放在適當(dāng)?shù)淖饔糜蛑小?. processPopulate 用請(qǐng)求中的數(shù)據(jù)組裝ActionForm10. processValidate 校驗(yàn)ActionForm中的數(shù)據(jù)11. processForward 如果映射是一個(gè)轉(zhuǎn)向( Forward)指令,就轉(zhuǎn)向到特定的路徑。12. processInclude 如果映射是一個(gè)包含(Include)指令,就將映射指定的路徑的輸出結(jié)果包含進(jìn)來。13. processActionCreate 實(shí)例化映射指定的Action.14. processActionPerform 執(zhí)行Action的perform或excute方法。15. processForwardConfig 最后RequetProcessor使用Action類返回的ActionForward來選擇下一個(gè)資源。大多數(shù)的AtionForward將會(huì)導(dǎo)航到顯示頁面輸出響應(yīng)。4.3 ActionForm類一個(gè)ActionForm代表著一個(gè)與用戶交互的HTML表單。ActionForm中的屬性來存儲(chǔ)表單中的狀態(tài),并且有g(shù)etter,setter方法來訪問他們。ActionForm可以存儲(chǔ)在session或request的作用域中(默認(rèn)的是session).如果ActionForm放在session中記得要實(shí)現(xiàn)reset方法,以備每次使用ActionForm時(shí)都會(huì)初始化。Struts根據(jù)請(qǐng)求中的參數(shù)設(shè)置ActionForm的屬性并且把經(jīng)過校驗(yàn)后的ActionForm傳到Action的execute方法。當(dāng)你在編寫ActionForm時(shí)必須堅(jiān)持如下原則:1ActionForm本身沒有任何特定的方法被實(shí)現(xiàn)。僅僅用來表示它是整個(gè)框架中一個(gè)特定的角色。ActinForm中只有g(shù)etter,setter方法,并沒有任何商業(yè)邏輯。2AtionForm提供標(biāo)準(zhǔn)的校驗(yàn)機(jī)制。如果你重載了ActionForm的validate方法,并且在資源屬性文件中提供了錯(cuò)誤消息,那么Struts就會(huì)自動(dòng)校驗(yàn)表單中的數(shù)據(jù)。當(dāng)然你也可以忽略ActionForm中的校驗(yàn),在Action類中來實(shí)現(xiàn)校驗(yàn)。3為輸入表單中的每一個(gè)輸入定義屬性。輸入域的名稱和ActionForm中屬性的名稱必須符合JAVA規(guī)范。例如一個(gè)輸入域的名稱username將會(huì)導(dǎo)致ActionForm中的setUsername被調(diào)用。4也可以為Form中的按鈕或其他控件定義屬性。當(dāng)提交表單時(shí)這將有利于你知道哪個(gè)控件被選中了。5把ActionForm當(dāng)作HTTP和Action之間的防火墻。ActionForm的方法可以校驗(yàn)所有必須的屬性已經(jīng)存在了并且包含合理的值。如果校驗(yàn)失敗請(qǐng)求將不會(huì)被Action類處理。6你可能會(huì)放一個(gè)Bean的實(shí)例在ActinForm中,這樣你就會(huì)用到嵌套屬性引用。例如,你可能有一個(gè)“customer”在ActionForm中,然后在頁面中用“”來引用屬性。4.3.1 DynaActionForm維護(hù)一個(gè)具體的ActionForm是要耗費(fèi)時(shí)間的。特別是ActionForm越來越多并且都是校驗(yàn)一些簡單的屬性時(shí)你可能會(huì)感覺到一股挫折感。這個(gè)瓶頸通過DynaActionForm會(huì)有所減輕。通過在Struts的配置文件中列出屬性,類型和默認(rèn)值來替代以前的定義一個(gè)新類,并且添加getter/setter方法。例如,在struts-config.xml中添加一個(gè)UserForm: DynaActionForm支持的數(shù)據(jù)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2025學(xué)年八年級(jí)語文論文寫作教學(xué)計(jì)劃
- 2025年高考全國卷2作文寫作指導(dǎo)及范文
- 小學(xué)數(shù)學(xué)翻轉(zhuǎn)課堂研修計(jì)劃
- 教師學(xué)習(xí)以案明紀(jì)警示教育心得體會(huì)
- 幼兒園健康檔案管理計(jì)劃
- 污水處理廠施工技術(shù)保障措施
- 石油設(shè)備安裝質(zhì)量安全管理措施
- 高速公路質(zhì)量通病防治措施研究
- 小學(xué)語文教研組家長讀書指導(dǎo)計(jì)劃
- 2025下半年幼兒園園長教師激勵(lì)計(jì)劃
- 酒類銷售用人勞務(wù)合同
- 2025老年教育政策環(huán)境分析及教學(xué)模式創(chuàng)新路徑研究報(bào)告
- 1-會(huì)計(jì)信息系統(tǒng)(閉卷)國開機(jī)考答案
- 2025年中國伺服電纜行業(yè)市場發(fā)展前景及發(fā)展趨勢(shì)與投資戰(zhàn)略研究報(bào)告
- 酒店安全獎(jiǎng)懲規(guī)定
- 中醫(yī)養(yǎng)生保健與康復(fù)護(hù)理
- 夫妻債務(wù)隔離約定協(xié)議書
- 康復(fù)輔助技術(shù)咨詢師理論考試復(fù)習(xí)題庫(含答案)
- C++冒泡排序?qū)崿F(xiàn)試題及答案
- 《分子動(dòng)力學(xué)模擬的應(yīng)用》課件
- NIH-FDA-IND-IDE-II期III期臨床試驗(yàn)方案模板
評(píng)論
0/150
提交評(píng)論