1. 程式人生 > >springmvc$基本入門&三大元件&執行流程

springmvc$基本入門&三大元件&執行流程

SpringMVC介紹

Spring web mvc和Struts2都屬於表現層的框架,它是Spring框架的一部分,我們可以從Spring的整體結構中看得出來,如下圖:
![springmvc.png][1]
Springmvc處理流程
![springmvc的處理流程.png][2]

SpringMVC的架構

![SpringMVC架構流程.png][3]

架構流程
 - 1、使用者傳送請求至前端控制器DispatcherServlet
 - 2、DispatcherServlet收到請求呼叫HandlerMapping處理器對映器。
 - 3、處理器對映器根據請求url找到具體的處理器,生成處理器物件及處理器攔截器(如果有則生成)一併返回給DispatcherServlet。
 - 4、DispatcherServlet通過HandlerAdapter處理器介面卡呼叫處理器
 - 5、執行處理器(Controller,也叫後端控制器)。
 - 6、Controller執行完成返回ModelAndView
 - 7、HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet
 - 8、DispatcherServlet將ModelAndView傳給ViewReslover檢視解析器
 - 9、ViewReslover解析後返回具體View
 - 10、DispatcherServlet對View進行渲染檢視(即將模型資料填充至檢視中)。
 - 11、DispatcherServlet響應使用者

元件說明

以下元件通常使用框架提供實現:
- DispatcherServlet:前端控制器
使用者請求到達前端控制器,它就相當於mvc模式中的c,dispatcherServlet是整個流程控制的中心,由它呼叫其它元件處理使用者的請求,dispatcherServlet的存在降低了元件之間的耦合性。
- HandlerMapping:處理器對映器
HandlerMapping負責根據使用者請求url找到Handler即處理器,springmvc提供了不同的對映器實現不同的對映方式,例如:配置檔案方式,實現介面方式,註解方式等。
- Handler:處理器
Handler 是繼DispatcherServlet前端控制器的後端控制器,在DispatcherServlet的控制下Handler對具體的使用者請求進行處理。
由於Handler涉及到具體的使用者業務請求,所以一般情況需要程式設計師根據業務需求開發Handler。

- HandlAdapter:處理器介面卡
通過HandlerAdapter對處理器進行執行,這是介面卡模式的應用,通過擴充套件介面卡可以對更多型別的處理器進行執行。
比方:許多不同的介面卡,最終都可以使用usb介面連線
       

- ViewResolver:檢視解析器
View Resolver負責將處理結果生成View檢視,View Resolver首先根據邏輯檢視名解析成物理檢視名即具體的頁面地址,再生成View檢視物件,最後對View進行渲染將處理結果通過頁面展示給使用者。

- View:檢視
springmvc框架提供了很多的View檢視型別的支援,包括:jstlView、freemarkerView、pdfView等。我們最常用的檢視就是jsp。
一般情況下需要通過頁面標籤或頁面模版技術將模型資料通過頁面展示給使用者,需要由程式設計師根據業務需求開發具體的頁面。

說明:在springmvc的各個元件中,處理器對映器、處理器介面卡、檢視解析器稱為springmvc的三大元件。
需要使用者開發的元件有handler、view

預設載入的元件

我們沒有做任何配置,就可以使用這些元件
因為框架已經預設載入這些元件了,配置檔案位置如下圖:
![預設載入的元件.png][4]

元件掃描器
使用元件掃描器省去在spring容器配置每個Controller類的繁瑣。
使用<context:component-scan>自動掃描標記@Controller的控制器類,
在springmvc.xml配置檔案中配置如下:
<!-- 配置controller掃描包,多個包之間用,分隔 -->
<context:component-scan base-package="cn.itcast.springmvc.controller" />

註解對映器和介面卡

註解式處理器對映器,對類中標記了@ResquestMapping的方法進行對映。根據@ResquestMapping定義的url匹配@ResquestMapping標記的方法,匹配成功返回HandlerMethod物件給前端控制器。
HandlerMethod物件中封裝url對應的方法Method

從spring3.1版本開始,廢除了DefaultAnnotationHandlerMapping的使用,推薦使用RequestMappingHandlerMapping完成註解式處理器對映。

在springmvc.xml配置檔案中配置如下:
<!-- 配置處理器對映器 -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
註解描述:
@RequestMapping:定義請求url到處理器功能方法的對映

配置處理器介面卡
註解式處理器介面卡,對標記@ResquestMapping的方法進行適配。

從spring3.1版本開始,廢除了AnnotationMethodHandlerAdapter的使用,推薦使用RequestMappingHandlerAdapter完成註解式處理器適配。

在springmvc.xml配置檔案中配置如下:
<!-- 配置處理器介面卡 -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />
註解驅動
直接配置處理器對映器和處理器介面卡比較麻煩,可以使用註解驅動來載入。
SpringMVC使用<mvc:annotation-driven>自動載入RequestMappingHandlerMapping和RequestMappingHandlerAdapter
可以在springmvc.xml配置檔案中使用<mvc:annotation-driven>替代註解處理器和介面卡的配置。
    <!-- 註解驅動 -->
    <mvc:annotation-driven />

