天天看點

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

文檔版本 開發工具 測試平台 工程名字 日期 作者 備注
V1.0 2016.06.29 lutianfei none
    • springmvc架構
      • springmvc業務流程架構
        • springmvc架構元件說明
      • Spring MVC入門程式
        • 配置前端控制器
        • 配置處理器擴充卡
        • 開發Handler
        • 視圖編寫
        • 配置Handler
        • 配置處理器映射器
        • 配置視圖解析器
        • 部署調試
      • 非注解的處理器映射器 和 擴充卡
        • 非注解的處理器映射器
        • 非注解的處理器擴充卡
        • springmvc的預設加載
      • 注解的處理器映射器和擴充卡
        • 配置注解映射器和擴充卡
        • 開發注解Handler
        • 在spring容器中加載Handler
        • 視圖解析器配置字首和字尾
      • 源碼分析了解
      • 入門程式小結
  • 内容安排:
    • 第一天:springmvc的基礎知識
      • 什麼是springmvc?
      • springmvc架構原理(掌握)
        • 前端控制器、處理器映射器、處理器擴充卡、視圖解析器
      • springmvc入門程式
        • 目的:對前端控制器、處理器映射器、處理器擴充卡、視圖解析器學習
        • 非注解的處理器映射器、處理器擴充卡
        • 注解的處理器映射器、處理器擴充卡(掌握)
      • springmvc和mybatis整合(掌握)
      • springmvc注解開發:(掌握)
        • 常用的注解學習
        • 參數綁定(簡單類型、pojo、集合類型(明天講))
        • 自定義參數綁定(掌握)
      • springmvc和struts2差別
    • 第二天:springmvc的進階應用
      • 參數綁定(集合類型)
      • 資料回顯
      • 上傳圖檔
      • json資料互動
      • RESTful支援
      • 攔截器

springmvc架構

  • springmvc是spring架構的一個子產品,springmvc和spring無需通過中間整合層進行整合。
  • springmvc是一個基于mvc的web架構。
Spring MVC入門第1天--架構說明與快速入門

springmvc業務流程架構

Spring MVC入門第1天--架構說明與快速入門
  • 第一步:使用者發送請求至

    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)
      Spring MVC入門第1天--架構說明與快速入門

配置前端控制器

  • 在web.xml中配置前端控制器。
    Spring MVC入門第1天--架構說明與快速入門

配置處理器擴充卡

  • 在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" />
           
Spring MVC入門第1天--架構說明與快速入門

通過檢視原代碼:

Spring MVC入門第1天--架構說明與快速入門
  • 此擴充卡能執行實作 Controller接口的Handler并傳回ModelAndView類型資料。
Spring MVC入門第1天--架構說明與快速入門

開發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(f);
        items_1.setDetail("ThinkPad T430 聯想筆記本電腦!");

        Items items_2 = new Items();
        items_2.setName("蘋果手機");
        items_2.setPrice(f);
        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頁面
    Spring MVC入門第1天--架構說明與快速入門

配置Handler

  • 将編寫Handler在spring容器加載(springmvc.xml)。
    Spring MVC入門第1天--架構說明與快速入門

配置處理器映射器

  • 在classpath下的springmvc.xml中配置處理器映射器
    Spring MVC入門第1天--架構說明與快速入門

配置視圖解析器

  • 需要配置解析jsp的視圖解析器。
    Spring MVC入門第1天--架構說明與快速入門

部署調試

  • 通路位址:http://localhost/springmvcfirst1208/queryItems.action
  • 處理器映射器根據url找不到Handler,報下邊的錯誤。說明url通路位址錯誤。
    Spring MVC入門第1天--架構說明與快速入門
  • 處理器映射器根據url找到了Handler,轉發的jsp頁面找到,報下邊的錯誤,說明jsp頁面位址錯誤了。
  • 修改

    ItemsController1.java

    檔案中的modelAndView指定的視圖位址即可。
    Spring MVC入門第1天--架構說明與快速入門

