1芯杀,一個完整的Java Web所涉及的內(nèi)容包括:(1)Java Bean組件 (2)EJB組件 (3)自定義的JSP標簽
(4)XML (5)Web服務(wù)器和應(yīng)用服務(wù)器
2纲刀,Java Bean在JSP中的應(yīng)用
(class中存放的是JavaBean的路徑)
(1)獲取JavaBean屬性:
(2)給某個JavaBean屬性賦值:
3,Web組件之間的三種關(guān)聯(lián)關(guān)系
(1)請求轉(zhuǎn)發(fā)
(2)URL重定向 response.sendRedirect(...)
(3)包含 <%@ include file=...%>
4,MVC:Model-View-Countroller.即模型-視圖-控制器,是一種軟件設(shè)計模式均蜜。它強制地把應(yīng)用程序的輸入李剖、處理和輸出分開。MVC把應(yīng)用程序分成三個核心模塊:模型囤耳、視圖和控制器篙顺。對于基于請求/響應(yīng)方式的WEB應(yīng)用偶芍,模型位于WEB服務(wù)器端,視圖位于用戶瀏覽器端德玫。
5匪蟀,MVC處理過程:
首先,控制器接收用戶的請求宰僧,并決定應(yīng)該調(diào)用哪個模型進行處理
然后材彪,模型根據(jù)用戶請求進行相應(yīng)的業(yè)務(wù)邏輯處理,并返回數(shù)據(jù)
最后琴儿,控制器調(diào)用相應(yīng)的視圖來格式化模型返回的數(shù)據(jù)段化,并通過視圖呈現(xiàn)給用戶
用Servlet技術(shù)實現(xiàn)控制器的功能,用JavaBean技術(shù)實現(xiàn)模型的功能造成。
6显熏,Struts:實質(zhì)上是在JSP Model2上實現(xiàn)的一個MVC框架。在Struts框架中晒屎,模型由實現(xiàn)業(yè)務(wù)邏輯的JavaBean或EJB組件構(gòu)成喘蟆,控制器由ActionServlet和Action來實現(xiàn),視圖由一組Jsp文件構(gòu)成鼓鲁。
7蕴轨,ActionForm Bean:Struts框架利用文本進行視圖和控制器之間表單數(shù)據(jù)的傳遞。
8骇吭,Struts的控制器:由ActionServlet類和Action類來實現(xiàn)
ActionServlet類:在MVC模型中扮演中央控制器的角色尺棋,主要負責接收HTTP請求信息,根據(jù)配置文件struts_config.xml的配置信息绵跷,把請求轉(zhuǎn)發(fā)給適當?shù)腁ction對象膘螟。
Action類:負責調(diào)用模型的方法,更新模型的狀態(tài)碾局,并幫助控制應(yīng)用程序的流程荆残。
在配置文件中,每一個Action的映射信息都通過一個元素來配置净当。
9内斯,軟件的分層結(jié)構(gòu):表現(xiàn)層、業(yè)務(wù)邏輯層像啼、數(shù)據(jù)訪問層俘闯。
10,Web項目的結(jié)構(gòu):src目錄下存放Java源文件忽冻,源文件編譯后會自動輸出到WebRoot/WEB-INF/classes目錄下真朗,WebRoot是Web應(yīng)用程序的根目錄。有時候各個分塊代碼是正確的僧诚,但就是發(fā)送錯誤遮婶,可能就是因為文件放置的位置不當造成的蝗碎,可通過調(diào)試解決。
11旗扑,F(xiàn)ilterDispatcher:Struts2框架是基于MVC模式開發(fā)的蹦骑,它提供了一個核心控制器,用于對所有的請求進行統(tǒng)一處理臀防,這個控制器是由一個名為FilterDispatcher的Servlet過濾器來充當?shù)摹?/p>
12眠菇,web.xml和struts.xml
web.xml:Web應(yīng)用程序的部署描述符文件
struts.xml:對action進行配置
13,Struts 2 的開發(fā)步驟:
(1)準備類庫
(2) 在web.xml文件中配置FilterDispatcher袱衷。
(3)開發(fā)action捎废。針對每一個功能點,編寫一個action類祟昭。
(4)編寫相關(guān)的結(jié)果頁面。針對action返回的結(jié)果代碼怖侦,編寫相應(yīng)的結(jié)果頁面
(5)在Web應(yīng)用程序的WEB-INF/classes目錄下創(chuàng)建struts.xml篡悟,對action進行配置,將頁面與結(jié)果頁面關(guān)聯(lián)在一個匾寝。
14搬葬,使用領(lǐng)域?qū)ο髞斫邮沼脩糨斎搿鹘y(tǒng)的Web應(yīng)用程序調(diào)用HttpServletRequest的getParameter方法從請求中獲取數(shù)據(jù)艳悔。Struts2的action完全與Web層解耦急凰,要獲取Web層的數(shù)據(jù),需要使用ActionContext,它為action提供了一個執(zhí)行上下文猜年。
15抡锈,Struts 自動實例化對象特性
該請求等同于調(diào)用:action.getUser().setUsername(...);
Struts2 會遍歷所有的請求參數(shù),自動依次實例化任何用于填充數(shù)據(jù)的對象乔外。上述例子Struts將依次調(diào)用一下方法:
action.getUser();
action.setUser(new User());
action.getUser().setUsername();
16,struts2的執(zhí)行流程:
\ |/ struts.xml
\|/
類的實現(xiàn)
17床三,使用action的屬性接收用戶輸入,此時不需要使用模型對象杨幼。
18撇簿,Struts2對HttpServletRequest、HttpSession和ServletContext進行了封裝差购,構(gòu)造了三個Map對象來替代這三種對象四瘫,在Action中,直接使用對應(yīng)的Map對象來保存和讀取數(shù)據(jù)欲逃。
使用com.opensymphony.xwork2.ActionContext類
ActionContext是action執(zhí)行的上下文
(1)get(object key):得到請求Map對象找蜜,需要為get()方法傳遞參數(shù)"request"。
(2)getSession():HttpSession的Map對象
(3)getApplication:ServletContext的Map對象
19稳析,Struts2框架由兩部分組成:XWork2和Struts锹杈。XWork提供了很多核心功能:IoC容器撵孤,強大的表達式語言(OGNL),數(shù)據(jù)類型轉(zhuǎn)換竭望,驗證和可插入的配置邪码。XWork框架的核心概念包括:aciton咬清、攔截器和result。
攔截器的工作原理:
一個HTTP請求到達Struts2 的FilterDispatcher之后旧烧,就會被轉(zhuǎn)換成一個action command影钉。這個action command在穿越了一系列Struts2和XWork的攔截器之后,最后執(zhí)行用戶編寫的Action實例平委。在Action執(zhí)行之后夺谁,響應(yīng)還會穿越相同的攔截器(相反順序)廉赔,最后通過Struts2的HttpServletResponse轉(zhuǎn)換成Web可識別的響應(yīng)(例如JSP)。
20匾鸥,Struts2的體系結(jié)構(gòu)
(1)一個初始的請求到達Servlet容器(tomcat)后蜡塌,將被傳遞給一個標準過濾器鏈勿负。
(2)接下來,必須的FilterDispatcher被調(diào)用奴愉,它輪詢ActionMapper以便確定這個請求是否應(yīng)該調(diào)用一個action.
(3)如果ActionMapper確定一個Action應(yīng)該被調(diào)用,那么FilterDispatcher就把控制權(quán)委派給ActionProxy迫吐,ActionProxy從struts.xml文件中讀取配置信心账忘。
(4)ActionProxy創(chuàng)建一個實現(xiàn)了命令模式的ActionInvocation。ActionInvocation在調(diào)用action之前會依次調(diào)用所用配置的攔截器鳖擒。
(5)一旦action執(zhí)行返回,ActionInvocation就要查找這個acion的結(jié)果碼所對應(yīng)的result(action的結(jié)果碼和result的映射在struts.xml文件中配置)戳稽,然后執(zhí)行這個result。
21互躬,Struts2的配置文件
(1)web.xml:Web部署描述符颂郎,包括所有必需的框架組件。由開發(fā)人員編寫乓序。
(2)struts.xml:主要的配置文件,包含result映射寄雀,action映射陨献,攔截器配置等。由開發(fā)人員編寫
(3)struts.properties:struts2框架的屬性配置急膀,由開發(fā)人員編寫
(4)struts-default.xml:Struts2提供的默認設(shè)置坛猪,由框架提供皂股。
(5)strits-plugin.xml:struts2框架的插件所用的配置文件,由插件提供呜呐。
22,對Struts2標簽庫的配置
的子元素的內(nèi)容:/struts-tags
/struts-tags
23,Bean配置
Struts2是一個可擴展的框架洋机,框架的核心組件都是可配置的洋魂,這些組件通過Struts2自己的依賴注入容器來裝配。通過bean元素來配置組件實現(xiàn)類衔肢。
24豁翎,包配置
Struts2中的包類似于Java中的包,提供了將action心剥、result背桐、攔截器等組織為一個邏輯單元的一種方式链峭,提高了重用性疑苫。Struts2中的包可以擴展另外的包,從而”繼承”原有包的所用定義捍掺。
package元素的屬性
name:被其他包引用時的鍵extends:指定要擴展的包
namespace:指定名稱空間abstract:聲明包抽象的
25,名稱空間(Namespace)配置
namespace屬性可以將包中的action配置為不同的名稱空間曲横,這樣在不同的名稱空間中可以使用同名的action不瓶。
26,包含(include)配置
分而治之,在每個模塊單獨提供一個配置文件熙参,對其進行配置麦备,然后再struts.xml文件中使用include元素來包含其他的配置文件
27,攔截器(Interceptor)配置
攔截器允許你在action執(zhí)行前后插入代碼執(zhí)行黍匾。攔截器可以為action動態(tài)添加輸入驗證呛梆、對象組裝、權(quán)限控制填物、日志記錄等功能,而不需要修改action升薯。
為action配置引用的攔截器雁刷,首先需要在interceptor元素中使用interceptor元素定義攔截器,然后再action元素中使用interceptor-ref元素指定引用的攔截器责语。interceptor元素有兩個必需的屬性:name和class。前者指定攔截器的名字坤候,后者指定攔截器的完整類名。
如果一個action需要多個攔截器智末,可以將多個攔截器組合在一起徒河,組成一個攔截器棧,然后再action中直接引用攔截器棧即可由蘑。interceptor-stack代兵。
如果多個action都需要引用相同的攔截器,那可以使用default-interceptor-ref元素來定義一個默認的攔截器棧引用裳擎,這樣就不需要為每個action指定引用信息了思币。
28,Action映射
action映射:將一個請求URI(即aciton名字)映射到一個action類支救,當一個請求匹配某個action的名字時各墨,框架就使用這個映射來確定如何處理請求启涯。struts.xml文件中的每一個action元素就是一個action映射。
action元素的屬性
name:action的名字结洼,用于匹配請求URIclass:Action實現(xiàn)類的完整類名
method:執(zhí)行Action時調(diào)用的方法converter:應(yīng)用于action類型轉(zhuǎn)換器的完整類名
29松忍,method屬性
在配置action時,可以通過action元素屬性來指定action調(diào)用的方法,所指定的方法必須遵循與execute方法相同的格式酥艳。這樣就可以在同一個類中完成相關(guān)的任務(wù)爬骤,而不需要去編寫不同Action類。(解釋:本來一個任務(wù)對應(yīng)一個class骤铃,現(xiàn)在一個任務(wù)對應(yīng)一個class的一個方法)
30坷剧,模擬struts中的ForwardAction
在struts中,所有的URL都指向action补鼻,而不是JSP頁面雅任。但有時只需要轉(zhuǎn)發(fā)請求,不想再編寫action類的做法:
將action元素的class屬性省略沪么,那將默認使用com.opensymphony.xwork2.ActionSupport類也殖,如:
/index.jsp
31,默認的action
如果請求的一個action不存在闺阱,將顯示錯誤州胳,此時可以指定一個默認的action逸月,如果一個請求沒有其他的action匹配,那么默認的action將被執(zhí)行瓤湘。
默認的action使用default-action-ref元素來聲明恩尾。
32,result:一個result代表一個可能的輸出木人。當Action類的方法執(zhí)行完成時,它返回一個字符串類型的結(jié)果碼醒第,框架根據(jù)這個結(jié)果碼選擇對應(yīng)的result,向用戶輸出圃伶。
33蒲列,result元素的屬性
name:指定result的邏輯名type:指定result類型,不同類型的result代表了不同類型的結(jié)果輸出
34侥猩,result映射配置小記
絕對路徑以斜杠(/)開頭抵赢,相對于當前的Web應(yīng)用程序的上下文路徑;相對路徑不以斜杠(/)開頭划提,相對于當前執(zhí)行的action路徑邢享。
35,struts2中預(yù)定義的結(jié)果類型:
(1)dispatcher:用于web資源的集成伊履,包括jsp的集成
(2)redirect:用于重定向到另外的URL(WEB資源)
(3)redirectAction:用于定向到另外的action映射
.......
36,dispatcher結(jié)果類型
有兩個屬性:location和parse款违。可通過struts.xml配置文件中的result元素的param子元素來設(shè)置哄辣。其中l(wèi)ocation參數(shù)用于指定action執(zhí)行完畢后要轉(zhuǎn)向的目標資源递惋,parse屬性是一個布爾類型的值溢陪,如果為true,則解析location參數(shù)中的OGNL表達式杉编。
37,全局結(jié)果
全局結(jié)果在包中定義邓馒,在這個包中的所有action可以共享結(jié)果光酣。全局結(jié)果也是使用result元素來配置,只不過不是在aciton元素中嵌套救军,而是在global-results元素中嵌套。
38唱遭,動態(tài)結(jié)果
動態(tài)結(jié)果:在配置時不知道要執(zhí)行哪一個結(jié)果,在運行時刻才能確定執(zhí)行的結(jié)果
${屬性名}
39疫鹊,異常處理
在struts.xml文件中配置異常映射司致,將一種異常類型和一個結(jié)果對應(yīng)起來,由這個結(jié)果負責對異常作出響應(yīng)锈拨。如果Action的方法在執(zhí)行期間拋出一個異常羹唠,這個異常會被框架自動捕獲,然后框架根據(jù)配置文件中的異常映射缝彬,找到預(yù)定義的結(jié)果來對異常作出響應(yīng)哺眯。
異常映射攔截器已經(jīng)配置好,剩下的工作就是使用exception-mapping元素來配置異常映射一疯,將異常類型映射到指定的結(jié)果夺姑。exception-mapping有兩個屬性:exception和result。前者指定一個異常類型的完整類名眉睹,后者指定對該類型進行處理的結(jié)果的名字。