天天看點

spirngMVC(1)——什麼是SpringMVC1回顧MVC2回顧Servlet3什麼是SpringMVC

1回顧MVC

MVC是模型(Model(mapper service))、視圖(View(jsp))、控制器(Controller(servlet))的簡寫,是一種軟體設計規範

是将業務邏輯、資料、顯示分離的方法來組織代碼

1模型

資料模型,提供要展示的資料,是以包含資料和行為,模型提供了模型資料查詢和模型資料的狀态更新等功能,包括資料和業務

2視圖

負責進行模型的展示,一般就是我們見到的使用者界面,客戶想看到的東西

3控制器

接收使用者請求,委托給模型進行處理(狀态改變),處理完畢後把傳回的模型資料傳回給視圖,由視圖負責展示。也就是說控制器做了個排程員的工作

項目分成三部分,包括視圖、控制、模型。如下圖所示

職責分析:

Controller:控制器

取得表單資料

調用業務邏輯

轉向指定的頁面

Model:模型

業務邏輯

儲存資料的狀态

View:視圖

顯示頁面

spirngMVC(1)——什麼是SpringMVC1回顧MVC2回顧Servlet3什麼是SpringMVC

1使用者發請求

2Servlet接收請求資料,并調用對應的業務邏輯方法

3業務處理完畢,傳回更新後的資料給servlet

4servlet轉向到JSP,由JSP來渲染頁面

5響應給前端更新後的頁面

2回顧Servlet

1建立一個Maven工程當做父工程

<dependencies>
   <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <version>4.12</version>
   </dependency>
   <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-webmvc</artifactId>
       <version>5.1.9.RELEASE</version>
   </dependency>
   <dependency>
       <groupId>javax.servlet</groupId>
       <artifactId>servlet-api</artifactId>
       <version>2.5</version>
   </dependency>
   <dependency>
       <groupId>javax.servlet.jsp</groupId>
       <artifactId>jsp-api</artifactId>
       <version>2.2</version>
   </dependency>
   <dependency>
       <groupId>javax.servlet</groupId>
       <artifactId>jstl</artifactId>
       <version>1.2</version>
   </dependency>
</dependencies>
           

2建立一個Moudle:springMVC-servlet , 添加Web app的支援

spirngMVC(1)——什麼是SpringMVC1回顧MVC2回顧Servlet3什麼是SpringMVC

3 導入servlet 和 jsp 的 jar 依賴

<dependency>
   <groupId>javax.servlet</groupId>
   <artifactId>servlet-api</artifactId>
   <version>2.5</version>
</dependency>
<dependency>
   <groupId>javax.servlet.jsp</groupId>
   <artifactId>jsp-api</artifactId>
   <version>2.2</version>
</dependency>
           

4 編寫一個Servlet類,用來處理使用者的請求

