一、Struts2與Struts1的聯繫與區別,爲何要用Struts2?Struts1與Struts2都是MVC框架的經典實現模式。Struts2不是由Struts1升級而來,而是由webwork更名而來,而webwork只是xwork加了不少web攔截器而已。web
區別:核心控制器改爲了過濾器(過濾器比servlet的級別要高,由於程序運行時是先進入過濾器再進入servlet);Struts1要求業務類必須繼承action或dispatchAction,Struts2不強制這麼作,只須要提供一個pojo類;綁定值到業務時Struts1是經過actionForm,Struts2是經過模型或屬性驅動直接綁定到action屬性;Struts1嚴重依賴servlet(由於太過於依賴於api的HttpServletRequest與HttpServletResponse兩個參數),Struts2則脫離了servlet的API;管理action時Struts1時單例模式,Struts2則每一個請求產生一個實例;在表達式的支持上Struts2不只有jstl,還有功能更強大的ongl表達式;Struts1的類型轉換是單向的(頁面到ActionForm),Struts2是雙向的(頁面到action再到頁面回顯);校驗,Struts1沒有針對具體方法的校驗,Struts2提供了指定某個方法進行效驗,還有框架效驗;Struts2提供攔截器,利用攔截器能夠在訪問action以前或以後增長如權限攔截等功能;Struts2提供了全局範圍,包範圍,action範圍的國際化資源文件管理實現;Struts2支持多種視圖類型,如jsp,freemaker等。編程
二、Struts2的核心是什麼,體現了什麼思想?Struts2的核心是攔截器,基本上核心功能都是由攔截器完成的,攔截器的實現體現了AOP(面向切面編程)思想。api
三、爲什麼繼承actionsupport?由於actionsupport實現了action接口,提供了國際化,校驗功能;它提供了一個getText(String key)方法實現國際化,該方法從資源文件上獲取國際化信息。Action接口提供了五個常量:success,error,login,input,none數組
四、Struts2如何定位action中的方法?感嘆號定位法;通配符匹配法;在xml配置文件中經過配置多個action,使用action的method指定方法。安全
五、模型驅動與屬性驅動是什麼?模型驅動使用時應該注意什麼問題?模型驅動與屬性驅動都是用來封裝數據的。模型驅動在實現類中實現ModelDriven<T>接口使用泛型把屬性封裝起來,重寫getModel()方法,而後在實現類裏建立一個屬性類的實例,經過這個實例拿到封裝進來值,拿返回值的時候使用工具拷貝;屬性驅動:在實現類裏定義屬性,生成get/set方法,經過屬性來拿值。注意:模型驅動使用時注意是在使用前先把屬性實例化,不然會出現空指針錯誤,拿返回對象的值須要用拷貝內存由於地址發生改變;模型驅動不可使用局部類型轉換器。session
六、Struts2是怎樣進行值封裝的?Struts2的值封裝實際上採用了ongl表達式,struts2的攔截器通過模型驅動時會先判斷action是否實現了ModelDriven,若是是則拿到模型的實例放在棧頂,到屬性驅動的時候會從棧頂把實例拿出來,從頁面傳進來的值放在一個map集合中,經過map集合進行迭代會經過ongl技術把值封裝到實例中。app
七、Struts2如何進行校驗?編程校驗:繼承actionsupport,重寫validate方法;validateXXX方法;若是有錯誤就把錯誤信息放在FieldError中,而且跳轉到指定的錯誤業務類,沒有就會進行action方法調用;校驗框架:每一個action類都有一個校驗文件,命名action類名-validation.xml,且與action類同目錄,這是對action裏面全部的方法進行校驗;對action裏面指定方法作校驗使用action類名-訪問路徑_方法名-validation.xml,在校驗文件裏又分爲兩種:字段校驗:字段用什麼校驗器來校驗;非字段校驗是用什麼校驗器來校驗字段。框架
八、談談Struts2的國際化?分爲三部分:action範圍,這種範圍是用action的實現類的類名來做爲前綴_語言名稱_國家地區.properties;包範圍,是用package做爲前綴_語言名稱_國家地區名.properties;全局範圍,默認前綴是application,能夠經過xml配置文件配置常量來指定前綴jsp
國際化實現的原理:經過i18n攔截器得到請求參數request--locale的值並把當前的值轉化爲locale對象,把locale對象存在ww_trans_i18n_locale的session做用域中,根據Struts2的請求處理流程,攔截器只會進入action纔會調用,因此咱們通常吧對jsp的訪問轉化爲對action的訪問。工具
九、OGNL是什麼?你在項目中如何使用它?OGNL是對象圖形導航語言,原ognl是單個對象的,在Struts2的的應用是多個對象的,Struts2的類型轉換也是經過ognl實現的,Struts2中默認的表達式語言就ognl,相對於jstl或其餘表達式語言,它有以下優點:可以調用對象實例方法;可以調用類的靜態方法;操做集合對象;訪問OGNL上下文。
十、Struts2如何訪問servletAPI?經過actionContext能夠得到request,application,session三個做用域;經過servletactionContext得到原始的API;能夠經過實現servletRequestaAware接口,重寫裏面的setServletRequest方法得到request,其實是經過set的依賴注入。
十一、什麼是攔截器,說說Struts2用攔截器來幹什麼,說出6個攔截器?在訪問類的某個方法或屬性以前執行,攔截的是action的請求,進行攔截後在方法的執行前或以後加入某些操做,如國際化,權限,校驗等與源代碼無關的操做。國際化,表單重複提交,類型轉換,自動裝配,數據封裝,異常處理,模型驅動,請求參數,處理類型裝換錯誤,日誌攔截器。
十二、如何自定義攔截器?能夠繼承MethodFilterInterceptor重寫doInterceptor方法指定某個方法進行攔截,或者繼承AbstractInterceptor,重寫intercept方法,在xml配置文件中定義自定義攔截器,而後注入攔截器棧時配置<param>標籤,使用name屬性配置,excludeMethods表示不攔截指定方法。在配置文件中配置includeMethods指定攔截某個方法。能夠配置到某個action單獨使用,也能夠配置到包下面的全部action使用。
1三、ActionContext是用來幹什麼的?ActionContext是Action的上下文。經過ActionContext這個類能夠得到request,session,application,locale,valuestack,conversionError;能夠得到servlet的API;能夠進行國際化:得到語言環境locale;收集錯誤信息ConversessionErrors;有個值棧來裝action實例與模型驅動的實例valuestack;ActionContext是線程安全的,用本地線程實現的;
1四、Struts2是如何實現MVC的?M(模型):除核心控制器外都屬於模型,實現業務的類(service層與dao層),V(視圖):result,type,dispatcher默認的(jsp,freemaker,velocity,源代碼等);C(控制器):核心控制器與業務控制器
1五、MVC解決什麼問題?解決了數據封裝,類型轉換,數據校驗,國際化,異常處理等問題。
1六、標籤<s:property>和el表達式有什麼區別?他們均可以從值棧裏面取值,可是el表達式只能取屬性有getset方法的簡單數據類型,若是要取得數組的一些方法等複雜數據對象類型,那麼就要用s:property標籤.