freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

struts2的工作機制原理分析及實例(編輯修改稿)

2025-07-26 10:30 本頁面
 

【文章內(nèi)容簡介】 60。 //如果請求的資源是Action,則調(diào)用serviceAction方法。 (request, response, servletContext, mapping)。 } finally { try { (req)。 } finally { (timerKey)。 } } } 這段代碼的活動圖如圖18所示:(圖18) ()方法中,先加載Struts2的配置文件,如果沒有人為配置,、。 , addAction()方法負責讀取action標簽,并將數(shù)據(jù)保存在ActionConfig中;addResultTypes()方法負責將resulttype標簽轉化為ResultTypeConfig對象;loadInterceptors()方法負責將interceptor標簽轉化為InterceptorConfi對象;loadInterceptorStack()方法負責將interceptorref標簽轉化為InterceptorStackConfig對象;loadInterceptorStacks()方法負責將interceptorstack標簽轉化成InterceptorStackConfig對象。而上面的方法最終會被addPackage()方法調(diào)用,將所讀取到的數(shù)據(jù)匯集到PackageConfig對象中,細節(jié)請參考代碼清單16。代碼清單16:()方法 protected PackageConfig addPackage(Element packageElement) throws ConfigurationException { PackageConfig newPackage = buildPackageContext(packageElement)。 if (()) { return newPackage。 } if (()) { (Loaded + newPackage)。 } // add result types (and default result) to this package addResultTypes(newPackage, packageElement)。 // load the interceptors and interceptor stacks for this package loadInterceptors(newPackage, packageElement)。 // load the default interceptor reference for this package loadDefaultInterceptorRef(newPackage, packageElement)。 // load the default class ref for this package loadDefaultClassRef(newPackage, packageElement)。 // load the global result list for this package loadGlobalResults(newPackage, packageElement)。 // load the global exception handler list for this package loadGlobalExceptionMappings(newPackage, packageElement)。 // get actions NodeList actionList = (action)。 for (int i = 0。 i ()。 i++) { Element actionElement = (Element) (i)。 addAction(actionElement, newPackage)。 } // load the default action reference for this package loadDefaultActionRef(newPackage, packageElement)。 ((), newPackage)。 return newPackage。 } 活動圖如圖19所示:(圖19) 配置信息加載完成后,創(chuàng)建一個Action的代理對象——ActionProxy引用,實際上對Action的調(diào)用正是通過ActionProxy實現(xiàn)的,而ActionProxy又由ActionProxyFactory創(chuàng)建,ActionProxyFactory是創(chuàng)建ActionProxy的工廠。注:ActionProxy和ActionProxyFactory都是接口,他們的默認實現(xiàn)類分別是DefaultActionProxy和DefaultActionProxyFactory。 在這里,該類是對ActionInvocation接口的默認實現(xiàn),負責Action和截攔器的執(zhí)行。 在DefaultActionInvocation類中,定義了invoke()方法,該方法實現(xiàn)了截攔器的遞歸調(diào)用和執(zhí)行Action的execute()方法。其中,遞歸調(diào)用截攔器的代碼如清單17所示:代碼清單17:調(diào)用截攔器,()方法的部分代碼 if (()) { //從截攔器集合中取出當前的截攔器 final InterceptorMapping interceptor = (InterceptorMapping) ()。 (interceptor: +(), new String() { public String doProfiling() throws Exception { //執(zhí)行截攔器(Interceptor)接口中定義的intercept方法 resultCode = ().intercept()。 return null。 } })。 } 從代碼中似乎看不到截攔器的遞歸調(diào)用,其實是否遞歸完全取決于程序員對程序的控制,先來看一下Interceptor接口的定義:代碼清單18:public interface Interceptor extends Serializable { void destroy()。 void init()。 String intercept(ActionInvocation invocation) throws Exception。} 所有的截攔器必須實現(xiàn)intercept方法,而該方法的參數(shù)恰恰又是ActionInvocation,所以,(),代碼清單17會再次執(zhí)行,從Action的Intercepor列表中找到下一個截攔器,依此遞歸。下面是一個自定義截攔器示例:代碼清單19:public class CustomIntercepter extends AbstractInterceptor { @Override public String intercept(ActionInvocation actionInvocation) throws Exception { ()。 return 李贊紅。 }} 截攔器的調(diào)用活動圖如圖20所示:(圖20) 如果截攔器全部執(zhí)行完畢,則調(diào)用invokeActionOnly()方法執(zhí)行Action,invokeActionOnly()方法基本沒做什么工作,只調(diào)用了invokeAction()方法。 為了執(zhí)行Action,必須先創(chuàng)建該對象,該工作在DefaultActionInvocation的構造方法中調(diào)用init()方法早早完成。調(diào)用過程是:DefaultActionInvocation()init()createAction()。創(chuàng)建Action的代碼如下:代碼清單20:()方法 protected void createAction(Map contextMap) { try { action = ((), (), (), contextMap)。 } catch (InstantiationException e) { ……異常代碼省略 } } Action創(chuàng)建好后,輪到invokeAction()大顯身手了,該方法比較長,但關鍵語句實在很少,用心點看不會很難。代碼清單20:()方法protected String invokeAction(Object action, ActionConfig actionConfig) throws Exception { //獲取Action中定義的execute()方法名稱,實際上該方法是可以隨便定義的 String methodName = ()。 String timerKey = invokeAction: +()。 try { (timerKey)。 Method method。 try { //將方法名轉化成Method對象 method = getAction().getClass().getMethod(methodName, new Class[0])。 } catch (NoSuchMethodException e) { // hmm OK, try doXxx instead try { //如果Method出錯,則嘗試在方法名前加do,再轉成Method對象 String altMethodName = do + (0, 1).toUpperCase() + (1)。 method = getAction().getClass().getMethod(altMethodName, new Class[0])。 } catch (NoSuchMethodException e1) {16
點擊復制文檔內(nèi)容
公司管理相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1