對struts2一些理解

1.strust2框架是什麼?爲解決什麼問題出現?java

Struts2是在WebWork+xwork基礎發展而來的。web


2. strust2的優缺點
優勢:
支持Ajax
支持Ognl標籤
提供了強大的攔截器
線程安全 由於每次請求都會產生一個實例
缺點:
耦合度低 比較複雜,源代碼很差調試。編程

3.在公司裏怎麼用的?緩存

國際化 :提供了全局範圍、包範圍和Action範圍的國際化資源文件
action類簡單名字.properties------package_zh.properties-----------ApplicationResources.properties
action範圍-----包範圍 咱們的action必須繼承ActionSuport安全

1 局部類型轉換器 本身action使用 action同目錄下創建Action簡單類名-conversion.properties
action中的bean屬性名=包名.轉換器類名
2全局類型轉換器 所有action使用 src創建xwork-conversion.propertiessession


4寫自定義驗證?
驗證:1.繼承ActionSupport 重寫validate方法或者編寫validatetXxx 方法,重寫vaildate方法會對Action中的全部struts2業務方法進行校驗
2 校驗框架<字段與非字段>
在action的同目錄下編寫Action簡單類名-validation.xml文件,該文件中的驗證會對Action中的全部struts2業務方法進行校驗,如要校驗某個方法
編寫的文件名是Action簡單類名-action name(struts,xml配置中的name)-validation.xml文件
3.模型驅動與屬性驅動
action類實現 ModelDriven<javabean類名> 接口,採用泛型
在 action類中定義javabean屬性,實現getModel方法,把getModel方法放在棧頂,棧是先進後出
4.自定義攔截器
(1)編寫攔截器類,繼承AbstractInterceptor類 重寫intercept(ActionInvocation arg0)方法
調用用參數類ActionInvocation的invoke方法,即 String result= arg0.invoke(); 返回該result=invoke就是回調使用了該攔截器的action得相應方法,此時可在該方法執行先後加入咱們想要的代碼,達到咱們攔截action的目的,利用 arg0.getAction()方法還能夠獲得攔截器攔截的action實例 app

配置:
在struts.xml配置攔截器<interceptors>中配置<interceptor name="攔截器名" class="包名.攔截器類">,再到action中指定攔截器。框架


(2)struts2有30多個攔截器,但咱們最經常使用的有18個攔截器
攔截器的好處:能夠進行面向切面編程jsp

4.經驗和教訓:strust2雙向類型轉換(頁面----action----頁面回顯)
1.關閉開發模式
3.不要使用不須要的攔截器 由於會把每一個類都攔截一次,這樣會致使性能比較慢
4.儘可能使用頁面緩存
5.web-inf下建立一個freemarker.properties文件,由於strust的標籤都是freemarker作的
6.使Freemarker模版定製標籤緩存
7.不要在session裏面放東西。儘可能放在request裏面ide

5.總體結構和源碼的實現
總體結構:
ActionSupport與Action
Action接口提供了5個常量
public static final String SUCCESS = "success";
public static final String ERROR = "error";
public static final String LOGIN = "login";
public static final String INPUT = "input";
public static final String NONE = "none";
ActionSupport
1實現了Action接口
2實現了國際化
3實現了校驗7

繼承ActionSupport的好處:
繼承了Action,Action提供了5個常量:SUCCESS、ERROR、LOGIN、INPUT、NONE。
實現了國際化
實現了校驗(struts2中Action要實現國際化和校驗必須繼承ActionSupport)

Struts2請求處理流程
一、客戶端發送請求 (客戶端初始化一個指向Servlet容器(如Tomcat)的請求)
二、請求通過一系列過濾器(如ActionContextCleanUp、SiteMesh等),ActionContextCleanUp-->FilterDispatcher
三、FilterDispatcher經過ActionMapper來決定這個Request須要調用哪一個Action 若是不是調用action 則直接執行你的資源
四、若是ActionMapper決定調用某個Action,FilterDispatcher把請求的處理交給ActionProxy,
五、ActionProxy經過Configuration Manager詢問Struts配置文件(Struts.xml),找到須要調用的Action類。
六、ActionProxy建立一個ActionInvocation的實例
七、ActionInvocation經過一系列的攔截器調用真正的Action,固然這涉及到相關攔截器的調用
八、Action執行完畢,ActionInvocation建立Result並返回,返回結果前要作些動做也是能夠的


  Struts2源碼
