SpringMVC主要就是用來做流程控制的,這篇博客總結一下如何在流程控制添加Interceptor(攔截器),如何將進行流程Mapping映射解析,如何編寫Controller(控制器)。
一,首先看一下框架中的映射解析器,用來將uri和控制器進行綁定的:
1, SpringMVC框架的默認解析器采用是:bean的name屬性名稱作為URI,與控制器進行映射綁定,BeanNameUrlHandlerMapping。例如:
這種情況看起來是很方便的,直接將uri和類進行了綁定。但是耦合性高了些,我們一般是希望將uri和類的id進行綁定,這樣方便我們後期的修改,看下邊框架為我們提供的這個對象。
2,SimpleUrlHandlerMapping :通過映射關系將請求路徑和控制器綁定在一起,設置更加靈活。這裡看個例子:
這種方法,是將uri和類的id進行綁定,使彼此的耦合性更加低,獨立性更高了。這樣就將我們的映射關系和類獨立開來了。當然了兩個都可以,根據實際情況選擇即可。這是我們兩種最常用的映射解析器。
二,Interceptor,通過編寫Interceptor可以對控制器進行攔截,對框架進行功能擴展,非常實用的。看一下如何將自己寫的Interceptor融入到框架中。
1,自定義攔截器需要繼承HandlerInterceptorAdapter父類,或者實現HandlerInterceptor接口。這裡簡單看一個方法前後打印系統時間的小攔截器:
public class TimeInterceptor extends HandlerInterceptorAdapter { //整個流程請求完成之後要執行的操作。 @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("invoke afterCompletion..."+new Date()); } //請求控制器結束後做的操作 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("invoke postHandle..."+new Date()); } //請求控制器執行之前做的操作 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("invoke preHandle..."+new Date()); return true; } }
這樣就可以起作用了,對框架的功能擴展相對來說還是比較方便的。
三,最後看我們的Controller控制器的編寫吧,這裡的Controller和Struts2裡邊的action是相同的,但是這裡有了侵入性。一般情況下需要實現Controller接口,上一遍博客有演示,同時也可以采用繼承父類的方式,這裡來看幾個繼承不同的父類,實現不同的功能。
1,繼承AbstractController,這個和接口差不多,需要我們重寫裡邊的方法,主要的是,一般情況下,需要將此方法由父類的protected該外public的類型,供其他類的使用,其中方法名是固定的,我們指定路徑和此類即可由框架幫助我們調其中的方法。這裡不再舉例。
2,繼承MultiActionController(多動作控制器),這樣我們可以增加多個方法,處理多個客戶的請求,例如:
public class MultiController extends MultiActionController { //自定義處理請求的方法,命名規則參照父類的handleRequestInternal public ModelAndView insert(HttpServletRequest request,HttpServletResponse response) throws Exception { return new ModelAndView("insertSuccess"); } public ModelAndView delete(HttpServletRequest request,HttpServletResponse response) throws Exception { return new ModelAndView("deleteSuccess"); } }
insert delete
public class DemoController extends AbstractCommandController { public DemoController(){ this.setCommandClass(User.class); //這個就是用於接收客戶端請求參數的數據模型類。 } //command參數就是在構造方法中指定的數據模型對象。 //SpringMVC框架將請求參數,封裝到指定的數據模型對象中,傳遞給handle方法來使用。 @Override protected ModelAndView handle(HttpServletRequest request,HttpServletResponse response, Object command, BindException errors) throws Exception { User user = (User)command ; System.out.println(user.getUsercode()); System.out.println(user.getUserpswd()); return new ModelAndView("test"); } }
對於配置文件的映射就是類和路徑的映射,這裡不再贅述。這種方法就是將頁面傳過來的數據直接封裝到了指定的對象,我們可以直接使用,非常方便。
綜上,為SpringMVC流程控制方面的一些內容。其實任何的MVC框架都無在乎,核心控制器,映射文件,對應的action類,擴展可以通過攔截器,過濾器等。明白了大致方向,一些小的問題,我們可以通過查看API文檔,那才是我們開發有力的助手!!!