檢視解析器


檢視解析器使用SpringMVC框架預設的InternalResourceViewResolver,這個檢視解析器支援JSP檢視解析
在springmvc.xml配置檔案中配置如下:
    <!-- Example: prefix="/WEB-INF/jsp/", suffix=".jsp", viewname="test" ->
        "/WEB-INF/jsp/test.jsp" -->
    <!-- 配置檢視解析器 -->
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 配置邏輯檢視的字首 -->
        <property name="prefix" value="/WEB-INF/jsp/" />
        <!-- 配置邏輯檢視的字尾 -->
        <property name="suffix" value=".jsp" />
    </bean>
邏輯檢視名需要在controller中返回ModelAndView指定,比如邏輯檢視名為ItemList,則最終返回的jsp檢視地址:
“WEB-INF/jsp/itemList.jsp”

最終jsp實體地址:字首+邏輯檢視名+字尾

程式碼:
    // @RequestMapping:裡面放的是請求的url,和使用者請求的url進行匹配
    // action可以寫也可以不寫
    @RequestMapping("/itemList.action")
    public ModelAndView queryItemList() {
        // 建立頁面需要顯示的商品資料
        List<Item> list = new ArrayList<>();
        list.add(new Item(1, "1華為 榮耀8", 2399, new Date(), "質量好!1"));
        list.add(new Item(2, "2華為 榮耀8", 2399, new Date(), "質量好!2"));
        list.add(new Item(3, "3華為 榮耀8", 2399, new Date(), "質量好!3"));
        list.add(new Item(4, "4華為 榮耀8", 2399, new Date(), "質量好!4"));
        list.add(new Item(5, "5華為 榮耀8", 2399, new Date(), "質量好!5"));
        list.add(new Item(6, "6華為 榮耀8", 2399, new Date(), "質量好!6"));

        // 建立ModelAndView,用來存放資料和檢視
        ModelAndView modelAndView = new ModelAndView();
        // 設定資料到模型中
        modelAndView.addObject("itemList", list);
        // 設定檢視jsp,需要設定檢視的實體地址
        // modelAndView.setViewName("/WEB-INF/jsp/itemList.jsp");
        // 配置好檢視解析器字首和字尾,這裡只需要設定邏輯檢視就可以了。
        // 檢視解析器根據字首+邏輯檢視名+字尾拼接出來物理路徑
        modelAndView.setViewName("itemList");

        return modelAndView;
    }

springMVC使用

1.jar包:
![springmvc的jar包.png][5]

2.建立springmvc.xml
建立SpringMVC的核心配置檔案
SpringMVC本身就是Spring的子專案,對Spring相容性很好,不需要做很多配置。
這裡只配置一個Controller掃描就可以了,讓Spring對頁面控制層Controller進行管理。
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

    <!-- 配置controller掃描包 -->
    <context:component-scan base-package="cn.itcast.springmvc.controller" />

    </beans>


約束檔案:
![springMVC的約束檔案.png][6]

3.配置前端控制器
配置SpringMVC的前端控制器DispatcherServlet
在web.xml中

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">
    <display-name>springmvc-first</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>

    <!-- 配置SpringMVC前端控制器 -->
    <servlet>
        <servlet-name>springmvc-first</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 指定SpringMVC配置檔案 -->
        <!-- SpringMVC的配置檔案的預設路徑是/WEB-INF/${servlet-name}-servlet.xml -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>springmvc-first</servlet-name>
        <!-- 設定所有以action結尾的請求進入SpringMVC -->
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>
    </web-app>
4.建立商品pojo

5.建立ItemController
ItemController是一個普通的java類,不需要實現任何介面。
需要在類上新增@Controller註解,把Controller交由Spring管理
在方法上面新增@RequestMapping註解,裡面指定請求的url。其中“.action”可以加也可以不加。

@Controller
public class ItemController {

    // @RequestMapping:裡面放的是請求的url,和使用者請求的url進行匹配
    // action可以寫也可以不寫
    @RequestMapping("/itemList.action")
    public ModelAndView queryItemList() {
        // 建立頁面需要顯示的商品資料
        List<Item> list = new ArrayList<>();
        list.add(new Item(1, "1華為 榮耀8", 2399, new Date(), "質量好!1"));
        list.add(new Item(2, "2華為 榮耀8", 2399, new Date(), "質量好!2"));
        list.add(new Item(3, "3華為 榮耀8", 2399, new Date(), "質量好!3"));
        list.add(new Item(4, "4華為 榮耀8", 2399, new Date(), "質量好!4"));
        list.add(new Item(5, "5華為 榮耀8", 2399, new Date(), "質量好!5"));
        list.add(new Item(6, "6華為 榮耀8", 2399, new Date(), "質量好!6"));

        // 建立ModelAndView,用來存放資料和檢視
        ModelAndView modelAndView = new ModelAndView();
        // 設定資料到模型中
        modelAndView.addObject("list", list);
        // 設定檢視jsp,需要設定檢視的實體地址
        modelAndView.setViewName("/WEB-INF/jsp/itemList.jsp");

        return modelAndView;
    }
}