package com.zs.controller;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HelloServlet extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //取得參數
        String method = req.getParameter("method");
        if (method.equals("add")){
            req.getSession().setAttribute("msg","執行了add方法");
        }
        if (method.equals("delete")){
            req.getSession().setAttribute("msg","執行了delete方法");
        }
        //業務邏輯
        //視圖跳轉
        req.getRequestDispatcher("/WEB-INF/jsp/hello.jsp").forward(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

           

5編寫Hello.jsp,在WEB-INF目錄下建立一個jsp的檔案夾,建立hello.jsp

spirngMVC(1)——什麼是SpringMVC1回顧MVC2回顧Servlet3什麼是SpringMVC
<%--
  Created by IntelliJ IDEA.
  User: DELL
  Date: 2021/1/24
  Time: 9:02
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
${msg}
</body>
</html>

           

6在web.xml中注冊Servlet

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0">

    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.zs.controller.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hellp</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>
           

7配置Tomcat,并啟動測試

http://localhost:8080/hello?method=add

spirngMVC(1)——什麼是SpringMVC1回顧MVC2回顧Servlet3什麼是SpringMVC

執行流程

spirngMVC(1)——什麼是SpringMVC1回顧MVC2回顧Servlet3什麼是SpringMVC

3什麼是SpringMVC

Spring MVC是Spring Framework的一部分,是基于Java實作MVC的輕量級Web架構

Spring MVC的特點:

輕量級,簡單易學

高效 , 基于請求響應的MVC架構

與Spring相容性好,無縫結合

約定優于配置

功能強大:RESTful、資料驗證、格式化、本地化、主題等

簡潔靈活

Spring的web架構圍繞DispatcherServlet [ 排程Servlet ] 設計

3.1中心控制器DispatcherServlet

Spring的web架構圍繞DispatcherServlet設計。DispatcherServlet的作用是将請求分發到不同的處理器(controller),建議采用基于注解的controller聲明方式

3.2 通過HelloMVC程式講解原理

1建立一個Moudle , springmvc-02-hello , 添加web的支援!

2确定導入了SpringMVC 的依賴!

3配置web.xml , 注冊DispatcherServlet

<!--1.注冊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>
       <!--啟動級别-1-->
       <load-on-startup>1</load-on-startup>
   </servlet>

   <!--/ 比對所有的請求;(不包括.jsp)-->
   <!--/* 比對所有的請求;(包括.jsp)-->
   <servlet-mapping>
       <servlet-name>springmvc</servlet-name>
       <url-pattern>/</url-pattern>
   </servlet-mapping>

           

4編寫SpringMVC 的 配置檔案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-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
        <!--字首-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--字尾-->
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>
           

添加 處理映射器

添加 處理器擴充卡

添加 視圖解析器

<!--視圖解析器:DispatcherServlet給他的ModelAndView-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
        <!--字首-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--字尾-->
        <property name="suffix" value=".jsp"/>
    </bean>

           

5編寫我們要操作業務Controller

package com.zs.controller;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//注意:這裡我們先導入Controller接口
public class HelloController implements Controller {

    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        //ModelAndView 模型和視圖
        ModelAndView mv = new ModelAndView();

        //封裝對象,放在ModelAndView中。Model
        mv.addObject("msg","HelloSpringMVC!");
        //封裝要跳轉的視圖,放在ModelAndView中
        mv.setViewName("hello"); //: /WEB-INF/jsp/hello.jsp
        return mv;
    }

}

           

6 将自己的類交給SpringIOC容器,注冊bean

<!--Handler-->
    <bean id="/hello" class="com.zs.controller.HelloController"/>
           

7寫要跳轉的jsp頁面,顯示ModelandView存放的資料,以及我們的正常頁面

<%--
  Created by IntelliJ IDEA.
  User: DELL
  Date: 2021/1/24
  Time: 9:46
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
${msg}
</body>
</html>

           

7配置Tomcat 啟動測試!

spirngMVC(1)——什麼是SpringMVC1回顧MVC2回顧Servlet3什麼是SpringMVC
spirngMVC(1)——什麼是SpringMVC1回顧MVC2回顧Servlet3什麼是SpringMVC

3.3 SpringMVC執行原理

1 DispatcherServlet表示前置控制器,是整個SpringMVC的控制中心。使用者送出請求,DispatcherServlet接收請求并攔截請求。

2 DispatcherServlet自行調用HandlerMapping,HandlerMapping根據請求url查找Handler。

3 HandlerExecution将解析後的資訊傳遞給DispatcherServlet,如解析控制器映射等。

4 HandlerAdapter表示處理器擴充卡,其按照特定的規則去執行Handler。

5 Handler讓具體的Controller執行。

6 Controller将具體的執行資訊傳回給HandlerAdapter,如ModelAndView。

7 HandlerAdapter将視圖邏輯名或模型傳遞給DispatcherServlet。

8 DispatcherServlet調用視圖解析器(ViewResolver)來解析HandlerAdapter傳遞的邏輯視圖名

9 視圖解析器将解析的邏輯視圖名傳給DispatcherServlet。

10 DispatcherServlet根據視圖解析器解析的視圖結果,調用具體的視圖。

11 最終視圖呈現給使用者

spirngMVC(1)——什麼是SpringMVC1回顧MVC2回顧Servlet3什麼是SpringMVC
spirngMVC(1)——什麼是SpringMVC1回顧MVC2回顧Servlet3什麼是SpringMVC
spirngMVC(1)——什麼是SpringMVC1回顧MVC2回顧Servlet3什麼是SpringMVC

圖為SpringMVC的一個較完整的流程圖,實線表示SpringMVC架構提供的技術,不需要開發者實作,虛線表示需要開發者實作。

簡要分析執行流程

1 DispatcherServlet表示前置控制器,是整個SpringMVC的控制中心。使用者送出請求,DispatcherServlet接收請求并攔截請求。

我們假設請求的url為 : http://localhost:8080/SpringMVC/hello

如上url拆分成三部分:

http://localhost:8080伺服器域名

SpringMVC部署在伺服器上的web站點

hello表示控制器

通過分析,如上url表示為:請求位于伺服器localhost:8080上的SpringMVC站點的hello控制器。

2 HandlerMapping為處理器映射。DispatcherServlet自行調用HandlerMapping,HandlerMapping根據請求url查找Handler。

spirngMVC(1)——什麼是SpringMVC1回顧MVC2回顧Servlet3什麼是SpringMVC

3 HandlerExecution表示具體的Handler ,其主要作用是根據url查找控制器,如上url被查找控制器為:hello。

spirngMVC(1)——什麼是SpringMVC1回顧MVC2回顧Servlet3什麼是SpringMVC

4HandlerExecution将解析後的資訊傳遞給DispatcherServlet,如解析控制器映射等。

5 HandlerAdapter表示處理器擴充卡,其按照特定的規則去執行Handler。

spirngMVC(1)——什麼是SpringMVC1回顧MVC2回顧Servlet3什麼是SpringMVC

6 Handler讓具體的Controller執行。

spirngMVC(1)——什麼是SpringMVC1回顧MVC2回顧Servlet3什麼是SpringMVC

7 Controller将具體的執行資訊傳回給HandlerAdapter,如ModelAndView。

spirngMVC(1)——什麼是SpringMVC1回顧MVC2回顧Servlet3什麼是SpringMVC

8 HandlerAdapter将視圖邏輯名或模型傳遞給DispatcherServlet。

9 **DispatcherServlet調用視圖解析器(ViewResolver)**來解析HandlerAdapter傳遞的邏輯視圖名。

spirngMVC(1)——什麼是SpringMVC1回顧MVC2回顧Servlet3什麼是SpringMVC

10 視圖解析器将解析的邏輯視圖名傳給DispatcherServlet。

spirngMVC(1)——什麼是SpringMVC1回顧MVC2回顧Servlet3什麼是SpringMVC

11 DispatcherServlet根據視圖解析器解析的視圖結果,調用具體的視圖。

12 最終視圖呈現給使用者。