從SpringBoot到SpringMVC


概述

用久了SpringBoot,深受其約定大於配置的便利性 「毒害」 以後,我想回歸到SpringMVC時代,看看SpringMVC開發模式中用戶是如何參與的。本文就來體驗一下SpringMVC時代開發的流程。html

注: 本文首發於 My 公衆號 CodeSheep ,可 長按掃描 下面的 當心心 來訂閱 ↓ ↓ ↓前端

CodeSheep · 程序羊


SpringMVC架構模式

SpringMVC請求處理流程

一個典型的SpringMVC請求流程如圖所示,詳細分爲12個步驟:java

  1. 用戶發起請求,由前端控制器DispatcherServlet處理
  2. 前端控制器經過處理器映射器查找hander,能夠根據XML或者註解去找
  3. 處理器映射器返回執行鏈
  4. 前端控制器請求處理器適配器來執行hander
  5. 處理器適配器來執行handler
  6. 處理業務完成後,會給處理器適配器返回ModeAndView對象,其中有視圖名稱,模型數據
  7. 處理器適配器將視圖名稱和模型數據返回到前端控制器
  8. 前端控制器經過視圖解析器來對視圖進行解析
  9. 視圖解析器返回真正的視圖給前端控制器
  10. 前端控制器經過返回的視圖和數據進行渲染
  11. 返回渲染完成的視圖
  12. 將最終的視圖返回給用戶,產生響應

整個過程清晰明瞭,下面咱們將結合實際實驗來理解這整個過程。web


SpringMVC項目搭建

實驗環境以下:spring

  • IntelliJ IDEA 2018.1 (Ultimate Edition)
  • SpringMVC 4.3.9.RELEASE
  • Maven 3.3.9

這裏我是用IDEA來搭建的基於Maven的SpringMVC項目,搭建過程再也不贅述,各類點擊而且下一步,最終建立好的項目架構以下:編程

基於Maven的SpringMVC項目


添加前端控制器配置

使用了SpringMVC,則全部的請求都應該交由SpingMVC來管理,即要將全部符合條件的請求攔截到SpringMVC的專有Servlet上。c#

爲此咱們須要在 web.xml 中添加SpringMVC的前端控制器DispatcherServlet:瀏覽器

<!--springmvc前端控制器-->
    <servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:mvc-dispatcher.xml</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>
複製代碼

該配置說明全部符合.action的url,都交由mvc-dispatcher這個Servlet來進行處理bash


編寫SpringMVC核心XML配置文件

從上一步的配置能夠看到,咱們定義的mvc-dispatcher Servlet依賴於配置文件 mvc-dispatcher.xml,在本步驟中咱們須要在其中添加三個方面的配置服務器

  • 0x01. 添加處理器映射器
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
複製代碼

SpringMVC的處理器映射器有多種,這裏的使用的BeanNameUrlHandlerMapping其映射規則是將bean的name做爲url進行處理

  • 0x02. 添加處理器適配器
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
複製代碼

SpringMVC的處理器適配器也有多種,這裏的使用的SimpleControllerHandlerAdapter是Controller實現類的適配器類,其本質是執行Controller中的handleRequest方法。

  • 0x03. 添加試圖解析器
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" />
複製代碼

這裏配置了InternalResourceViewResolver視圖解析器後,其會根據controller方法執行以後返回的ModelAndView中的視圖的具體位置,來加載對應的界面並綁定數據


編寫控制器

這裏模擬的是一個打印學生名單的Service,咱們編寫的控制器須要將查詢到的學生名單數據經過ModelAndView渲染到指定的JSP頁面中

public class TestController implements Controller {

    private StudentService studentService = new StudentService();

    @Override
    public ModelAndView handleRequest( HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        List<Student> studentList = studentService.queryStudents();
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("studentList",studentList);
        modelAndView.setViewName("/WEB-INF/views/studentList.jsp");
        return modelAndView;
    }
}

class StudentService {
    public List<Student> queryStudents() {
        List<Student> studentList = new ArrayList<Student>();

        Student hansonwang = new Student();
        hansonwang.setName("hansonwang99");
        hansonwang.setID("123456");

        Student codesheep = new Student();
        codesheep.setName("codesheep");
        codesheep.setID("654321");

        studentList.add(hansonwang);
        studentList.add(codesheep);

        return studentList;
    }
}
複製代碼

編寫視圖文件

這裏的視圖文件是一個jsp文件,路徑爲:/WEB-INF/views/studentList.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<html>
<head>
    <title>學生名單</title>
</head>
<body>
    <h3>學生列表</h3>
    <table width="300px;" border=1>
        <tr>
            <td>姓名</td>
            <td>學號</td>
        </tr>
        <c:forEach items="${studentList}" var="student" >
            <tr>
                <td>${student.name}</td>
                <td>${student.ID}</td>
            </tr>
        </c:forEach>
    </table>
</body>
</html>
複製代碼

結合本步驟和上一步驟,視圖和控制器都已編寫完成,因爲咱們以前配置的處理器映射器爲:BeanNameUrlHandlerMapping,所以接下來咱們還須要在mvc-dispatcher.xml文件中配置一個可被url映射的controller的bean,供處理器映射器BeanNameUrlHandlerMapping查找:

<bean name="/test.action" class="cn.codesheep.controller.TestController" />
複製代碼

實驗測試

啓動Tomcat服務器,而後瀏覽器輸入:

http://localhost:8080/test.action
複製代碼

實驗結果

數據渲染OK。

備註:固然本文所使用的全是非註解的配置方法,即須要在XML中進行配置而且須要遵循各類實現原則。而更加通用、主流的基於註解的配置方法將在後續文章中詳述。

呼,長舒一口氣,這麼個小Demo用SpringMVC完成的話,各類XML配置了半天,真麻煩啊,算了,仍是回SpringBoot好了!


後記

做者更多的SpringBt實踐文章在此:


若是有興趣,也能夠抽點時間看看做者一些關於容器化、微服務化方面的文章:


CodeSheep · 程序羊
相關文章
相關標籤/搜索