SpringMvc(一)-初識

来源:https://www.cnblogs.com/xiaoqigui/archive/2022/09/02/16651065.html
-Advertisement-
Play Games

1、環境搭建 1.1 jar包 <spring.version>4.3.18.RELEASE</spring.version> <!-- spring-mvc begin --> <dependency> <groupId>org.springframework</groupId> <artifac ...


1、環境搭建

1.1 jar包

<spring.version>4.3.18.RELEASE</spring.version>

<!-- spring-mvc begin -->
<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>
<!-- spring-mvc end -->

1.2 web.xml

  • 前端核心控制器(dispatcherServlet)

    • 配置初始化參數,指定springMvc的核心配置文件,目的就是自動創建容器對象
    • 啟動級別 1
  • Rest風格 請求轉換過濾器

<?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">

    <!--前端核心控制器  springMvc框架提供的 -->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 配置初始化參數,指定springMvc的核心配置文件,目的就是自動創建容器對象 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <!-- web容器啟動,優先創建前端核心控制器實例對象 -->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <!-- 攔截所有的請求處理,放行jsp -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!-- Rest風格 請求轉換過濾器-->
    <filter>
        <filter-name>hiddenHttpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>hiddenHttpMethodFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

1.3spring-mvc.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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 組件掃描 -->
    <context:component-scan base-package="com.kgc.mvc"></context:component-scan>

    <!-- jsp 視圖解析器 -->
    <!-- 作用:當請求處理方法返回一個目標視圖頁面的名稱,視圖解析器會自動將返回的視圖名稱解析為真實的物理視圖(prefix + 目標視圖頁面名稱 + suffix) -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 統一首碼,請求處理方法返回目標視圖名稱時,會被統一增加此首碼目錄(目錄視圖目錄),結尾的 / 不能少 -->
        <property name="prefix" value="/WEB-INF/views/"></property>
        <!-- 統一尾碼,請求處理方法返回目標視圖名稱時,會被統一增加此尾碼 -->
        <property name="suffix" value=".jsp"></property>
    </bean>

</beans>

2、Mvc 使用流程

需求,瀏覽器發送請求helloMvc,請求後端處理方法,返回目標success。jsp頁面,併在頁面中顯示 Hello Mvc in KH96;

2.1 HelloMvcController

@Controller //不可以用其他的分層註解替換,只能用controller  (1.可以作為一個控制層組件掃描到容器  2.代表一個控制器)
public class HelloMvcController {

    //接收helloMvc,跳轉到目標success.jsp
    @RequestMapping("/helloMvc") //定義當前請求控制器中,可以處理請求的映射url字元串,前面的 / 可寫 可不寫
    public String helloSpringMvc(){
        System.out.println("------ 調用 HelloMvcController控制器的 helloSpringMvc() 請求處理方法------");

        //目標jsp視圖頁面的名稱(不帶尾碼),區分大小寫
        return "success";
    }
}

2.2 success.jsp

webapp/WEB-INF/views/success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>成功頁面</title>
</head>
<body>
    <h2>KH96 Success Page</h2>
</body>
</html>

2.3 測試

2.4 總結

springMvc使用流程小結:

  • 1、Tomcat伺服器啟動時,自動創建前端核心控制器的實例-DispatcherServlet,同時自動讀取配置的spring-mvc.xml核心配置文件,創建容器對象,並掃描組件加入到容器中;
    •  即:將控**制器組件**(加了@Controller註解)**加入到容器中**,並**自動解析**加入的**請求控制器**,可以得到**請求處理url**和**請求處理方法**的**映射**;
      
  •  2、客戶端瀏覽器,**發送請求**:http://localhost:8080/springmvc-01/helloMvc
    
  •  3、請求會被 **前端核心控制器** **攔截**(匹配到**前端核心控制器**的**url-pattern**)
    
  •  4、**前端核心控制器** ,自動根據請求**url和請求處理方法的映射關係**,進行**映射查找**,如果**找到了**對應關係,自動將**當前請求**發送**給目標請求處理器**的請求處理方法,進行業務處理,如果**沒有找到**,直接**報錯誤404**;
    
  •  5、目標請求處理方法,處理完業務後,**返回**一個目標**視圖的名稱**-success
    
  • 6、返回的目標視圖名稱,仍然會交給 前端核心控制器 進行視圖解析(自動調用容器中添加的視圖解析器解析),會得到一個真實的目標物理視圖頁面(要跳轉的真實頁面),進行響應跳轉目標頁面給瀏覽器顯示;

3、@RequestMapping

3.1 @RequestMapping可以寫的位置

