Spring MVC入門第1天--框架說明與快速入門

文檔版本 開發工具 測試平臺 工程名字 日期 作者 備註
V1.0 2016.06.29 lutianfei none


  • 內容安排:
    • 第一天:springmvc的基礎知識
      • 什麼是springmvc?
      • springmvc框架原理(掌握)
        • 前端控制器、處理器映射器、處理器適配器、視圖解析器
      • springmvc入門程序
        • 目的:對前端控制器、處理器映射器、處理器適配器、視圖解析器學習
        • 非註解的處理器映射器、處理器適配器
        • 註解的處理器映射器、處理器適配器(掌握)
      • springmvc和mybatis整合(掌握)
      • springmvc註解開發:(掌握)
        • 常用的註解學習
        • 參數綁定(簡單類型、pojo、集合類型(明天講))
        • 自定義參數綁定(掌握)
      • springmvc和struts2區別
    • 第二天:springmvc的高級應用
      • 參數綁定(集合類型)
      • 數據回顯
      • 上傳圖片
      • json數據交互
      • RESTful支持
      • 攔截器

springmvc框架

  • springmvc是spring框架的一個模塊,springmvc和spring無需通過中間整合層進行整合。
  • springmvc是一個基於mvc的web框架。


springmvc業務流程框架

  • 第一步:用戶發送請求至DispatcherServlet前端控制器
  • 第二步:DispatcherServlet前端控制器收到請求調用HandlerMapping處理器映射器查找Handler處理器
    • 可以根據xml配置、註解進行查找
  • 第三步:HandlerMapping處理器映射器根據請求url找到具體的處理器,生成處理器對象處理器攔截器(即HandlerExecutionChain執行鏈)並返回給DispatcherServlet前端控制器
  • 第四步:DispatcherServlet前端控制器通過HandlerAdapter處理器適配器調用Handler處理器
  • 第五步:HandlerAdapter處理器適配器去執行Handler處理器(Controller,也叫後端控制器)。
  • 第六步:Handler處理器執行完成給HandlerAdapter處理器適配器返回ModelAndView
  • 第七步:HandlerAdapter處理器適配器Handler處理器執行結果ModelAndView返回給DispatcherServlet前端控制器
    • ModelAndView是springmvc框架的一個底層對象,包括 Model和view
  • 第八步:DispatcherServlet前端控制器ModelAndView傳給ViewReslover視圖解析器
    • 根據邏輯視圖名解析成真正的視圖(jsp)
  • 第九步:ViewReslover視圖解析器DispatcherServlet前端控制器返回View
  • 第十步:DispatcherServlet前端控制器View進行渲染視圖(即將模型數據填充至視圖中)。
    • 視圖渲染將模型數據(在ModelAndView對象中)填充到request域
  • 第十一步:DispatcherServlet前端控制器向用戶響應結果


springmvc框架組件說明

  • 1、前端控制器DispatcherServlet不需要程序員開發

    • 用戶請求到達前端控制器,它就相當於mvc模式中的c,dispatcherServlet是整個流程控制的中心,由它調用其它組件處理用戶的請求,dispatcherServlet的存在降低了組件之間的耦合性。
  • 2、處理器映射器HandlerMapping(不需要程序員開發)

    • HandlerMapping負責根據用戶請求找到Handler即處理器,springmvc提供了不同的映射器實現不同的映射方式,例如:配置文件方式,實現接口方式,註解方式等。
  • 3、處理器Handler(需要程序員開發)

    • Handler是繼DispatcherServlet前端控制器的後端控制器,在DispatcherServlet的控制下Handler對具體的用戶請求進行處理。需要程序員根據業務需求開發Handler。
    • 注意:編寫Handler時按照HandlerAdapter的要求去做,這樣適配器纔可以去正確執行Handler
  • 4、處理器適配器HandlerAdapter

    • 作用:按照特定規則(HandlerAdapter要求的規則)去執行Handler
    • 通過HandlerAdapter對處理器進行執行,這是適配器模式的應用,通過擴展適配器可以對更多類型的處理器進行執行。
  • 5、視圖解析器View resolver(不需要程序員開發)

    • 作用:進行視圖解析,根據邏輯視圖名解析成真正的視圖(view)
    • View Resolver負責將處理結果生成View視圖,View Resolver首先根據邏輯視圖名解析成物理視圖名具體的頁面地址,再生成View視圖對象,最後對View進行渲染將處理結果通過頁面展示給用戶。
  • 6、視圖View(需要程序員開發jsp)

    • View是一個接口,實現類支持不同的View類型(jsp、freemarker、pdf…)
    • springmvc框架提供了很多的View視圖類型,包括:jstlView、freemarkerView、pdfView等。
    • 一般情況下需要通過頁面標籤頁面模版技術將模型數據通過頁面展示給用戶,需要由程序員根據業務需求開發具體的頁面。


