其實這個知識點已經在個人博客:Spring必備知識中提到了,可是比較分散,這裏整理出單獨一篇文章。前端
一旦Http請求到來,DispatcherSevlet將負責將請求分發。DispatcherServlet能夠認爲是Spring提供的前端控制器,全部的請求都有通過它來統一分發。 在DispatcherServlet將請求分發給Spring Controller以前,須要藉助於Spring提供的HandlerMapping定位到具體的Controller。HandlerMapping是這樣一種對象,它可以完成客戶請求到Controller之間的映射。在Struts中,這種映射是經過struts-config.xml文件完成的。其中,Spring爲Controller接口提供了若干實現,例如Spring默認使用的BeanNameUrlHandlerMapping。還有,SimpleUrlHandlerMapping,CommonsPathMapHandlerMapping。 web
Spring Controller將處理來自DispatcherServlet的請求。Spring的Controller相似於struts的Action,可以接受HttpServletRequest和HttpServletResponse。Spring爲Controller接口提供了若干實現類,位於
org.springframework.web.servlet.mvc包中。因爲Controller須要爲併發用戶處理上述請求,所以實現Controller接口時,必須保證線程安全而且可重用。Controller將處理客戶請求,這和Struts Action 扮演的角色是一致的。 一旦Controller處理完客戶請求,則返回ModelAndView對象給DispatcherServlet前端控制器。spring
ModelAndView中包含了模型(Model)和視圖(View)。從宏觀角度考慮,DispatcherServlet是整個Web應用的控制器;從微觀角度考慮,Controller是單個Http請求處理過程當中的控制器,而ModelAndView是Http請求過程當中返回的模型和視圖。前端控制器返回的視圖能夠是視圖的邏輯名,或者實現了View接口的對象。View對象可以渲染客戶響應結果。其中,ModelAndView中的模型可以供渲染View時使用。藉助於Map對象可以存儲模型。
若是ModelAndView返回的視圖只是邏輯名,則須要藉助Spring提供的視圖解析器(ViewResoler)在Web應用中查找View對象,從而將響應結果渲染給客戶。 DispatcherServlet將View對象渲染出的結果返回個客戶。數據庫
首先有一個http請求,這個請求通過一系列的過濾器(Filter)(這些過濾器中有一個叫作ActionContextCleanUp的可選過濾器,這個過濾器對於Struts2和其餘框架的集成頗有幫助,例如:SiteMesh Plugin),而後進入struts2的控制核心FilterDispatcher; FilterDispatcher詢問ActionMapper,來判斷此請求是否須要struts2處理,若是須要,那麼由ActionProxy來接管,經過配置管理找到struts.xml,而後進入ActionInvocation,通過攔截器,進入action,從而根據返回的result選擇咱們要的頁面,在攔截器的前半部分去值棧中取值經過標籤展現在頁面上,最後生成response返回 。緩存
Hibernate對象分爲三種狀態:瞬時態(new 出來的或者實例化時session無關的),持久態(session關聯)與遊離態(曾經與session關聯)。其中持久態的對象是PO,瞬時態、託管態的對象可做爲VO。(PO不該該直接用做v層)因此在使用中應該注意三態的轉化。如:在進行數據操做的一系列過程當中,save或者saveorupdate操做能夠把瞬時態或者遊離態的對象轉換成持久態,而delete或者session的close、flush等操做將會把session相關聯的持久態對象轉換成遊離態。 安全
使用new操做符初始化的對象是一個瞬時態的(Transient)(沒有任何跟數據庫表相關聯的行爲,只要應用再也不引用這些對象,它們的狀態就會丟失,並由垃圾回收機制回收);瞬時態對象通過save(),saveOrUpdate會轉換成持久態,由session統一管理,持久態對象的操做與數據庫同步;持久態對象通過evict(),close(),clear()等會轉換成遊離態,這時雖然被持久化,可是不在session緩存中,經過lock(),update(),saveOrUpdate又會轉換成持久態。 經過get(),load(),find(),iterate()得到的對象直接就是持久態的。session