類上方法上

  • 類上:相對於web應用根目錄的;

  • 方法上:相對於類上的映射,如果類上沒有,就是相對於web應用根目錄

3.1.1 只用方法上有

@RequestMapping("/testSpringMvcRequestMappingTarget")
public String testMvcRequestMappingTarget(){
    //返回成功頁面
    return "hello";
}

測試

3.1.2 類上 和 方法上都有

@Controller
@RequestMapping("/kh96")
public class SpringMvcController {

    @RequestMapping("/testSpringMvcRequestMappingTarget")
    public String testMvcRequestMappingTarget(){
        //返回成功頁面
        return "hello";
    }
    
}

測試

3.2 method屬性

  • 作用:指定當前請求處理方法的請求方式

  • 一旦指定了請求方式,就只能使用指定的請求方式,才可以映射處理,不指定,自動適配(所有方式都可以);

  • method 屬性可以指定多個請求方式

3.2.1 method = RequestMethod.GET

@RequestMapping(value = "/testSpringMvcRequestMappingMethodGet",method = RequestMethod.GET)
public String testSpringMvcRequestMappingMethodGet(){

    System.out.println("----- @RequestMapping method = RequestMethod.GET ------");

    //返回成功頁面
    return "hello";
}

使用PostMan測試

Get測試

Post測試

3.2.2 method = RequestMethod.POST

@RequestMapping(value = "/testSpringMvcRequestMappingMethodPost",method = RequestMethod.POST)
public String testSpringMvcRequestMappingMethodPost(){

    System.out.println("----- @RequestMapping method = RequestMethod.Post ------");

    //返回成功頁面
    return "hello";
}

Get測試

Post測試

3.2.3 method = {RequestMethod.GET,RequestMethod.POST})

@RequestMapping(value = "/testSpringMvcRequestMappingMethodGetAndPost",method = {RequestMethod.GET,RequestMethod.POST})
public String testSpringMvcRequestMappingMethodGetAndPost(){

    System.out.println("----- @RequestMapping method = RequestMethod.Post ------");

    //返回成功頁面
    return "hello";
}

Get測試

Post測試

3.3 params屬性

指定當前請求處理方法對於請求,必要攜帶的參數

  • 寫法1:指定當前請求必須攜帶的參數名沒有參數值,可以指定多個(大括弧,逗號分割),如果請求沒有攜帶params的所有參數,請求404;
  • 寫法2:指定當前請求必須攜帶的參數名對應的參數值,可以指定多個(大括弧,逗號分割),如果請求沒有攜帶params指定的所有參數請求404,如果請求攜帶的參數及對應的參數值不匹配,請求404;
    • 註意:攜帶的參數值必須是指定的參數值
  • 總結,必須攜帶所有參數,如果有指定參數值必須攜帶參數值且攜帶的參數值必須一致

3.3.1 params ={"uname"}

指定一個參數,不指定參數值;

@RequestMapping(value = "/testSpringMvcRequestMappingParams",params ={"uname"} )
public String testSpringMvcRequestMappingParams(){

    System.out.println("----- @RequestMapping 屬性 params------");

    //返回成功頁面
    return "hello";
}

測試,不帶參數

測試,帶參數,不帶值

測試,帶參數,帶值

3.3.2 params ={"uname=kh96"}

指定一個參數,指定值;

@RequestMapping(value = "/testSpringMvcRequestMappingParams",params ={"uname=kh96"} )
public String testSpringMvcRequestMappingParams(){

    System.out.println("----- @RequestMapping 屬性 params------");

    //返回成功頁面
    return "hello";
}

測試,帶參數,帶值,值不匹配

測試,帶參數,帶值,值匹配

3.3.3 params ={"uname=kh96","upwd=123"}

指定兩個參數,並指定值;

@RequestMapping(value = "/testSpringMvcRequestMappingParams",params ={"uname=kh96","upwd=123"})
public String testSpringMvcRequestMappingParams(){

    System.out.println("----- @RequestMapping 屬性 params------");

    //返回成功頁面
    return "hello";
}

測試,帶一個參數,並指定值

測試,帶兩個參數,並指定第一個值

測試,帶兩個參數,並指定第兩個值

3.4 headers屬性

指定當前請求處理方法對於請求,必要攜帶的請求頭參數,用法和params類似,參數位置不同;

@RequestMapping(value = "/testSpringMvcRequestMappingHeaders",headers = {"token=123"})
public String testSpringMvcRequestMappingHeaders(){

    System.out.println("----- @RequestMapping 屬性 headers------");

    //返回成功頁面
    return "hello";
}

