1. 程式人生 > >Spring MVC實際專案中的應用

Spring MVC實際專案中的應用

目前的專案應用了Spring MVC框架,總結一下實際應用中這個框架是如何發揮作用的,下圖是處理流程。參考
這裡寫圖片描述
1: 首先使用者傳送請求資訊,例如url:http://ggg-admin.inta.sit.fan.com/advertisement/query,被前端控制器DispatcherServlet捕獲,問題來了,怎麼捕獲的呢?看配置檔案web.xml:

<servlet>
        <servlet-name>ggg_admin</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class
>
<init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:admin-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> <!-- <async-supported>true</async-supported> -->
</servlet>

url和配置檔案中的兩個一樣的ggg_admin,這就是DispatcherServlet的名字,通過一系列配置,這個url被叫做ggg_admin的前端控制器捕獲。
2: DispatcherServlet——>HandlerMapping, HandlerMapping將會把請求對映為HandlerExecutionChain物件(包含一個Handler處理器(頁面控制器)物件、多個HandlerInterceptor攔截器)物件,通過這種策略模式,很容易新增新的對映策略;
3: DispatcherServlet——>HandlerAdapter.Controller(HandlerAdapter 將會把Controller包裝為介面卡,HandlerAdapter 將會根據適配的結果呼叫真正的處理器的功能處理方法,完成功能處理);
怎麼找到Controller呢?看url裡的後半段“/advertisement/query”,通過/advertisement找到Controller,通過/query找到方法,註解@RequestMapping實現了地址對映,引數method決定攔截get或者post方式提交的方法。

@Controller
@RequestMapping(value = "/advertisement")
@LoginRequired
public class AdvertisementController extends BaseController{
    @RequestMapping(value = "/query", method = {RequestMethod.POST, RequestMethod.GET})
    public ModelAndView query(@ModelAttribute("adEntityQuery") 
    AdvertisementEntity advertisementEntity) {
        Map<String, Object> model= new HashMap<String, Object>();
        /*
 * 第4步:呼叫業務處理方法(Service),把返回的資料放進map裡
 * 並返回一個ModelAndView物件(包含模型資料、邏輯檢視名);
 */
        return new ModelAndView(AD_HOME_PAGE, model);
    }
}

PS:個人理解是前端控制器DispatcherServlet和頁面控制器Controller兩部分共通組成了控制器。DispatcherServlet是整個框架的核心入口類。
5: ViewResolver將把邏輯檢視名(AD_HOME_PAGE)解析為具體的View,通過這種策略模式,很容易更換其他檢視技術。
6:View——>渲染,View會根據傳進來的Model模型資料進行渲染,此處的Model實際是一個Map資料結構,因此很容易支援其他檢視技術;
7 :返回控制權給DispatcherServlet,由DispatcherServlet返回響應給使用者,到此一個流程結束。

其他的細節問題:
1 如果在攔截請求中,想攔截提交引數中包含”type=test”字串,可以在@RequestMapping註解裡面加上params=”type=test”。
2 從前臺傳入攔截的方法裡少量引數,直接在方法的形參裡面宣告這些引數就 可以,但必須名字和傳過來的引數一樣。如果前臺有很多個引數傳入,那麼可以寫一個物件,屬性包含這些引數,而且直接在方法中宣告這個物件,SpringMvc就自動會把屬性賦值到這個物件裡面。
3 SpringMvc怎麼和AJAX相互呼叫
通過Jackson框架就可以把Java裡面的物件直接轉化成Js可以識別的Json物件
具體步驟如下
1)加入Jackson.jar
2)在配置檔案中配置json的對映
3)在接受Ajax方法裡面可以直接返回Object,List等,但方法前面要加上@ResponseBody註解