Struts2运行机制(MVC)的分析:
生活随笔
收集整理的這篇文章主要介紹了
Struts2运行机制(MVC)的分析:
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
C:(controller)控制器 ? ? ? ? ?M:(model)模型處理 ? ?V:(view)視圖 Struts 2 的運行過程: ? ? 核心控制器是FilterDispatcher會過濾所有的請求,如果請求以 action結(jié)尾,該請求會轉(zhuǎn)入框架處理。當框架獲取*action請求后,根據(jù)*action的前半部分決定調(diào)用哪個業(yè)務(wù)邏輯組件。最后根據(jù)業(yè)務(wù)邏輯組件的處理信息決定轉(zhuǎn)發(fā)到哪個視圖;
? ? Struts2有三部分組成:核心控制器是FilterDispatcher,業(yè)務(wù)控制器和業(yè)務(wù)邏輯組件組件,其中核心控制器FilterDispatcher由Struts2提供,而業(yè)務(wù)邏輯控制器和業(yè)務(wù)邏輯組件要用戶自己實現(xiàn)。
? 核心控制器FilterDispatcher:負責(zé)攔截所有用戶的請求,如果用戶的請求以action結(jié)尾,該請求就會轉(zhuǎn)入Struts2框架處理。
?業(yè)務(wù)控制器組件:實現(xiàn)Action類的實例(或者繼承了ActionSupport的實例),該類經(jīng)常能夠返回一個字符串(邏輯視圖<result>的execute方法,用來實現(xiàn)業(yè)務(wù)控制)。
?業(yè)務(wù)邏輯組件:一般由javaBean或者EJB實現(xiàn);
注意: 在Struts2中處理用戶請求的并不是業(yè)務(wù)邏輯,而是Action代理:過程是這樣的,在Struts2框架中有一系列的攔截器,這些攔截器將HttpServletRequest請求中的參數(shù)分析出來,傳入Action中,并回調(diào)execute()方法來處理用戶請求。
當 所有的請求被攔截器攔截時:執(zhí)行流程
1,FilterDispatcher會將所有的請求轉(zhuǎn)發(fā)給 ActionProxy(Action代理),Action代理會根據(jù)配置文件struts.xml決定轉(zhuǎn)發(fā)給那個Action; 2,在請求轉(zhuǎn)發(fā)給Action的過程中,會經(jīng)過一系列攔截器,這些攔截器負責(zé)將請求解析并轉(zhuǎn)發(fā)給相應(yīng)的Action。 3,經(jīng)過相應(yīng)的Action的 execute()方法處理,會得到一個 視圖名的結(jié)果集,根據(jù)結(jié)果結(jié)合相應(yīng)的模版產(chǎn)生相應(yīng)的輸出流。 4,輸出流也可以經(jīng)過一些列的攔截器后,傳給瀏覽器。
對于源碼根據(jù)圖的理解:在Struts2的doFilter()方法中,通過execute.executeAction(request, response, mapping)執(zhí)行進入了Dispatcher,生成了Dispatcher的對象,并調(diào)用了serviceAction()方法;接下里調(diào)用了create()方法生成ActionProxy的對象proxy ,通過proxy調(diào)用了Actioninvaction的的invoke()方法,接下里,Actioninvaction調(diào)用interceptor()方法,然后再 繼續(xù)調(diào)用invoke()方法返回,判斷是否interceptor()調(diào)用完成,直到所有的interceptor()方法調(diào)用完成,就執(zhí)行*Action所對應(yīng)的execute().
模擬Struts2 實現(xiàn)的全過程代碼;
public class Main { public static void main(String[] args) {
new ActionInvaction().invoke(); } }
public interface Interceptor { public void interceptor(ActionInvaction invaction); }
public class FristInterceptor implements Interceptor {
public void interceptor(ActionInvaction invaction) { System.out.println(1); invaction.invoke(); System.out.println(-1); }
}
public class SecondInterceptor implements Interceptor {
public void interceptor(ActionInvaction invaction) { System.out.println(2); invaction.invoke(); System.out.println(-2); }
}
public class ActionInvaction { List<Interceptor> interceptors = new ArrayList<Interceptor>(); int index = -1; Action a = new Action();
public ActionInvaction() { this.interceptors.add(new FristInterceptor()); this.interceptors.add(new SecondInterceptor()); } public void invoke() { index++; if(index >= interceptors.size()) { a.execute(); } else { this.interceptors.get(index).interceptor(this); } } }
public class Action { public void execute() { System.out.println("execute!!!"); } }
轉(zhuǎn)載于:https://www.cnblogs.com/snake-hand/p/3151357.html
總結(jié)
以上是生活随笔為你收集整理的Struts2运行机制(MVC)的分析:的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TabActivity中的Tab标签详细
- 下一篇: 【PHP 】伪静态 - 4. 实际运用