SpringMVC框架基礎與原理

以前寫項目時用到了框架,那會只會看別人的照搬,並不知道具題用法的具體用意,甚至連最基礎的註解@Controller 、@RequestMapping 也說不出真正的含義,只知道這樣寫就能用。所以,你若是初學者,建議你從基礎開始,不然也是白學,總有一天你還得花時間重拾這些被忽略的基礎知識。

本人現在大三了,自己感覺很多東西學了跟沒學似的,還得花時間慢慢重拾,總之現在有些緊迫感與壓力了。如果你還是大一、大二,那我很爲你感到慶幸,這個階段就開始接觸框架了,因爲你已經走在了大部分同齡人的前面,還有時間學更多的東西,同時我希望你不要走馬觀花似的隨便搞搞,學了就學好,從基礎——案例——項目——書籍,不斷進行消化,知識就是你的了。


一、 三層架構

1. 服務器端程序,一般都基於兩種形式,一種C/S(客戶端/服務器)架構程序,一種B/S(瀏覽器/服務器)架構程序

2. 使用Java語言基本上都是開發B/S架構的程序,B/S架構又分成了三層架構

           表現層:WEB層,用來和客戶端進行數據交互的。表現層一般會採用MVC的設計模型

           業務層:處理公司具體的業務邏輯的

           持久層:用來操作數據庫的


二、 MVC模型

MVC全名是Model View Controller 模型視圖控制器,每個部分各司其職。

    1. Model:數據模型,JavaBean的類,用來進行數據封裝。

    2. View:指JSP、HTML用來展示數據給用戶

    3. Controller:用來接收用戶的請求,整個流程的控制器。用來進行數據校驗等。
 


三、SpringMVC  概述

SpringMVC 是一種基於 Java 的實現 MVC 設計模型的請求驅動類型的輕量級 Web 框架。Spring 框架提供了構建 Web 應用程序的全功能 MVC 模塊。使用 Spring 可插入的 MVC 架構,從而在使用 Spring 進行 WEB 開發時,可以選擇使用 Spring的 Spring MVC 框架或集成其他 MVC 開發框架。SpringMVC 已經成爲目前最主流的 MVC 框架之一,通過一套註解,讓一個簡單的 Java 類成爲處理請求的控制器,而無須實現任何接口

具體原理先寫個案例在解釋


四、SpringMVC  入門案例

1. 基於idea創建maven WEB工程,引入開發的依賴包

pom文件導入依賴

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <spring.version>5.0.2.RELEASE</spring.version>
  </properties>


  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

 

2. 配置核心的控制器(配置DispatcherServlet)
在web.xml配置文件中核心控制器DispatcherServlet

<!-- SpringMVC的核心控制器 -->
<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <!-- 配置Servlet的初始化參數,讀取springmvc的配置文件,創建spring容器 -->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc.xml</param-value>
    </init-param>

    <!-- 配置servlet啓動時加載對象 -->
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

3. 編寫springmvc.xml的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       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
            http://www.springframework.org/schema/mvc
            http://www.springframework.org/schema/mvc/spring-mvc.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 配置spring創建容器時要掃描的包 -->
    <context:component-scan base-package="com.xiaojie"></context:component-scan>

    <!--配置視圖解析器-->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

    <!--配置spring開啓註解mvc的支持-->
    <mvc:annotation-driven></mvc:annotation-driven>
</beans>

 

4. 編寫index.jsp和HelloController控制器類

index.jsp

<%--
  Created by IntelliJ IDEA.
  User: ASUS
  Date: 2020/4/8
  Time: 15:29
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>springMvc入門案例</title>
</head>
<body>
    <h3>springMvc入門案例</h3>
    <a href="hello">跳轉success</a>
</body>
</html>

HelloController.java

package com.xiaojie.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @program: springmvc01_start
 * @description: 入門案例控制層
 * @author: Mr.Li
 * @create: 2020-04-08 15:25
 **/
@Controller
public class HelloController {
    /**
     * 接口展示
     * @return
     */
    @RequestMapping(path = "hello")
    public String sayHello() {
        System.out.println("sayHello控制器已調用");
        return "success";
    }
}

5. 在WEB-INF目錄下創建pages文件夾,編寫success.jsp的成功頁面

 

6. 配置Tomcat服務器,進行測試

 

 

五、 入門案例的執行過程分析

5.1 入門案例的執行流程

1. 當啓動Tomcat服務器的時候,因爲配置了load-on-startup標籤,所以會創建DispatcherServlet對象,就會加載springmvc.xml配置文件

2. 開啓了註解掃描,那麼HelloController對象就會被創建

