Struts2 是什么?
是一個(gè)擴(kuò)展的用來(lái)建立企業(yè)級(jí)JAVA WEB應(yīng)用程序的框架,不但注重程序的開發(fā)程序,更注重部署和后期維護(hù).
Struts2 使用OGNL可以訪問(wèn)值棧,OGNL對(duì)集合和索引屬性的支持非常強(qiáng)大
Struts2核心控制器
在Struts2中,核心控制器是Filter,而不是一個(gè)不同的servlet,為了實(shí)現(xiàn)AOP概念
Struts框架的組成:
核心控制器FilterDispatcher(Struts2系統(tǒng)給的),業(yè)務(wù)控制器和用戶事項(xiàng)的業(yè)務(wù)邏輯組件(用戶自己提供)
######Struts 2框架獲得了*.action請(qǐng)求后由驹,將根據(jù)*.action請(qǐng)求的前面部分決定調(diào)用哪個(gè)業(yè)務(wù)邏輯組件聪黎,例如齿税,對(duì)于login.action請(qǐng)求伦忠,Struts 2調(diào)用名為login的Action來(lái)處理該請(qǐng)求荐糜。
Struts 2應(yīng)用中的Action都被定義在struts.xml文件中,在該文件中定義Action時(shí)闲询,定義了該Action的name屬性和 class屬性怖辆,其中name屬性決定了該Action處理哪個(gè)用戶請(qǐng)求,而class屬性決定了該Action的實(shí)現(xiàn)類裕菠。
數(shù)據(jù)流程圖(執(zhí)行流程)
HTTP請(qǐng)求----->核心控制器(web.xml)---Struts.xml---->Action--->IOC方法注值---->Action調(diào)用業(yè)務(wù)邏輯處理業(yè)務(wù)邏輯(3層)--->JSP()返回result)--->HTTP響應(yīng)到客戶端
1、客戶端瀏覽器發(fā)出HTTP請(qǐng)求闭专。
2奴潘、根據(jù)web.xml配置,該請(qǐng)求被FilterDispatcher接收影钉。
3画髓、根據(jù)struts.xml配置,找到需要調(diào)用的Action類和方法平委, 并通過(guò)IoC方式奈虾,將值注入給Aciton。
4廉赔、Action調(diào)用業(yè)務(wù)邏輯組件處理業(yè)務(wù)邏輯肉微,這一步包含表單驗(yàn)證。
5蜡塌、Action執(zhí)行完畢碉纳,根據(jù)struts.xml中的配置找到對(duì)應(yīng)的返回結(jié)果result,并跳轉(zhuǎn)到相應(yīng)頁(yè)面馏艾。
6劳曹、返回HTTP響應(yīng)到客戶端瀏覽器。
為什么要用Struts2框架?
Struts2是基于MVC的輕量級(jí)的web應(yīng)用框架
Struts配置文件優(yōu)先級(jí)
Web.xml > struts.properties >struts.xml
Method的用處?為什么要使用Method?
可以在配置文件中配置Action的時(shí)候用method=來(lái)指定執(zhí)行哪個(gè)方法
也可以在url地址中動(dòng)態(tài)指定(動(dòng)態(tài)方法調(diào)用DMI)(推薦)
Struts2 type屬性(轉(zhuǎn)發(fā)和重定向的區(qū)別)
詳請(qǐng):
轉(zhuǎn)發(fā): 轉(zhuǎn)發(fā)是服務(wù)器行為(瀏覽器上的網(wǎng)址不變)
客戶瀏覽器發(fā)送http請(qǐng)求——>web服務(wù)器接受此請(qǐng)求——>調(diào)用內(nèi)部的一個(gè)方法在容器內(nèi)部完成請(qǐng)求處理和轉(zhuǎn)發(fā)動(dòng)作——>將目標(biāo)資源發(fā)送給客戶琅摩;在這里铁孵,轉(zhuǎn)發(fā)的路徑必須是同一個(gè)web容器下的url,其不能轉(zhuǎn)向到其他的web路徑上去房资,中間傳遞的是自己的容器內(nèi)的request蜕劝。在客戶瀏覽器路徑欄顯示的仍然是其第一次訪問(wèn)的路徑,也就是說(shuō)客戶是感覺(jué)不到服務(wù)器做了轉(zhuǎn)發(fā)的志膀。轉(zhuǎn)發(fā)行為是瀏覽器只做了一次訪問(wèn)請(qǐng)求熙宇。
重定向:客戶端行為(瀏覽器上的網(wǎng)址改變)
客戶瀏覽器發(fā)送http請(qǐng)求——>web服務(wù)器接受后發(fā)送302狀態(tài)碼響應(yīng)及對(duì)應(yīng)新的location給客戶瀏覽器——>客戶瀏覽器發(fā)現(xiàn)是302響應(yīng),則自動(dòng)再發(fā)送一個(gè)新的http請(qǐng)求溉浙,請(qǐng)求url是新的location地址——>服務(wù)器根據(jù)此請(qǐng)求尋找資源并發(fā)送給客戶烫止。在這里location可以重定向到任意URL,既然是瀏覽器重新發(fā)出了請(qǐng)求戳稽,則就沒(méi)有什么request傳遞的概念了馆蠕。在客戶瀏覽器路徑欄顯示的是其重定向的路徑期升,客戶可以觀察到地址的變化的。重定向行為是瀏覽器做了至少兩次的訪問(wèn)請(qǐng)求的互躬。
正文
重定向其實(shí)是兩次request
第一次播赁,客戶端request A,服務(wù)器響應(yīng),并response回來(lái)吼渡,告訴瀏覽器容为,你應(yīng)該去B。這個(gè)時(shí)候IE可以看到地址變了寺酪,而且歷史的回退按鈕也亮了坎背。重定向可以訪問(wèn)自己web應(yīng)用以外的資源。在重定向的過(guò)程中寄雀,傳輸?shù)男畔?huì)被丟失得滤。
請(qǐng)求轉(zhuǎn)發(fā)
是服務(wù)器內(nèi)部把對(duì)一個(gè)request/response的處理權(quán),移交給另外一個(gè)對(duì)于客戶端而言盒犹,它只知道自己最早請(qǐng)求的那個(gè)A懂更,而不知道中間的B,甚至C急膀、D沮协。傳輸?shù)男畔⒉粫?huì)丟失。
轉(zhuǎn)發(fā)到action用chain
重定向到action用redirectAction
重定向:
發(fā)送請(qǐng)求 -->服務(wù)器運(yùn)行-->響應(yīng)請(qǐng)求脖阵,返回給瀏覽器一個(gè)新的地址與響應(yīng)碼-->瀏覽器根據(jù)響應(yīng)碼皂股,判定該響應(yīng)為重定向,自動(dòng)發(fā)送一個(gè)新的請(qǐng)求給服務(wù)器命黔,請(qǐng)求地址為之前返回的地址-->服務(wù)器運(yùn)行-->響應(yīng)請(qǐng)求給瀏覽器
轉(zhuǎn)發(fā):
發(fā)送請(qǐng)求 -->服務(wù)器運(yùn)行-->進(jìn)行請(qǐng)求的重新設(shè)置呜呐,例如通過(guò)request.setAttribute(name,value)-->根據(jù)轉(zhuǎn)發(fā)的地址,獲取該地址的網(wǎng)頁(yè)-->響應(yīng)請(qǐng)求給瀏覽器
在Struts2 中獲取請(qǐng)求參數(shù)
1.屬性驅(qū)動(dòng)
(1)方式一:直接將action做一個(gè)model,就可以得到請(qǐng)求參數(shù).
問(wèn)題1:action封裝請(qǐng)求參數(shù)悍募,會(huì)不會(huì)存在線程安全問(wèn)題?
不會(huì):因?yàn)槊恳淮握?qǐng)求蘑辑,都是一個(gè)新的action。
缺點(diǎn):需要單獨(dú)定義javaBean,將action中屬性copy到j(luò)avaBean中坠宴。
優(yōu)點(diǎn):簡(jiǎn)單洋魂。
這種方式 ,底層是通過(guò)反射來(lái)實(shí)現(xiàn)的喜鼓。
(2)方式二:在action中聲明一個(gè)model副砍。
private User user;提供get/set方法
在頁(yè)面上使用ognl來(lái)描述
優(yōu)點(diǎn):簡(jiǎn)單,解決了第一種封裝的問(wèn)題
缺點(diǎn):在頁(yè)面上使用了ognl表達(dá)式庄岖,頁(yè)面不通用了豁翎。
問(wèn)題:這種方式,數(shù)據(jù)是怎樣封裝的?
是通過(guò)struts2中的interceptor進(jìn)行了數(shù)據(jù)封裝.
2.方式三:模型驅(qū)動(dòng)(在開發(fā)中應(yīng)用比較多)
步驟:
1.讓action類實(shí)現(xiàn)ModelDriven
2.重寫getModel方法
3.在action中實(shí)例化一個(gè)model對(duì)象隅忿,讓getModel方法返回這個(gè)對(duì)象心剥。
優(yōu)點(diǎn):解決了屬性驅(qū)動(dòng)存在的問(wèn)題
缺點(diǎn):一次只能封裝一個(gè)model對(duì)象.
Struts2 的Action中取得請(qǐng)求參數(shù)值的幾種方法
方法一:當(dāng)把參數(shù)作為Action的類屬性邦尊,且提供屬性的getter/setter方法時(shí),xwork的OGNL會(huì)自動(dòng)把request參數(shù)的值設(shè)置到類屬性中优烧,此時(shí)訪問(wèn)請(qǐng)求參數(shù)只需要訪問(wèn)類屬性即可蝉揍。
方法二:可以通過(guò)ActionContext對(duì)象Map parameterMap=context.getParameters();方法,得到請(qǐng)求參數(shù)Map畦娄,然后通過(guò)parameterMap來(lái)獲取請(qǐng)求參數(shù)又沾。需要注意的是:當(dāng)通過(guò)parameterMap的鍵取得參數(shù)值時(shí),取得是一個(gè)數(shù)組對(duì)象熙卡,即同名參數(shù)的值的集合捍掺。
方法三:通過(guò)ActionContext取得HttpServletRequest對(duì)象,然后使用request.getParameter("參數(shù)名")得到參數(shù)值再膳。
Struts2數(shù)據(jù)校驗(yàn)
1>編程式校驗(yàn)
2>聲明式校驗(yàn)(編程常用)