測試,主要觀察參數位置,其他參數規則跟params一致

3.5 @RequestMapping + @PathVariable

請求映射註解:參數占位符註解 @PathVariable:

  • 寫法:只能攜帶請求處理方法的形參中,自動將RequestMapping中指定的url使用的占位符綁定參數值
    • 即:請求地址映射為: /url/{參數名},目標請求為:/url/參數值,自動將參數值綁定到指定參數名上;
  • 要求1:@RequestMapping("指定參數名")註解請求url中,指定的占位符參數名必須跟當前請求方法形參中@PathVariable註解指定的參數名一致;否者報錯: Could not find @PathVariable [utel] in @RequestMapping
  • 要求2:@RequestMapping,只寫註解,不指定參數名,指定的占位符參數名,必須跟當前請求方法形參名一致(也就是預設為形參名);否則,報錯:Could not find @PathVariable [uemail] in @RequestMapping

3.5.1 測試

3.5.1.1 占位符與@PathVariable註解指定的參數名不一致
@RequestMapping("/testSpringMvcRequestMappingPathVariable/{utel#}/{uemail}")
public String testSpringMvcRequestMappingPathVariable(@PathVariable("utel") String utel,@PathVariable("uemail") String uemail){

    System.out.println("----- @RequestMapping + @PathVariable utel:"+utel+",uemail"+uemail+" ------");

    //返回成功頁面
    return "hello";
}

測試結果

3.5.1.2 占位符與@PathVariable註解指定的參數名一致
@RequestMapping("/testSpringMvcRequestMappingPathVariable/{utel}/{uemail}")
public String testSpringMvcRequestMappingPathVariable(@PathVariable("utel") String utel,@PathVariable("uemail") String uemail){

    System.out.println("----- @RequestMapping + @PathVariable utel:"+utel+",uemail"+uemail+" ------");

    //返回成功頁面
    return "hello";
}

測試結果

3.5.1.3 @PathVariable不指定參數名

測試,占位符與形參不一致

@RequestMapping("/testSpringMvcRequestMappingPathVariable/{utel}/{uemail#}")
public String testSpringMvcRequestMappingPathVariable(@PathVariable("utel") String utel,@PathVariable String uemail){

    System.out.println("----- @RequestMapping + @PathVariable utel:"+utel+",uemail"+uemail+" ------");

    //返回成功頁面
    return "hello";
}

測試結果

測試,占位符與形參一致

@RequestMapping("/testSpringMvcRequestMappingPathVariable/{utel}/{uemail}")
public String testSpringMvcRequestMappingPathVariable(@PathVariable("utel") String utel,@PathVariable String uemail){

    System.out.println("----- @RequestMapping + @PathVariable utel:"+utel+",uemail"+uemail+" ------");

    //返回成功頁面
    return "hello";
}

測試結果

4.Rest風格

  • get------查詢select
  • post------新增insert
  • put------更新update
  • delete------刪除delete

相同請求路徑,通過請求方式判斷請求方法

自定義請求方式,一定要帶一個名字為_method的參數

4.1 Rest風格 請求轉換過濾器

<!-- Rest風格 請求轉換過濾器-->
<filter>
    <filter-name>hiddenHttpMethodFilter</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>hiddenHttpMethodFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

4.1 get------查詢 select

請求方法

//請求映射註解:rest風格處理-get,查詢select
//@RequestMapping(value = "/testSpringMvcRequestMappingRestGet/{uid}",method = RequestMethod.GET)
@RequestMapping(value = "/testSpringMvcRequestMappingRest/{uid}",method = RequestMethod.GET)
public String testSpringMvcRequestMappingRestGet(@PathVariable("uid") String uid){

    System.out.println("----- Rest Get 根據 uid:"+uid+" 查詢用戶詳情 ------");

    //返回成功頁面
    return "hello";
}

jsp

<h3>Get 請求映射註解:rest風格處理-get,查詢select</h3>
<h3><a href="${pageContext.request.contextPath}/testSpringMvcRequestMappingRest/KH96_01">Test SpringMvc Rest Get</a> </h3>

測試

4.2post------新增 insert

//請求映射註解:rest風格處理-post,新增insert
//@RequestMapping(value = "/testSpringMvcRequestMappingRestPost",method = RequestMethod.POST)
@RequestMapping(value = "/testSpringMvcRequestMappingRest",method = RequestMethod.POST)
public String testSpringMvcRequestMappingRestPost(){

    System.out.println("----- Rest Post 新增用戶詳情  ------");

    //返回成功頁面
    return "hello";
}

jsp