Filter與servlet的區別:
Filter必須實現javax.Servlet.Filter接口,而且必須定義如下三個方法:init(),destory(),doFilter().
Servlet通常繼承HttpServlet,當Url匹配這個Servlet時候運行處理請求;若是加上load-on-start爲1時候,Web應用啓動時候加載此Servlet;
過濾器:Web.xml:《filter-class》StrutsPrepareAndExecuteFilter《/filter-class》
<filter>的生命週期:init()初始化——》doFilter()當用戶發送請求的時候struts2去攔截 ——》destroy()跟servlet生命週期很像
Init():initOperations初始化的一個操做,
  初始化默認的資源文件,初始化xml配置文件,初始化struts其餘文件(用得是一個模板模式)
  Init_TraditionalXmlConfigurations():configPaths=DEFAULT_CONEIGURATION_PATHS;拿到默認值,每拿到一個值就作判斷(xwork作判斷)向前兼容,能夠解析xwork
  若是不是的話,把每一個類的配置文件都加入到
dispatcher進去createDispatcher
把每一個配置文件分配一個解析配置文件的類

reloadContainer(getContainerProviders):加載容器
containerProvider:遍歷循環這個解析類,先解析,而後再注入到容器裏面去
解析過程:
Inject:依賴注入,當我這個初始化的時候,那麼依賴個人這個對象就會給它初始化(先依賴誰就初始化誰)
返回了configmannage;
Prepare:令模式
doFilter:當用戶發送請求的時候咱們就用doFilter攔截;
  Prepare:準備,只要action是實現了通常有優先級;
  Struts2不用寫過濾器也不會出現亂碼,它裏面有自帶的過濾器
  Dispatcher.getContainer().getINstance():容器獲得genBean的方法
  將咱們request封裝到一個Map裏面去了,這樣struts2就和servlet解耦了。
  ThreadLocal:解決線程安全的問題,依靠本地線程(當多個線程訪問dispatcher,它就 會把咱們的每一個線程複製一個dispatcher分配給ThreadLocal)相對於struts1線程比較安全
  UtilTimeStack:把調試信息放在值棧裏面(以壓棧的形式調用攔截器)
  提供一個鍵值對:鍵就是:攔截器,值就是隊
  默認的有34種攔截器(經常使用的18種)——struts-defalut。xml
  第一個攔截器的源代碼:一、異常攔截器(裏面全部的攔截器它都能捕捉到)——》
  servletConfig:首先拿到action判斷有沒有實現
  只要實現哪裏接口,就把咱們實現相關的放進去,

Debugging:若是我要變成debugging模式就調成開發模式
modeDrivenInterceptor:後臺傳個參數過來,提交在頁面利用模型驅動,它是雙向的;
模型驅動原理:
首先把咱們默認的值棧找出來
OJNL:對象導航圖形頁面,它是以值棧的形式訪問數據
當咱們action執行完了之後,系統就會把咱們的action放在值棧裏面
Action沒有再去別的地方找,咱們頁面上的屬性值都是經過action去找得
最後把模型放在棧頂,由於優先級是從棧頂找的,因此action不須要加前綴;

 

6.同類框架的比較struts2與struts1的比較 1 核心控制器改成了過濾器 2 struts1要求咱們的業務控制器必須繼承action或者dispatchaction struts2不強制你這麼作 只需提供一個返回string類型的execute方法 3 綁定值到業務類 struts1 經過actionform struts2直接綁定到action屬性 4 struts1嚴重依賴於servle方法的校驗。struts2則否則 5 管理action struts1 單例由於僅有Action的一個實例來處理全部的請求。 struts2 每一個請求都會產生一個實例 (原型) 6 從表達式的支持上,struts2不只支持jstl,還支持功能更爲強大的ognl表達式 7 strust1類型轉換是單向的(頁面到ActionForm),strust2雙向類型轉換(頁面----action----頁面回顯) 8 校驗 strust沒有針對具體方法的校驗 固然它有本身的針對path驗證 9 struts2支持的視圖技術除了jsp以外 還有freemaker velocity 源代碼等 struts1只是單一的表現層技術jsp 截等功能。 10 Struts2提供了攔截器,利用攔截器能夠進行AOP編程,實現如權限攔 11 提供了全局範圍、包範圍和Action範圍的國際化資源文件管理實現

相關文章
相關標籤/搜索