1、簡(jiǎn)單介紹一下Struts2?
Struts2框架是一個(gè)按照MVC設(shè)計(jì)模式設(shè)計(jì)的WEB層框架,是在Struts 1和WebWork的技術(shù)基礎(chǔ)上進(jìn)行了合并的全新的框架。其全新的Struts 2的體系結(jié)構(gòu)與Struts 1的體系結(jié)構(gòu)差別巨大。Struts 2以WebWork為核心,采用攔截器的機(jī)制來(lái)處理用戶(hù)的請(qǐng)求,這樣的設(shè)計(jì)也使得業(yè)務(wù)邏輯控制器能夠與ServletAPI完全脫離開(kāi)。
我們可以把Struts2理解為一個(gè)大大的Servlet,而這個(gè)Servlet就是ActionServlet。Struts2在處理客戶(hù)端請(qǐng)求時(shí),會(huì)先讀取web.xml配置文件,根據(jù)前端控制器將符合條件的請(qǐng)求分給各個(gè)不同的Action處理。在此之前,ActionServlet會(huì)把數(shù)據(jù)封裝成一個(gè)JavaBean。
Struts2框架提供了許多的攔截器,在封裝數(shù)據(jù)的過(guò)程中,我們可以對(duì)數(shù)據(jù)進(jìn)行一些操作,例如:數(shù)據(jù)校驗(yàn)等等。當(dāng)Action執(zhí)行完后要返回一個(gè)結(jié)果視圖,這個(gè)結(jié)果視圖可以跟據(jù)struts2的配置文件中配置,選擇轉(zhuǎn)發(fā)或者重定向。

