簡單易懂,看透SpringMVC原理


什么是Spring MVC

Spring MVC是Spring Framework的一部分,是基於Java實現MVC的輕量級Web框架。

官方文檔:https://docs.spring.io/spring-framework/docs/4.3.24.RELEASE/spring-framework-reference/html/mvc.html

Spring MVC的特點:

  • 輕量級,簡單、靈活、易用。

  • 高效,基於請求響應的MVC框架(發送一個請求,就會響應一個視圖)

  • 作為Spring的一部分,享受了Spring的所有便利。

  • 約定大於配置。

  • 功能強大:RESTful、數據驗證(手機號碼,郵箱格式驗證等)、格式化、本地化、主題等。

Spring MVC原理

官方原理圖如下:

中文版原理圖:

SpringMVC框架是圍繞DispatcherServlet設計的,對應原理圖中的前端控制器。

  • DispatcherServlet本質上是一個調度Servlet。

  • DispatcherServlet的作用是將請求分發到不同的處理器。

  • Spring2.5開始,基於注解形式開發,十分簡潔。

Spring MVC執行流程如下:

實線表示Spring MVC已經實現好的,只有虛線是需要自己實現的。

執行流程:

1、DispatcherServlet表示前端控制器

DispatcherServlet是整個Spring MVC的控制中心,用戶發出請求,DispatcherServlet接收並攔截請求。

  • 請求url為:http://localhost:8080/springmvc_war/hello ,拆成三部分:

    • http://localhost:8080:服務器域名
    • springmvc_war:部署在web服務器上的工程站點。
    • /hello:表示控制器Controller
  • 如上url表示:請求位於服務器http://localhost:8080 上的 springmvc_war 站點的 hello控制器。

2、HandlerMapping為處理器映射

DispatcherServlet調用HandlerMapping,后者根據請求url查找Handler。

3、HandlerExecution是具體的Handler

4、HandlerAdapter為處理器適配器

  • 按照特定的規則去執行Handler
  • Handler讓具體的Controller執行。
  • Controller將執行結果,包括數據和視圖信息,封裝到ModelAndView。並返回給HandlerAdapter。
  • HandlerAdapter將ModelAndView傳遞給DispatcherServlet。

5、ViewResolver視圖解析器

  • DispatcherServlet調用視圖解析器ViewResolver來解析ModelAndView中的視圖名
  • 將解析后的視圖名傳遞給DispatcherServlet。
  • DispatcherServlet根據視圖名,調用具體的視圖。
  • 渲染視圖,返回呈現。

HelloSpringMVC

Spring2.5以后,使用注解開發SpringMVC功能十分強大。但是為了更清楚了解SpringMVC原理,最佳實踐是動手實現。

1、web.xml配置

  • 在web.xml中配置DispatcherServlet
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!--注冊DispatcherServlet-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--關聯一個springmvc的配置文件,命名規則為:【servlet-name】-servlet.xml-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!--/ 匹配所有的請求:不包括.jsp-->
    <!--/* 匹配所有的請求:包括.jsp-->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

2、DispatcherServlet對應sping bean文件配置

  • 一個DispatcherServlet需要關聯一個spring bean配置文件。
  • 根據官方命名規則:【servlet-name】-servlet.xml,此處為springmvc-servlet.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--添加處理器映射-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <!--添加處理器適配-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
     <!--添加視圖解析器:解析DispatcherServlet給它的ModelAndView
      1、獲得ModelAndView中的數據
      2、解析ModelAndView中的視圖名字
      3、拼接視圖完整文件名,找到視圖 /WEB-INF/jsp/XXX.jsp
      4、將數據渲染到這個視圖上
      -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <!--前綴-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--后綴-->
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

3、編寫Controller

Controller負責解析用戶請求,進行業務處理,並返回一個模型。

Controller通過實現接口和注解定義兩種方法實現。

實現了Controller接口的類就是控制器,這是較老的方法。

一個控制器類只能有一個方法。多個方法要寫多個controller。

public class MyController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        //ModelAndView 模型和視圖
        ModelAndView mv=new ModelAndView();
        //封裝對象,放在ModelAndView中
        mv.addObject("msg", "Hello!SpringMVC!~~");
        //封裝要跳轉的視圖,放在ModelAndView中。
        mv.setViewName("hello"); //WEB-INF/jsp/hello.jsp
        return mv;
    }
}

4、把Controller注冊到Spring

由於處理器映射使用了BeanNameUrlHandlerMapping,必須要在Spring文件中注冊Controller。

  • bean的id屬性值為:斜杠/+控制器Controller。此處為"/hello"。
  • Controller的id與服務器域名http://localhost:8080,工程包/springmvc_war,一起組成完整的請求url。
  • 在瀏覽器輸入url:http://localhost:8080/springmvc_war/hello
    • 請求/hello,直接映射到"controller.MyController"控制器。
<!--id為斜杠/+控制器Controller,HandlerMapping根據url映射到controller-->
<bean id="/hello" class="controller.MyController" />

5、編寫要跳轉的.jsp頁面文件

此處跳轉到hello.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Zuka</title>
</head>
<body>
${msg}
</body>
</html>

6、啟動Tomcat測試

  • 在 Tomcat部署工程

點擊運行后,默認頁面彈出,展示index.jsp內容。對應鏈接:http://localhost:8080/springmvc_war

在鏈接末尾加上hello,對應鏈接:http://localhost:8080/springmvc_war/hello

該URL映射到MyController處理。返回頁面展示hello.jsp內容。也就是MyController中 msg字段值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM