Spring Framework 筆記 (三)
上面的簡單例子可以簡單的描繪出 Spring Framework 在 Web Application 開發上所需要具備的一些元素。因此以 bottom-up 的方式,講完了例子,再反推回去看實際的 Spring Web Application 架構。
底下這張架構圖可以去對應上面的例子,DispatcherServlet 就是例子裡面的 springapp (org.springframework.web.servlet.DispatcherServlet),這個是控制著 Spring Web MVC 的起始點。
HandllerMapping 就是我們在例子裡面使用到的 urlmapping,指定對應到符合某些條件的 request 由哪支程式來做處理 (另外還可以加入一些前置或後置處理的 process)。
Contoller 就是 MVC 架構中的 'C',也就是上面例子裡面的 springappController。
ViewResolver 負責將 ViewName 解析到相對應的 View。
傳統的 JSP/Servlet 處理模式大概就是由 JSP 負責 View 的部分,由 Servlet 負責 Controller 部分,而 Servlet 會繼承自 HttpServlet,並且會覆寫 doPost 或 doGet methods,處理完之後,再 forward 或是 redirect 到結果頁面。在轉到結果頁面的過程中,若是 Servlet 有一些處理的資料需要讓結果頁面來呈現,就會透過 Session 或 HTTPServletRequest 傳遞資料。另外 Model 的部分就是使用 JavaBean 來包裝這些 Domain Model 的資料。
Spring MVC 架構主要也是架構在上述的 JSP MVC Model 2 架構,不過 Spring 將上面的 Model 包裝成一個 Framework,增加開發的 reuse 以及 pluggable 特性。
底下是 Spring Controller Interface 的程式碼,這只是一個 Interface,定義了 Contoller 該有的行為,handleRequest。handleRequest 的作用跟 HTTPServlet 裡面的 doPost 以及 doGet 類似,而最後回傳的是一個 ModelAndView 的 Object。ModelAndView 先不看程式碼,由上述的 JSP MVC Model 2 架構就可以很清楚的看出, ModelAndView 的主要作用在哪了。
public interface Controller {
ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;
}
再回頭看之前的 springappController 程式碼:
public class SpringappController implements Controller {
private String viewFileName;
protected final Log logger = LogFactory.getLog(getClass());
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
logger.info("SpringappController - returning hello view");
String now = (new java.util.Date()).toString();
return new ModelAndView(getViewFileName(), "now", now);
}
public String getViewFileName() {
return viewFileName;
}
public void setViewFileName(String viewFileName) {
this.viewFileName = viewFileName;
}
}
主要就是 implement Controller Interface,把 handleRequest method 給實際 implement 出來,最後的 ModelAndView 的 View 部分就是從 Setter Injection 指定給 springappController 的 view name,以及現在日期的 model 資料 - now。
至於 URL mapping 以及 View Resolover 部分,都是直接使用 Spring 內建的 SimpleUrlHandlerMapping 以及 JstlView。除了 SimpleURLHandlerMapping 之後,Spring 還內建了其他的 URM Mapping 方式。同樣的,除了 JstlView 之外,Spring 也可以跟其他的 presenation 架構整合。
沒有留言:
張貼留言