Spring MVC入門程序

  • 需求: springmvc和mybaits使用一個案例(商品訂單管理)。

  • 環境準備

    • 數據庫環境:mysql5.1
    • java環境:
    • jdk1.7.0_72
    • eclipse indigo
    • springmvc版本:spring3.2
    • 需要spring3.2所有jar(一定包括spring-webmvc-3.2.0.RELEASE.jar)

配置前端控制器

  • 在web.xml中配置前端控制器。

配置處理器適配器

  • 在classpath下的springmvc.xml中配置處理器適配器
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.2.xsd 
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">

    <!-- 處理器映射器 -->
    <!-- 根據bean的name進行查找Handler 將action的url配置在bean的name中 -->
    <bean
        class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />

通過查看原代碼:



  • 此適配器能執行實現 Controller接口的Handler並返回ModelAndView類型數據。


開發Handler

  • 需要實現 controller接口,才能由org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter適配器執行。
public class ItemsController1 implements Controller {

    @Override
    public ModelAndView handleRequest(HttpServletRequest request,
            HttpServletResponse response) throws Exception {

        //調用service查找 數據庫,查詢商品列表,這裏使用靜態數據模擬
        List<Items> itemsList = new ArrayList<Items>();
        //向list中填充靜態數據

        Items items_1 = new Items();
        items_1.setName("聯想筆記本");
        items_1.setPrice(6000f);
        items_1.setDetail("ThinkPad T430 聯想筆記本電腦!");

        Items items_2 = new Items();
        items_2.setName("蘋果手機");
        items_2.setPrice(5000f);
        items_2.setDetail("iphone6蘋果手機!");

        itemsList.add(items_1);
        itemsList.add(items_2);

        //返回ModelAndView
        ModelAndView modelAndView =  new ModelAndView();
        //相當 於request的setAttribut,在jsp頁面中通過itemsList取數據
        modelAndView.addObject("itemsList", itemsList);

        //指定視圖
        modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");

        return modelAndView;
    }

}


視圖編寫

  • 添加itemsList.jsp頁面

配置Handler

  • 將編寫Handler在spring容器加載(springmvc.xml)。

配置處理器映射器

  • 在classpath下的springmvc.xml中配置處理器映射器

配置視圖解析器

  • 需要配置解析jsp的視圖解析器。

部署調試

  • 訪問地址:http://localhost/springmvcfirst1208/queryItems.action

  • 處理器映射器根據url找不到Handler,報下邊的錯誤。說明url訪問地址錯誤。

  • 處理器映射器根據url找到了Handler,轉發的jsp頁面找到,報下邊的錯誤,說明jsp頁面地址錯誤了。

  • 修改ItemsController1.java文件中的modelAndView指定的視圖地址即可。


非註解的處理器映射器 和 適配器

非註解的處理器映射器

  • 上面入門所用的處理器映射器:org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
  • 問題:url配置是在bean中完成的

  • url和handler集中配置的映射器(簡單映射器):org.springframework.web.servlet.handler.SimpleUrlHandlerMapping

  • 結論:多個映射器可以並存,前端控制器判斷url能讓哪些映射器映射,就讓正確的映射器處理。

  • handler要加入id屬性
<!-- 配置Handler -->
<bean id="itemsController1" name="/queryItems_test.action" class="cn.itcast.ssm.controller.ItemsController1" />


非註解的處理器適配器

  • 入門所使用適配器:org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
  • 要求: 編寫的Handler實現 Controller接口

  • 另一種適配器:org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter

  • 添加適配器聲明 :
<!-- 另一個非註解的適配器 -->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
  • 要求編寫的Handler實現 HttpRequestHandler接口

  • 添加handle屬性
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <prop key="/queryItems1.action"> itemsController1</prop>
            <prop key="/queryItems2.action"> itemsController2</prop>
        </props>

    </property>
</bean>
  • 使用此方法可以通過修改response,設置響應的數據格式,比如響應json數據

response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json串");*/


springmvc的默認加載

  • 在 DispatcherSerlvet.properties 中

  • 前端控制器從上邊的文件中加載處理映射器、適配器、視圖解析器等組件,如果不在springmvc.xml中配置,使用默認加載的。



註解的處理器映射器和適配器

  • 在spring**3.1之前使用的註解映射器:org.springframework.web.servlet.mvc.annotation.**DefaultAnnotationHandlerMapping

  • 在spring3.1之後使用的註解映射器 : org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping

  • 在spring**3.1之前使用的註解適配器 : org.springframework.web.servlet.mvc.annotation.**AnnotationMethodHandlerAdapter

  • 在spring3.1之後使用的註解適配器 : org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter


配置註解映射器和適配器

  • 開發中使用 mvc:annotation-driven代替上邊註解映射器和註解適配器配置
    • mvc:annotation-driven默認加載很多的參數綁定方法,比如json轉換解析器就默認加載了,如果使用mvc:annotation-driven不用配置上邊的RequestMappingHandlerMappingRequestMappingHandlerAdapter
