国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

Struts2 之 對xwork的理解

2019-11-14 22:32:18
字體:
來源:轉載
供稿:網(wǎng)友
Struts2 之 對xwork的理解

對象的生命周期的管理是面向對象編程亙古不變的話題,從syntax的角度,面向對象的高級編程語言都是以“對象”為核心,而對象之間的繼承關系、嵌套引用關系構成的對象樹結構為我們進行對象級別的邏輯操作提供了足夠的語法支持。而對象之間的這種復雜的關系也為對象生命周期的管理帶了難題:

  • 1.運行期,對象實例的創(chuàng)建和引用機制
  • 2.對象及其關聯(lián)對象之間的依賴處理機制。

為了解決這個難題,業(yè)界在程序邏輯中引進了一個額外的編程元素(Container),

(由一系列操作對象的接口構成其中至少包括獲取對象實例和管理對象之間依賴關系的操作方法。)

首先讓我們先看看Struts的這個Container的構造吧。

從框架的角度其實Struts2實際運行有2條主線和2個執(zhí)行階段。

Struts2的所有內容都無法逃脫這些概念存在。他們構成了Struts2的基本元素和運行機理。

第一條主線:Struts2的初始化:調用servlet之init方法執(zhí)行。

該主線特點:

1.僅在web應用啟動時執(zhí)行一次

2.init方法執(zhí)行失敗將導致整個應用啟動失敗。這也是源于Filter這個servlet規(guī)范的基本運行特性。

Struts2這條初始化主線主要干的活:框架元素的初始化,包括框架內部許多內置對象的創(chuàng)建和緩存。

對框架的運行的必要條件進行控制(根據(jù)“開閉原則”框架的擴展開放保證了我們可以在應用層面對框架的運行參數(shù)以及執(zhí)行模式進行定制,所以在這條主線中struts2也對這種定制化的正確性提供了運行時校驗,如果失敗,則web應用的啟動也會失敗。)

這條主線的順利執(zhí)行將會為之后的Http請求提供“舒適的”執(zhí)行環(huán)境,注意這里的運行環(huán)境并不是Struts2的運行環(huán)境,這里的環(huán)境是建立在web Container之上,框架運行必須的內置對象的集合。本次初始化也是對這個建立在web container之上的Container的初始化。

初始化涉及class如下:

第二條主線:Struts2的http請求處理主線,包括對http請求的處理、對必要數(shù)據(jù)的處理和返回數(shù)據(jù)的處理全過程。

即:從滿足StrutsPRepareAndExecuteFilter過濾url開始到dofilter方法執(zhí)行。

本主線分兩個執(zhí)行階段:

1.Http請求預處理 這也是程序的控制權真正在Strust2手上的時候。程序在這個階段是依賴web Container的。

本階段主要將分析http請求中以字符串形式的“弱類型”數(shù)據(jù)轉換成以對象為載體的“強類型”數(shù)據(jù),以及為運行環(huán)境做準備。

2.XWork終于粉墨登場啦 O(∩_∩)O~ XWork執(zhí)行業(yè)務邏輯

這個階段程序的控制權落入XWork之手。XWork依托于第一階段封裝的對象形式的數(shù)據(jù),處理業(yè)務邏輯。

這個階段程序完全跟web Container沒啥關系了 這也是Struts2所說的之所以它不是不依賴于web Container的MVC框架的原因。

這也體現(xiàn)了Struts2的核心設計理念:消除了核心程序對于運行環(huán)境(Web Container)的依賴,也是Struts2解耦的過程。

1.代碼角度的解耦:第一執(zhí)行階段的代碼整合到struts2-core-2.3.16.1.jar第二執(zhí)行階段的代碼整合到xwork-core-2.3.16.1.jar

2.邏輯角度的解耦:將處理數(shù)據(jù)的邏輯和處理業(yè)務的邏輯分成倆個不同的執(zhí)行階段處理。(但是現(xiàn)在紅極一時的SpringMVC卻又回歸了 重新?lián)砣肓薟eb Container的大懷抱啦 (⊙o⊙)…)

第二階段設計類如下:

了解了Struts2的大體流程,接下來我們再具體看一下XWork到底是怎么工作的。

首先,先讓我們來看看XWork Container這個"大盒子"是怎么定義的吧

java代碼收藏代碼
  1. publicinterfaceContainerextendsSerializable{
  2. /**
  3. *Defaultdependencyname.
  4. */
  5. StringDEFAULT_NAME="default";
  6. /**
  7. *Injectsdependenciesintothefieldsandmethodsofanexistingobject.
  8. */
  9. voidinject(Objecto);
  10. /**
  11. *Createsandinjectsanewinstanceoftype{@codeimplementation}.
  12. */
  13. <T>Tinject(Class<T>implementation);
  14. /**
  15. *Getsaninstanceofthegivendependencywhichwasdeclaredin
  16. *{@linkcom.opensymphony.xwork2.inject.ContainerBuilder}.
  17. */
  18. <T>TgetInstance(Class<T>type,Stringname);
  19. /**
  20. *Conveniencemethod.&nbsp;Equivalentto{@codegetInstance(type,
  21. *DEFAULT_NAME)}.
  22. */
  23. <T>TgetInstance(Class<T>type);
  24. /**
  25. *Getsasetofallregisterednamesforthegiventype
  26. *@paramtypeTheinstancetype
  27. *@returnAsetofregisterednamesoremptysetifnoinstancesareregisteredforthattype
  28. */
  29. Set<String>getInstanceNames(Class<?>type);
  30. /**
  31. *Setsthescopestrategyforthecurrentthread.
  32. */
  33. voidsetScopeStrategy(Scope.StrategyscopeStrategy);
  34. /**
  35. *Removesthescopestrategyforthecurrentthread.
  36. */
  37. voidremoveScopeStrategy();
  38. }

Java代碼收藏代碼
  1. StringDEFAULT_NAME="default";//默認的對象獲取標識
  2. voidinject(Objecto);//進行對象依賴注入的基本操作接口,作為參數(shù)的Object將被XWorkContainer進行處理,Object內部聲明有@Inject的字段和方法,都將被注入受到“盒子”托管的對象,從而建立起依賴關系
  3. <T>Tinject(Class<T>implementation);//創(chuàng)建一個類的實例并進行對象依賴注入
  4. <T>TgetInstance(Class<T>type,Stringname);//根據(jù)type和name作為唯一標識獲取聲明在com.opensymphony.xwork2.inject.ContainerBuilder的對象實例
  5. <T>TgetInstance(Class<T>type);//根據(jù)type和默認的DEFAULT_NAME作為唯一標識獲取“盒子”里的java類實例
  6. Set<String>getInstanceNames(Class<?>type);//通過type獲取這個type對應“盒子”中注冊過的name
  7. voidsetScopeStrategy(Scope.StrategyscopeStrategy);//設置當前線程的作用范圍的策略
  8. voidremoveScopeStrategy();//刪除當前線程的作用范圍的策略

個人覺得這個Container于Spring中的BeanFactory有著異曲同工之妙。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 绥化市| 夏津县| 讷河市| 阳原县| 扎赉特旗| 鹿泉市| 乌什县| 福建省| 宁国市| 兴安县| 科技| 象州县| 涟源市| 美姑县| 潮州市| 盱眙县| 昌吉市| 美姑县| 英吉沙县| 临夏县| 济阳县| 汶上县| 麦盖提县| 栾川县| 玛曲县| 佛学| 武义县| 利川市| 津市市| 易门县| 西畴县| 黔江区| 河源市| 呈贡县| 昌乐县| 全州县| 麻城市| 林周县| 水城县| 通江县| 利川市|