● 關(guān)于圖中的Key:
Servlet Filters:過(guò)濾器鏈,客戶(hù)端的所有請(qǐng)求都要經(jīng)過(guò)Filter鏈的處理。
● Struts Core:Struts2的核心部分
Interceptors:Struts2的攔截器。Struts2提供了很多默認(rèn)的攔截器,可以完成日常開(kāi)發(fā)的絕大部分工作;而我們自定義的攔截器,用來(lái)實(shí)現(xiàn)實(shí)際的客戶(hù)業(yè)務(wù)需要的功能。
User Created:由開(kāi)發(fā)人員創(chuàng)建的,包括struts.xml、Action、Template,這些是每個(gè)使用Struts2來(lái)進(jìn)行開(kāi)發(fā)的人員都必須會(huì)的。
● FilterDispatcher是整個(gè)Struts2的調(diào)度中心,也就是MVC中的C(控制中心),根據(jù)ActionMapper的結(jié)果來(lái)決定是否處理請(qǐng)求,如果ActionMapper指出該URL應(yīng)該被Struts2處理,那么它將會(huì)執(zhí)行Action處理,并停止過(guò)濾器鏈上還沒(méi)有執(zhí)行的過(guò)濾器。
● ActionMapper會(huì)判斷這個(gè)請(qǐng)求是否應(yīng)該被Struts2處理,如果需要Struts2處理,ActionMapper會(huì)返回一個(gè)對(duì)象來(lái)描述請(qǐng)求對(duì)應(yīng)的ActionInvocation的信息。
● ActionProxy會(huì)創(chuàng)建一個(gè)ActionInvocation實(shí)例,位于Action和xwork之間,使得我們?cè)趯?lái)有機(jī)會(huì)引入更多的實(shí)現(xiàn)方式,比如通過(guò)WebService來(lái)實(shí)現(xiàn)等。
● ConfigurationManager是xwork配置的管理中心,可以把它看做struts.xml這個(gè)配置文件在內(nèi)存中的對(duì)應(yīng)。
● struts.xml是開(kāi)發(fā)人員必須光顧的地方。是Stuts2的應(yīng)用配置文件,負(fù)責(zé)諸如URL與Action之間映射關(guān)系的配置、以及執(zhí)行后頁(yè)面跳轉(zhuǎn)的Result配置等。
● ActionInvocation是真正調(diào)用并執(zhí)行Action,它擁有一個(gè)Action實(shí)例和這個(gè)Action所依賴(lài)的攔截器實(shí)例。
● ActionInvocation會(huì)按照指定的順序去執(zhí)行這些攔截器、Action以及相應(yīng)的Result。
● Interceptor(攔截器):是Struts2的基石,類(lèi)似于JavaWeb的Filter,攔截器是一些無(wú)狀態(tài)的類(lèi),攔截器可以自動(dòng)攔截Action,它們給開(kāi)發(fā)者提供了在Action運(yùn)行之前或Result運(yùn)行之后來(lái)執(zhí)行一些功能代碼的機(jī)會(huì)。
● Action:用來(lái)處理請(qǐng)求,封裝數(shù)據(jù)。
● name包名稱(chēng),在struts2的配置文件中,包名不能重復(fù),name并不是真正包名,只是為了管理Action
● namespace和<action>的name屬性,決定Action的訪問(wèn)路徑(以/開(kāi)始)
● extends繼承哪個(gè)包,通常開(kāi)發(fā)中繼承struts-default包(struts-default包在struts-default.xml中定義)
● 攔截器是基于java的反射機(jī)制的,而過(guò)濾器是基于函數(shù)回調(diào)???????
● 攔截器不依賴(lài)與servlet容器,而過(guò)濾器依賴(lài)與servlet容器???????
● 攔截器只能對(duì)action請(qǐng)求起作用,而過(guò)濾器則可以對(duì)幾乎所有的請(qǐng)求起作用???????
● 攔截器可以訪問(wèn)action上下文、值棧里的對(duì)象,而過(guò)濾器不能???????
● 在action的生命周期中,攔截器可以多次被調(diào)用,而過(guò)濾器只能在容器初始化時(shí)被調(diào)用一次。
● 屬性封裝
在action中設(shè)置成員變量,變量名與表單中的name屬性值相同
生成變量的set方法???????
實(shí)例:獲取用戶(hù)輸入的用戶(hù)名和密碼
● jsp頁(yè)面如下:
<form action="hello" method="post">
userName<input type="text" name="userName">
userPwd<input type="password" name="userPwd">
<input type="submit" value="submit">
</form>
● java代碼如下:
private String userName;
private String userPwd;
public String excute() {
System.out.println("userName" + " " + "userPwd");
return NONE;
}
public void setUserName(String userName) {
this.userName = userName;
}
public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
???????6、簡(jiǎn)單介紹一下Struts2的值棧?
值棧是對(duì)應(yīng)每一個(gè)請(qǐng)求對(duì)象的數(shù)據(jù)存儲(chǔ)中心。Struts2的一個(gè)很重要的特點(diǎn)就是引入了值棧。之前我們通過(guò)緩存或者模型驅(qū)動(dòng)在action和頁(yè)面之間傳遞數(shù)據(jù),數(shù)據(jù)混亂,并且難以管理,緩存還有時(shí)間和數(shù)量限制,使用起來(lái)非常的困難。值棧的引入解決了這個(gè)問(wèn)題,它可以統(tǒng)一管理頁(yè)面和action之間的數(shù)據(jù),供action、result、interceptor等使用。我們大多數(shù)情況下不需要考慮值棧在哪里,里面有什么,只需要去獲取自己需要的數(shù)據(jù)就可以了,大大的降低了開(kāi)發(fā)人員的工作量和邏輯復(fù)雜性。
● Struts2是類(lèi)級(jí)別的攔截,一個(gè)類(lèi)對(duì)應(yīng)一個(gè)request上下文,SpringMVC是方法級(jí)別的攔截,一個(gè)方法對(duì)應(yīng)一個(gè)request上下文,而方法同時(shí)又跟一個(gè)url對(duì)應(yīng),所以說(shuō)從架構(gòu)本身上SpringMVC就容易實(shí)現(xiàn)Restful url,而Struts2的架構(gòu)實(shí)現(xiàn)起來(lái)要費(fèi)勁,因?yàn)镾truts2中Action的一個(gè)方法可以對(duì)應(yīng)一個(gè)url,而其類(lèi)屬性卻被所有方法共享,這也就無(wú)法用注解或其他方式標(biāo)識(shí)其所屬方法了。???????
● SpringMVC的方法之間基本上獨(dú)立的,獨(dú)享request response數(shù)據(jù),請(qǐng)求數(shù)據(jù)通過(guò)參數(shù)獲取,處理結(jié)果通過(guò)Model Map交回給框架,方法之間不共享變量,而Struts2搞的就比較亂,雖然方法之間也是獨(dú)立的,但其所有Action變量是共享的,這不會(huì)影響程序運(yùn)行,卻給我們編碼讀程序時(shí)帶來(lái)麻煩,每次來(lái)了請(qǐng)求就創(chuàng)建一個(gè)Action,一個(gè)Action對(duì)象對(duì)應(yīng)一個(gè)request上下文。???????
● Struts2需要針對(duì)每個(gè)request進(jìn)行封裝,把request,session等servlet生命周期的變量封裝成一個(gè)一個(gè)Map,供給每個(gè)Action使用,并保證線程安全,所以在原則上,Struts2是比較耗費(fèi)內(nèi)存的。???????
● 攔截器實(shí)現(xiàn)機(jī)制上,Struts2有以自己的interceptor機(jī)制,SpringMVC用的是獨(dú)立的AOP方式,這樣導(dǎo)致Struts2的配置文件量還是比SpringMVC大。???????
● SpringMVC的入口是Servlet,而Struts2是filter(這里要指出,filter和servlet是不同的),這就導(dǎo)致了二者的機(jī)制不同,這里就牽涉到servlet和filter的區(qū)別了。???????
● SpringMVC集成了Ajax,使用非常方便,只需一個(gè)注解@ResponseBody就可以實(shí)現(xiàn),然后直接返回響應(yīng)文本即可,而Struts2攔截器集成了Ajax,在Action中處理時(shí)一般必須安裝插件或者自己寫(xiě)代碼集成進(jìn)去,使用起來(lái)也相對(duì)不方便。???????
● SpringMVC驗(yàn)證支持JSR303,處理起來(lái)相對(duì)更加靈活方便,而Struts2驗(yàn)證比較繁瑣,感覺(jué)太煩亂。Spring MVC和Spring是無(wú)縫的。從這個(gè)項(xiàng)目的管理和安全上也比Struts2高(當(dāng)然Struts2也可以通過(guò)不同的目錄結(jié)構(gòu)和相關(guān)配置做到SpringMVC一樣的效果,但是需要xml配置的地方不少)。???????
● 設(shè)計(jì)思想上,Struts2更加符合OOP的編程思想,SpringMVC就比較謹(jǐn)慎,是servlet上擴(kuò)展。???????
● SpringMVC開(kāi)發(fā)效率和性能高于Struts2,SpringMVC可以認(rèn)為已經(jīng)100%零配置。
(1)使用#獲取 context 里面數(shù)據(jù)
<s:iterator value= "list" var="user">
<s:property value= "#user.username">
</s:iterator>
(2)向 request 域放值(獲取 context 里面數(shù)據(jù),寫(xiě) ognl 時(shí)候,首先添加符號(hào)#context 的 key 名稱(chēng).域?qū)ο竺Q(chēng))
(3)在頁(yè)面中使用 ognl 獲取
<s:property value = "#request.req">
(4)%在 struts2 標(biāo)簽中表單標(biāo)簽
在 struts2 標(biāo)簽里面使用 ognl 表達(dá)式,如果直接在 struts2 表單標(biāo)簽里面使用 ognl 表達(dá)式不識(shí)別,只有%之后才會(huì)識(shí)別。???????
<s:textfield name="username" value="%{#request.req}">
9、???????Struts2中有哪些常用結(jié)果類(lèi)型????????
● dispatcher:默認(rèn)的請(qǐng)求轉(zhuǎn)發(fā)的結(jié)果類(lèi)型,Action轉(zhuǎn)發(fā)給JSP???????
● chain:Action轉(zhuǎn)發(fā)到另一個(gè)Action(同一次請(qǐng)求)???????
● redirect:重定向,重定向到一個(gè)路徑信息,路徑信息沒(méi)有限制(不在一個(gè)請(qǐng)求中),Action重定向到JSP 4)redirectAction:Action重定向到另一個(gè)Action???????
● stream:將原始數(shù)據(jù)作為流傳遞回瀏覽器端,該結(jié)果類(lèi)型對(duì)下載的內(nèi)容和圖片非常有用。???????
● freemarker:呈現(xiàn)freemarker模板。???????
● plaintext:返回普通文本內(nèi)容。??????????????