<h3>Post 求映射註解:rest風格處理-post,新增insert</h3>
<form action="testSpringMvcRequestMappingRest" method="post">
    <input type="submit" value="Test SpringMvc Rest Post">
</form>

測試

4.3 put------更新 update

//請求映射註解:rest風格處理-put,更新update
//@RequestMapping(value = "/testSpringMvcRequestMappingRestPut",method = RequestMethod.PUT)
@RequestMapping(value = "/testSpringMvcRequestMappingRest",method = RequestMethod.PUT)
public String testSpringMvcRequestMappingRestPut(){

    System.out.println("----- Rest Put 更新用戶詳情 ------");

    //返回成功頁面
    return "hello";
}

jsp

<h3>Put 請求映射註解:rest風格處理-put,更新update</h3>
<form action="testSpringMvcRequestMappingRest" method="post">
    <input type="hidden" name="_method" value="put">
    <input type="submit" value="Test SpringMvc Rest put">
</form>

測試

4.4 delete------刪除 delete

//請求映射註解:rest風格處理-delete,刪除delete
//@RequestMapping(value = "/testSpringMvcRequestMappingRestDelete/{uid}",method = RequestMethod.DELETE)
@RequestMapping(value = "/testSpringMvcRequestMappingRest/{uid}",method = RequestMethod.DELETE)
public String testSpringMvcRequestMappingRestDelete(@PathVariable("uid") String uid){

    System.out.println("----- Rest Delete 根據 uid:"+uid+" 刪除用戶  ------");

    //返回成功頁面
    return "hello";
}

jsp

<h3>Delete 請求映射註解:rest風格處理-delete,刪除delete</h3>
<form action="testSpringMvcRequestMappingRest/KH96_01" method="post">
    <input type="hidden" name="_method" value="delete">
    <input type="submit" value="Test SpringMvc Rest delete">
</form>

測試


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 蒼穹之邊,浩瀚之摯,眰恦之美; 悟心悟性,善始善終,惟善惟道! —— 朝槿《朝槿兮年說》 寫在開頭 提起Java領域中的鎖,是否有種“道不盡紅塵奢戀,訴不完人間恩怨“的”感同身受“之感?細數那些個“玩意兒”,你對Java的熱情是否還如初戀般“人生若只如初見”? Java中對於鎖的實現真可謂是“百花齊 ...
  • 定義:建造者模式也稱為生成器模式,將一個個簡單對象一步步構造成一個複雜的對象,將複雜對象的構建和它的表示分離,使得同樣的構建過程有不同的表示; 主要解決:系統中複雜對象的創建過程,通常由各個部分的子對象採用一定的演算法構成;由於需求的變化 ,這個複雜對象的各個部分通常面臨著劇烈的變化,但是將他們組合在 ...
  • Serverless 架構將成為未來雲計算領域重要的技術架構,將會被更多的業務所採納。進一步深究,Serverless 架構在什麼場景下有優秀的表現,在什麼場景下可能表現得並不是很理想呢?或者說,有哪些場景更適合 Serverless 架構呢? ...
  • 集合和數組的區別 共同點:都是存儲數據的容器 不同點:數組的容量是固定的,集合的容量是可變的 ArrayList的構造方法和添加方法 public ArrayList() 創建一個空的集合對象 構造一個初始容量為 10 的空列表。 public boolean add(E element) 將指定的 ...
  • 目錄 一.OpenGL ES 圖像伽馬線 1.原始圖片 2.效果演示 二.OpenGL ES 圖像伽馬線源碼下載 三.猜你喜歡 零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL ES 學習路線推薦 : OpenGL ES ...
  • import語句用來導入其他python文件(稱為模塊module),使用該模塊里定義的類、方法或者變數,從而達到代碼復用的目的。 將要建立文件的結構為: Tree |____ m1.py |____ m2.py |____ Branch |____m3.py |____m4.py 首先,先建立一個 ...
  • x64dbg 是一款開源的應用層反彙編調試器,旨在對沒有源代碼的可執行文件進行惡意軟體分析和逆向工程,同時 x64dbg 還允許用戶開發插件來擴展功能,插件開發環境的配置非常簡單,如下將簡單介紹x64dbg是如何配置開發環境以及如何開發插件的。 ...
  • 書接上回,上一回我們完成了用戶管理頁面的構建,並且通過前端的Vue.js框架動態地獲取表單數據,同時非同步請求後端Iris介面進行入庫操作,過程中使用函數封裝可復用的邏輯。 本回我們將繼續完善用戶管理功能。 唯一索引 雖然在之前的章節中已經完成了用戶添加(註冊)的功能,然而我們忽略了一個重要的細節,那 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...