Spring MVC溫故而知新 – 從零開始

Spring MVC簡介

Spring MVC是一款基於MVC架構模式的輕量級Web框架,目的是將Web開發模塊化,對總體架構進行解耦。html

Spring MVC有一下優勢:前端

做爲Spring框架的一部分,擁有Spring的優勢(IOC,AOP等)java

支持靈活的URL到頁面控制器的映射web

提供靈活的數據驗證、格式化、數據綁定機制spring

支持RESTful風格spring-mvc

Spring MVC請求流程

Spring MVC框架的總體請求流程以下:架構

 

上圖中涉及到Spring MVC的幾個功能組件:mvc

前端控制器(DispatcherServlet):接收用戶請求並返回請求結果。它的做用至關於一個轉發器或中央處理器,控制整個執行流程,對各逐漸進行調度下降組件之間的耦合。app

處理器映射器(HandlerMapping):根據用戶請求的URL,經過註解或者XML配置,查找相應的處理器Handler框架

處理器適配(HandlerAdapter):根據映射器查找出的Handler,完成調用處理器中的方法

處理器(Handler):請求處理的具體邏輯,返回數據和視圖信息

視圖解析器(View Resolver):解析具體視圖,經過ModelAndView對象中的View信息,將邏輯視圖名解析成真正的視圖View

 請求流程具體步驟詳解:

1:用戶發起請求,請求會被前端控制器(DispatcherServlet)攔截

2:前端控制器(DispatcherServlet)請求處理器映射器(HandlerMapping)查找Handler

3:處理器映射器(HandlerMapping)根據配置找到相應Handler(能夠更具註解或者XML配置),可能包含多個Interceptor攔截器,返回給前端控制器

4:前端控制器(DispatcherServlet)請求處理器適配器(HandlerAdapter)去執行相應的Handler

5:適配器交由對應Handler處理器執行

6:  Handler處理器執行完成後返回ModelAndView對象給處理器適配器

7:處理器適配器接受Handler處理器的返回結果,並將該結果返回給前端控制器(DispatcherServlet)

8:前端控制器(DispatcherServlet)接收處理器適配器返回的數據和視圖信息,請求視圖解析器,解析對應的視圖

9:視圖解析器根據View信息匹配的相應的視圖結果,反回給前端控制器

10:前端控制器接收具體視圖,進行視圖渲染,將Model數據填充到View視圖中,生成最終視圖

11:前端控制器向用戶返回結果

從零開始搭建demo

  建立工程:

Eclipse下新建一個動態Web項目

工程默認目錄結構:

添加jar包依賴

WebContent > WEB-INF > lib 文件夾下導入相應的jar包,其中核心的jar包是spring-webmvc-5.0.0.RELEASE.jar,其餘是幾個主要是spring用於管理上下文和beande 包、jstl標籤庫和一個用於打印日誌的log包:

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

 前端控制器至關於Spring MVC的專有servlet,用於攔截全部符合條件的請求,交由框架作後續處理

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
        id="WebApp_ID" 
        version="3.1">
        
  <!-- 配置前端控制器-DispatchServlet  -->
  <servlet>
  <servlet-name>springMvcNext</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

  <!-- contextConfigLocation不是必須的, 若是不配置contextConfigLocation, springmvc的配置文件默認在:WEB-INF/servlet的name+"-servlet.xml" -->
  <init-param>
          <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
  </init-param>
  </servlet>
  
  <servlet-mapping>
  <servlet-name>springMvcNext</servlet-name>
  <url-pattern>/</url-pattern> <!--根據url-pattern設定的規則攔截用戶發來的請求 此處攔截全部請求,包括靜態資源 ->
  </servlet-mapping>
 
</web-app>

其中<servlet-mapping>標籤中定義url匹配規則爲符合*.action的形式,對應的servlet名爲springMvcNext,而<servlet>配置的控制器爲org.springframework.web.servlet.DispatchServlet,該控制器爲當前SpringMVC項目的前端控制器,<init-param>標籤爲當前控制器依賴的參數,兩個參數分別表明上下文參數和參數加載路徑。

關於classpath:表明web項目編譯後編譯後的輸出路徑

配置spring MVC配置

在java源代碼更目錄下添加applicationContext.xml文件

具體內容:

<?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.xsd
    http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.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.xsd">

    <!-- 包掃描器  標籤將用於激活Spring MVC註釋掃描功能,容許使用@Controller和@RequestMapping等註釋。-->
    <context:component-scan base-package="com.sl.controller" />
    
    <!-- 註解驅動 -->
    <mvc:annotation-driven />
    
    <!-- 配置視圖解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"  id="internalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/view/" />
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

  添加控制器Controller與視圖View

  

Src目錄下添加包com.sl.controller,添加控制器代碼以下:

package com.sl.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class HelloWorldController {
    
    @RequestMapping("/index")  //處理URL路徑中以/index開頭的全部請求: 包括 /index/* 和 /index.html
    public ModelAndView helloWorld() {

        String message = "Hello Spring MVC";
        return new ModelAndView("index", "message", message);
    }
}

在WEB-INF/view中添加視圖文件index.jsp

<html>
<head>
    <title>Spring MVC </title>
</head>
<body>
    ${message}
</body>
</html>

運行結果:

相關文章
相關標籤/搜索