3. 從index.jsp發送請求,請求會先到達DispatcherServlet核心控制器,根據配置@RequestMapping註解找到執行的具體方法

4. 根據執行方法的返回值,再根據配置的視圖解析器,去指定的目錄下查找指定名稱的JSP文件

5. Tomcat服務器渲染頁面,做出響應



5.2  SpringMVC 的 請求響應流程

DispatcherServlet :前端控制器

用戶請求到達前端控制器,它就相當於 mvc 模式中的 c,dispatcherServlet 是整個流程控制的中心,由它調用其它組件處理用戶的請求,dispatcherServlet 的存在降低了組件之間的耦合性。
 

HandlerMapping :處理器映射器

HandlerMapping 負責根據用戶請求找到 Handler 即處理器,SpringMVC 提供了不同的映射器實現不同的映射方式,例如:配置文件方式,實現接口方式,註解方式等。

 

Handler :處理器

它就是我們開發中要編寫的具體業務控制器。由 DispatcherServlet 把用戶請求轉發到 Handler。由Handler 對具體的用戶請求進行處理。

 

HandlAdapter :處理器適配器

通過 HandlerAdapter 對處理器進行執行,這是適配器模式的應用,通過擴展適配器可以對更多類型的處理
器進行執行。

 

View Resolver :視圖解析器

View Resolver 負責將處理結果生成 View 視圖,View Resolver 首先根據邏輯視圖名解析成物理視圖名
即具體的頁面地址,再生成 View 視圖對象,最後對 View 進行渲染將處理結果通過頁面展示給用戶。

 

View :視圖

SpringMVC 框架提供了很多的 View 視圖類型的支持,包括:jstlView、freemarkerView、pdfView
等。我們最常用的視圖就是 jsp。
 


六、常用的註解


1、RequestMapping註解:

1. RequestMapping註解的作用是建立請求URL和處理方法之間的對應關係

2. RequestMapping註解可以作用在方法和類上

        作用在類上:第一級的訪問目錄

        作用在方法上:第二級的訪問目錄

3. RequestMapping的屬性

        path  指定請求路徑的url

        value value屬性和path屬性是一樣的

        mthod 指定該方法的請求方式

        params 指定限制請求參數的條件

        headers 發送的請求中必須包含的請求頭


2、 RequestParam註解

1. 作用:把請求中的指定名稱的參數傳遞給控制器中的形參賦值

2. 屬性:value:請求參數中的名稱

               required:請求參數中是否必須提供此參數,默認值是true,必須提供
       3. 代碼如下

/**
* 接收請求
* @return
* required屬性默認爲true,表示必須有此參數,否則報錯;爲false時表示請求時可帶可不帶參數
*/
@RequestMapping(path="hello")
public String sayHello(@RequestParam(value="username",required=false)String name) {
    System.out.println(name);
    return "success";
}
<a href="hello?username=你好">跳轉success</a>

 

3、RequestBody註解

1. 作用:用於獲取請求體的內容(注意此處:get方法不適用)

2. 屬性:required:是否必須有請求體,默認值是true;當取值爲 true 時,get 請求方式會報錯。如果取值
爲 false,get 請求得到是 null。

3. 代碼如下

/**
* 接收請求
* @return
*/
@RequestMapping(path="useRequestBody")
public String sayHello(@RequestBody String body) {
    System.out.println(body);
    return "success";
}
<form method="post" action="useRequestBody">
    用戶名:<input type="text" name="username"><br>
    密碼:<input type="password" name="password"><br>
    <input type="submit" value=" 保存 "><br>
</form>

4、PathVariable註解

1. 作用:擁有綁定url中的佔位符的。例如:url中有/delete/{id},{id}就是佔位符

2. 屬性:value:指定url中的佔位符名稱

3. Restful風格的URL:請求路徑一樣,可以根據不同的請求方式去執行後臺的不同方法

4. restful風格的URL優點:

       結構清晰    符合標準      易於理解      擴展方便

4. 代碼如下

/**
* PathVariable接收請求
* @return
*/
@RequestMapping(path="hello/{id}")
    public String sayHello(@PathVariable(value="id") String id) {
    System.out.println(id);
    return "success";
}
<a href="hello/1">PathVariable註解入門案例</a>

 

5、RequestHeader註解

1. 作用:獲取指定請求頭的值

2. 屬性: value:請求頭的名稱

3. 代碼如下

/**
* RequestHeader測試
* @return
*/
@RequestMapping(path="hello")
public String sayHello(@RequestHeader(value="Accept") String header) {
    System.out.println(header);
    return "success";
}

 

當青春和努力合二爲一,恩典表與你同在

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章