1. 程式人生 > >Spring MVC溫故而知新 – 從零開始

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

resolve 它的 完成後 web框架 攔截器 加載 class lns 目錄

Spring MVC簡介

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

Spring MVC有一下優點:

作為Spring框架的一部分,擁有Spring的優點(IOC,AOP等)

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

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

支持RESTful風格

Spring MVC請求流程

Spring MVC框架的整體請求流程如下:

技術分享圖片

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

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

處理器映射器(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>

運行結果:

技術分享圖片

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