1、簡單的談一下SpringMVC的工作流程?
流程
1、用戶發送請求至前端控制器DispatcherServlet
2、DispatcherServlet收到請求調用HandlerMapping處理器映射器。
3、處理器映射器找到具體的處理器,生成處理器對象及處理器攔截器(如果有則生成)一並返回給DispatcherServlet。
4、DispatcherServlet調用HandlerAdapter處理器適配器
5、HandlerAdapter經過適配調用具體的處理器(Controller,也叫后端控制器)。
6、Controller執行完成返回ModelAndView
7、HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet
8、DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器
9、ViewReslover解析后返回具體View
10、DispatcherServlet根據View進行渲染視圖(即將模型數據填充至視圖中)。
11、DispatcherServlet響應用戶
2、簡要說說Struts2的處理流程?
Struts2框架的大致處理流程如下:
1、加載類(FilterDispatcher)
2、讀取配置(struts配置文件中的Action)
3、派發請求(客戶端發送請求)
4、調用Action(FilterDispatcher從struts配置文件中讀取與之相對應的Action )
5、啟用攔截器(WebWork攔截器鏈自動對請求應用通用功能,如驗證)
6、處理業務(回調Action的execute()方法)
7、返回響應(通過execute方法將信息返回到FilterDispatcher)
8、查找響應(FilterDispatcher根據配置查找響應的是什么信息如:SUCCESS、ERROER,將跳轉到哪個jsp頁面)
9、響應用戶(jsp--->客戶瀏覽器端顯示)
10、struts2標簽庫(相比struts1的標簽庫,struts2是大大加強了,對數據的操作功能很強大)
請求(.action)---->經過StrutsPrepareAndExecuteFilter 核心控制器---->進入到Struts2的攔截器Interceptor
(實現代碼功能)----->通過action的名稱找對應的Action類----->執行Action類的execute方法----->通過exec
ute方法中返回的字符串,在Struts.xml中找對應的結果頁面(result)【在action執行之前,執行了defaultStack
攔截器棧】
* 攔截器 在 struts-default.xml定義 【它位於sruts2-core-xxx.jar目錄下】
* 執行攔截器 是 defaultStack 中引用攔截器
3、 說說Struts2的輸入校驗流程
Struts2校驗框架進行校驗時,將執行以下流程:
A:類型轉換器負責對字符串的請求參數執行類型轉換,並將這些值設置成Action的屬性值
B:在執行類型轉換過程中可能出現異常,如果出現異常,將異常信息保存到ActionContext中
convertionError攔截器將負責將其封裝到fieldError里,如果沒有異常,直接進入第3步
C:調用Struts2的內置校驗規則進行輸入校驗
D:通過反射調用validateXXX()方法
E:調用Action類中的validate()方法
F:如果上面的幾步中沒有出FiledError,就調用Acton中的邏輯處理方法,如果有,則進入input視圖
所以,在進行校驗時,別忘記在Action中的配置名為input的結果如:<result name=“input”>validate.jsp</result>
4、攔截器和過濾器有什么區別?
①攔截器是基於java的反射機制的,而過濾器是基於函數回調
②過濾器依賴與servlet容器,而攔截器不依賴與servlet容器
③攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用
④攔截器可以訪問action上下文、值棧里的對象,而過濾器不能
⑤在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次
攔截器 :是在面向切面編程的就是在你的service或者一個方法,前調用一個方法,或者在方法后調用一個方法比如動態
代理就是攔截器的簡單實現,在你調用方法前打印出字符串(或者做其它業務邏輯的操作),也可以在你調用方法后打印出字
符串,甚至在你拋出異常的時候做業務邏輯的操作。
5、Struts2請求流程
1、客戶端發送請求
2、請求先通過ActionContextCleanUp-->FilterDispatcher
3、FilterDispatcher通過ActionMapper來決定這個Request需要調用哪個Action
4、如果ActionMapper決定調用某個Action,FilterDispatcher把請求的處理交給ActionProxy,這兒已經轉到
它的Delegate--Dispatcher來執行
5、ActionProxy根據ActionMapping和ConfigurationManager找到需要調用的Action類
6、ActionProxy創建一個ActionInvocation的實例
7、ActionInvocation調用真正的Action,當然這涉及到相關攔截器的調用
8、Action執行完畢,ActionInvocation創建Result並返回,當然,如果要在返回之前做些什么,可以實現PreResultListener。添加PreResultListener可以在Interceptor中實現。
6、SpringMVC與Struts2的主要區別?
①springmvc的入口是一個servlet即前端控制器,而struts2入口是一個filter過慮器。
②springmvc是基於方法開發,傳遞參數是通過方法形參,可以設計為單例或多例(建議單例),struts2是基於類開發,
傳遞參數是通過類的屬性,只能設計為多例。
③Struts采用值棧存儲請求和響應的數據,通過OGNL存取數據, springmvc通過參數解析器是將request對象內容進
行解析成方法形參,將響應數據和頁面封裝成ModelAndView對象,最后又將模型數據通過request對象傳輸到頁面。 Jsp視圖解析器默認使用jstl。