非注解的處理器映射器 和 擴充卡

非注解的處理器映射器

  • 上面入門所用的處理器映射器:

    org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping

  • 問題:url配置是在bean中完成的
  • url和handler集中配置的映射器(簡單映射器):

    org.springframework.web.servlet.handler.SimpleUrlHandlerMapping

    Spring MVC入門第1天--架構說明與快速入門
  • 結論:多個映射器可以并存,前端控制器判斷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接口。
Spring MVC入門第1天--架構說明與快速入門
  • 添加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 中
    Spring MVC入門第1天--架構說明與快速入門
  • 前端控制器從上邊的檔案中加載處理映射器、擴充卡、視圖解析器等元件,如果不在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。

配置注解映射器和擴充卡

Spring MVC入門第1天--架構說明與快速入門
  • 開發中使用

    mvc:annotation-driven

    代替上邊注解映射器和注解擴充卡配置
    • mvc:annotation-driven

      預設加載很多的參數綁定方法,比如json轉換解析器就預設加載了,如果使用

      mvc:annotation-driven

      不用配置上邊的RequestMappingHandlerMapping和RequestMappingHandlerAdapter
//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(f);
        items_1.setDetail("ThinkPad T430 聯想筆記本電腦!");

        Items items_2 = new Items();
        items_2.setName("蘋果手機");
        items_2.setPrice(f);
        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>
           
  • 部署調試
    • 通路:http://localhost/springmvcfirst1208/queryItems.action

視圖解析器配置字首和字尾

<!-- 視圖解析器
    解析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.xml

      org.springframework.web.servlet.DispatcherServlet

      轉到

      DispatcherServlet

    • 找到方法:

      doDispatch

Spring MVC入門第1天--架構說明與快速入門
  • 第二步:前端控制器調用處理器映射器查找 Handler
    • doDispatch

      方法的第896行找到getHandler()函數并進入

      HandlerExcecutionChain

      Spring MVC入門第1天--架構說明與快速入門
    • 繼續進入下一層

      getHandler

      函數,找到最終的

      HandlerExcecutionChain

      定義
      Spring MVC入門第1天--架構說明與快速入門
  • 第三步:調用處理器擴充卡執行Handler,得到執行結果ModelAndView
    • doDispatch

      函數第925行左右
      Spring MVC入門第1天--架構說明與快速入門
  • 第四步:視圖渲染,将model資料填充到request域。
    • DispatcherServlet.class

      992行找到

      render

      函數,并點入
      Spring MVC入門第1天--架構說明與快速入門
    • 視圖解析,得到view:
      Spring MVC入門第1天--架構說明與快速入門
    • 調用view的渲染方法,将model資料填充到request域
      Spring MVC入門第1天--架構說明與快速入門
    • 渲染方法:
      Spring MVC入門第1天--架構說明與快速入門

入門程式小結

  • 通過入門程式了解springmvc前端控制器、處理器映射器、處理器擴充卡、視圖解析器用法。
  • 前端控制器配置:
    • 第一種:

      *.action

      ,通路以.action結尾 由DispatcherServlet進行解析
    • 第二種:

      /

      ,是以通路的位址都由DispatcherServlet進行解析,對于靜态檔案的解析需要配置不讓DispatcherServlet進行解析,使用此種方式可以實作 RESTful風格的url
  • 處理器映射器:
    • 非注解處理器映射器(了解)
    • 注解的處理器映射器(掌握)
    • 對标記

      @Controller類

      中辨別有

      @RequestMapping

      的方法進行映射。在

      @RequestMapping

      裡邊定義映射的url。使用注解的映射器不用在xml中配置url和Handler的映射關系。
  • 處理器擴充卡:
    • 非注解處理器擴充卡(了解)
    • 注解的處理器擴充卡(掌握)
    • 注解處理器擴充卡和注解的處理器映射器是配對使用。了解為不能使用非注解映射器進行映射。
    • 實際開發使用:

      mvc:annotation-driven