//springmvc.xml
<!-- <mvc:annotation-driven></mvc:annotation-driven> -->


開發註解Handler

  • 註解的映射器註解的適配器必須配對使用
  • @RequestMapping(“/queryItems”):這裏映射可以不加後綴.action但是輸入網址時必須加。
//使用Controller註解 標識下面的類是一個控制器
@Controller
public class ItemsController3 {
    //商品查詢列表
    //@RequestMapping實現 對queryItems方法和url進行映射,一個方法對應一個url
    //一般建議將url和方法寫成一樣
    @RequestMapping("/queryItems")
    public ModelAndView queryItems()throws Exception{

        //調用service查找 數據庫,查詢商品列表,這裏使用靜態數據模擬
        List<Items> itemsList = new ArrayList<Items>();
        //向list中填充靜態數據

        Items items_1 = new Items();
        items_1.setName("聯想筆記本");
        items_1.setPrice(6000f);
        items_1.setDetail("ThinkPad T430 聯想筆記本電腦!");

        Items items_2 = new Items();
        items_2.setName("蘋果手機");
        items_2.setPrice(5000f);
        items_2.setDetail("iphone6蘋果手機!");

        itemsList.add(items_1);
        itemsList.add(items_2);

        //返回ModelAndView
        ModelAndView modelAndView =  new ModelAndView();
        //相當 於request的setAttribut,在jsp頁面中通過itemsList取數據
        modelAndView.addObject("itemsList", itemsList);

        //指定視圖
        modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");


        return modelAndView;

    }
}


在spring容器中加載Handler

  • 對於註解的Handler可以單個配置,但實際開發中建議使用組件掃描
    • 組件掃描可以掃描controller、service、…
    <!--
    Handler的單個配置
     -->
    <!-- <bean class="cn.itcast.ssm.controller.ItemsController3" /> -->


    <!--
        組件掃描:這裏掃描的是controller包
     -->
    <context:component-scan base-package="cn.itcast.ssm.controller"></context:component-scan>

視圖解析器配置前綴和後綴

<!-- 視圖解析器
    解析jsp解析,默認使用jstl標籤,classpath下的得有jstl的包
     -->
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 配置jsp路徑的前綴 -->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!-- 配置jsp路徑的後綴 -->
        <property name="suffix" value=".jsp"/>
    </bean>
  • 此時程序中不用指定前綴和後綴,上述ItemsController3.java最後可修改如下:
//指定視圖
//下邊的路徑,如果在視圖解析器中配置jsp路徑的前綴和jsp路徑的後綴,修改爲
//modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
//上邊的路徑配置可以不在程序中指定jsp路徑的前綴和jsp路徑的後綴
modelAndView.setViewName("items/itemsList");



源碼分析(瞭解)

  • 通過前端控制器源碼分析springmvc的執行過程。

  • 第一步:前端控制器接收請求

    • web.xmlorg.springframework.web.servlet.DispatcherServlet轉到DispatcherServlet
    • 找到方法:doDispatch


  • 第二步:前端控制器調用處理器映射器查找 Handler

    • doDispatch方法的第896行找到getHandler()函數並進入HandlerExcecutionChain
    • 繼續進入下一層getHandler函數,找到最終的HandlerExcecutionChain定義
  • 第三步:調用處理器適配器執行Handler,得到執行結果ModelAndView

    • doDispatch函數第925行左右
  • 第四步:視圖渲染,將model數據填充到request域。

    • DispatcherServlet.class992行找到render函數,並點入
    • 視圖解析,得到view:
    • 調用view的渲染方法,將model數據填充到request域
    • 渲染方法:


入門程序小結

  • 通過入門程序理解springmvc前端控制器、處理器映射器、處理器適配器、視圖解析器用法。

  • 前端控制器配置:

    • 第一種:*.action,訪問以.action結尾 由DispatcherServlet進行解析
    • 第二種:/,所以訪問的地址都由DispatcherServlet進行解析,對於靜態文件的解析需要配置不讓DispatcherServlet進行解析,使用此種方式可以實現 RESTful風格的url
  • 處理器映射器:

    • 非註解處理器映射器(瞭解)
    • 註解的處理器映射器(掌握)
    • 對標記@Controller類中標識有@RequestMapping的方法進行映射。在@RequestMapping裏邊定義映射的url。使用註解的映射器不用在xml中配置url和Handler的映射關係。
  • 處理器適配器:

    • 非註解處理器適配器(瞭解)
    • 註解的處理器適配器(掌握)
    • 註解處理器適配器和註解的處理器映射器配對使用。理解爲不能使用非註解映射器進行映射。
    • 實際開發使用:mvc:annotation-driven
發佈了91 篇原創文章 · 獲贊 177 · 訪問量 43萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章