day01-SpringMVC基本介紹-01

来源:https://www.cnblogs.com/liyuelian/archive/2023/02/03/17090615.html
-Advertisement-
Play Games

SpringMVC介紹-01 1.離線文檔 解壓 spring-5.3.8-dist.zip文件。 位置:spring-framework-5.3.8/docs/reference/html/web.html#spring-web 2.SpringMVC基本介紹 2.1SpringMVC特點&概述 ...


SpringMVC介紹-01

1.離線文檔

解壓 spring-5.3.8-dist.zip文件。

位置:spring-framework-5.3.8/docs/reference/html/web.html#spring-web

image-20230202181914295

2.SpringMVC基本介紹

2.1SpringMVC特點&概述

  1. SpringMVC 從易用性,效率上都比曾經流行的 Struts2 更好

  2. SpringMVC 是 WEB 層框架:SpringMVC接管了 web層組件,比如控制器,視圖,視圖解析,返回給用戶的數據格式,同時支持 MVC 的開發模式/開發架構

  3. SpringMVC 通過註解,讓 POJO 成為控制器,不需要繼承類或者實現介面

  4. SpringMVC 採用低耦合的組件設計方式,具有更好的拓展和靈活性

  5. 支持 REST 格式的 URL 請求

  6. SpringMVC 是基於 Spring 的,它的核心包為 spring-webmvc-xxx.jar 和 spring-web-xxx.jar

2.2Spring SpringMVC SpringBoot的關係

  1. SpringMVC 只是 Spring 處理 WEB 層的一個模塊/組件,SpringMVC 的基石是 Servlet
  2. SpringBoot 是為了簡化開發者的使用而推出的一個框架(約定優於配置,簡化了Spring的配置流程),它包含很多組件/框架,Spring 就是最核心的內容之一,也包含了 SpringMVC
  3. 三者之間的關係是:Spring Boot > Spring > SpringMVC

3.SpringMVC的快速入門

3.1需求說明

需求說明:使用SpringMVC,完成一個最基本的測試案例——登錄案例

image-20230202185633326

3.2SpringMVC登錄流程分析

3.3代碼實現

  1. 創建Java項目,添加 web支持並配置 tomcat

    image-20230202193635101
  2. 導入SpringMVC 開發需要的jar包

    image-20230202194018945
  3. src目錄下創建spring的容器文件applicationContext-mvc.xml(名稱隨意)

    image-20230202204606328
  4. 在WEB-INF/web.xml文件中配置前端控制器(中央控制器)

    <!--配置前端控制器/中央控制器/分發控制器,負責處理所有的應用請求-->
    <servlet>
        <servlet-name>springDispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
       <!--配置屬性 contextConfigLocation,指定 DispatcherServlet 去操作的 spring容器配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext-mvc.xml</param-value>
        </init-param>
        <!--在web項目啟動時,就自動的載入 DispatcherServlet實例,1表示載入的順序號-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springDispatcherServlet</servlet-name>
        <!--1.配置的url-pattern為 /,表示用戶的請求都經過 DispatcherServlet
            2.這樣配置也支持 rest 風格的url請求-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
  5. web目錄下創建login.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>登錄</title>
    </head>
    <body>
    <h3>登錄頁面</h3>
    <%--
        action="login": 這樣寫實際上是相對路徑,而相對路徑是以當前的瀏覽器地址欄而言。
        因此實際上這裡表示的 url 是 http://localhost:8080/web工程路徑/login
    --%>
    <form action="login">
        u:<input name="username" type="text"/> <br/>
        p:<input name="password" type="password"/> <br/>
        <input type="submit" value="登錄"/>
    </form>
    </body>
    </html>
    

    關於web工程路徑,詳見 Javaweb--day18-web工程路徑

  6. 創建 src/com/li/web/UserServlet.java

    package com.li.web;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    /**
     * @author 李
     * @version 1.0
     * 1.如果我們使用了SpringMVC,在一個類上標識 @Controller
     * 2.表示將該類視為一個控制器,註入到容器
     * 3.比原生的 servlet方便很多
     */
    @Controller
    public class UserServlet {
        /**
         * 編寫login方法,響應用戶請求
         * 1.login()方法用於響應用戶的登錄請求
         * 2.@RequestMapping(value = "/login")
         *    類似於我們原生的Servlet配置的url-pattern,不同的是這裡是給方法配置url映射
         * 3.當用戶在瀏覽器地址欄輸入 http://localhost:8080/web工程路徑/login
         *    就能夠訪問當到 login()方法
         * 4.return "login_ok"; 表示返回結果給視圖解析器(InternalResourceViewResolver),
         *    視圖解析器會根據配置,來決定提交到哪一個頁面,如:
         * <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
         *    <property name="prefix" value="/WEB-INF/pages/"/>
         *    <property name="suffix" value=".jsp"/>
         * </bean>
         * 根據上面的配置,return "login_ok"; 就是轉發到 /WEB-INF/pages/login_ok.jsp
         *
         * @return
         */
        @RequestMapping(value = "/login")
        public String login() {
            System.out.println("login ok...");
            return "login_ok";
        }
    }
    
  7. 創建web/WEB-INF/pages/login_ok.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>登錄成功</title>
    </head>
    <body>
    <h1>恭喜,登錄成功!</h1>
    </body>
    </html>
    
  8. 配置容器文件applicationContext-mvc.xml

    <!--指定掃描的包-->
    <context:component-scan base-package="com.li.web"/>
    
    <!--配置視圖解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--配置屬性 suffix(尾碼) 和 prefix(首碼)-->
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    
  9. 整體的文件位置如下:

    image-20230202212119630
  10. 啟動tomcat,訪問 http://localhost:8080/springmvc/login.jsp,訪問成功:

    image-20230202211845571
  11. 點擊登錄,成功訪問到login_ok.jsp

    image-20230202212014130

3.4註意事項和細節說明

  1. 這裡的UserServlet 需要註解成一個@Controller,我們稱之為一個Handler處理器

  2. 在UserServlet 指定 url 時,value 可以省略(註意是省略“value”字元,不是省略值)

    image-20230202212828452
  3. 關於SpringMVC 的 DispatcherServlet 的配置文件,如果不在web.xml中指定spring配置文件,則預設在/WEB-INF/目錄下找名為 springDispatcherServlet-servlet.xml 的spring配置文件。

    image-20230202215055842

    因此,我們將之前的spring容器文件移動到/web-INF/目錄下,並註釋掉web.xml配置的<init-param>,然後將容器文件重命名為 springDispatcherServlet-servlet.xml,重啟tomcat,依然可以成功運行。

4.SpringMVC執行流程

5.@RequestMapping

5.1基本使用

@RequestMapping註解可以指定 控制器(處理器) 的某個方法的請求url

image-20230202212828452

5.2@RequestMapping其他使用方式

5.2.1修飾方法和類

@RequestMapping註解可以修飾方法,還可以修飾類。

當同時修飾類和方法時,請求的url就是組合形式:/類請求值/方法請求值

例子

(1)UserHandler.java:

package com.li.web;

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

/**
 * @author 李
 * @version 1.0
 */
@RequestMapping(value = "/user")
@Controller  //UserHandler就是一個處理器/控制器,註入到spring容器
public class UserHandler {
    /**
     * 1.method = RequestMethod.POST 表示請求buy方法必須是post請求
     * 2.RequestMethod 四個常用的選項 :GET, POST, PUT, DELETE
     * 3.如果沒有配置 RequestMethod,SpringMVC控制器預設支持 get和 post兩種方式
     * 4.buy()方法對應的完整請求url = http://ip:port/web工程路徑/user/buy
     * @return
     */
    @RequestMapping(value = "/buy", method = RequestMethod.POST)
    public String buy() {
        System.out.println("購買商品");
        return "success";
    }
}

(2)request.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>購買商品</title>
</head>
<body>
<h1>購買商品</h1>
<%--
buy()方法對應的完整請求 url = http://ip:port/web工程路徑/user/buy
--%>
<form action="user/buy" method="post">
    購買人:<input type="text" name="username"/><br/>
    購買量:<input type="text" name="nums"/><br/>
    <input type="submit" value="提交"/>
</form>
</body>
</html>

(3)success.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>操作成功</title>
</head>
<body>
<h1>恭喜,操作成功!</h1>
</body>
</html>

在瀏覽器中訪問 http://localhost:8080/springmvc/request.jsp,點擊提交按鈕,結果如下:

image-20230203191741074 image-20230203191828499

5.2.2指定請求方式

  1. @RequestMapping 可以指定請求的方式(post/get/put/delete...),請求方式要和指定方式一致,否則報錯:

    image-20230203192822882
  2. SpringMVC 控制器預設支持get 和 post兩種請求方式,即如果沒有指定 method,可以接收 get 和 post請求

5.2.3指定params和headers,支持簡單表達式

  1. param1:表示請求必須包含名為 param1 的請求參數
  2. !param1:表示請求不能包含名為 param1 的請求參數
  3. param1 != value1:表示請求包含名為 param1 的請求參數,但其值不能為 value1
  4. {"param1 = value1", "param2"}:請求必須包含名為 param1 和 param2 的兩個請求參數,且 param1的值必須為 value1

應用實例

(1)修改UserHandler.java,增加方法

//...
@RequestMapping(value = "/user")
@Controller  
public class UserHandler {
    //...

    /**
     * 1.params = "bookId" 表示請求該方式時,必須給一個名為 bookId的參數
     * 2.search(String bookId){} 表示請求目標方法時,
     *  攜帶的 bookId參數的值會被填充到目標方法的同名形參中
     * @param bookId
     * @return
     */
    @RequestMapping(value = "/find", params = "bookId", method = RequestMethod.GET)
    public String search(String bookId) {
        System.out.println("查詢書籍 bookId=" + bookId);
        return "success";
    }
}

(2)request.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>購買商品</title>
</head>
<body>
<h1>演示params的使用</h1>
<a href="user/find?bookId=100">查詢書籍</a>
</body>
</html>

(3) success.jsp 不變。

(4)redeployTomcat,在瀏覽器地址欄訪問:http://localhost:8080/springmvc/request.jsp,點擊查詢書籍超鏈接,結果如下:

image-20230203203244672 image-20230203203931702

(5)修改UserHandler.java,指定參數的值=100。

image-20230203204158727

(6)修改request.jsp,修改發送的值為200.

(7)redeployTomcat,重新範文request.jsp,點擊超鏈接,這裡可以看到出現異常,因為發送的值和方法指定的值不一樣。

image-20230203204520955

5.2.4支持Ant 風格資源地址

  1. ?:匹配文件名中的一個字元
  2. *:匹配文件名中的任意字元,長度任意
  3. **:匹配多層路徑
  4. Ant 風格的 url 地址舉例:
    • /user/*/createUser:匹配 /user/aaa/createUser、/user/bbb/createUser 等 URL
    • /user/**/createUser:匹配 /user/createUser、/user/aaa/bbb/createUser 等 URL
    • /user/createUser??: 匹配 /user/createUserab、/user/createUsercd 等 URL

應用實例

(1)修改UserHandler.java,增加方法:

//...
@RequestMapping(value = "/user")
@Controller  
public class UserHandler {
    //...
    
    /**
     * 要求:可以匹配 /user/message/aa, /user/message/aa/bb/cc
     *  @RequestMapping(value = "/message/**")
     *  表示可以匹配多層的路徑
     * @return
     */
    @RequestMapping(value = "/message/**")
    public String im(){
        System.out.println("發送消息");
        return "success";
    }
}

(2)修改request.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>購買商品</title>
</head>
<body>
<h1>演示 Ant 風格的請求資源方式</h1>
<a href="user/message/aa">發送消息 1</a><br>
<a href="user/message/aa/bb/cc">發送消息 2</a><br>
</body>
</html>

(3) success.jsp 不變。

(4)redeployTomcat,在瀏覽器地址欄訪問:http://localhost:8080/springmvc/request.jsp,分別點擊兩個超鏈接,都能成功訪問方法,並跳轉到success.jsp

image-20230203211052829 image-20230203211132423 image-20230203211202176

5.2.5可配合@PathVariable映射URL綁定的占位符

  1. @RequestMapping 還可以配合 @PathVariable(路徑變數) 映射 URL 綁定的占位符
  2. 這樣就不需要在url地址欄上帶參數名了,更加簡潔明瞭

例子

request.jsp頁面如下,其中 kristina 和 300 皆為參數值

<h1>占位符的演示</h1>
<a href="user/reg/kristina/300">占位符的演示</a>

(1)修改UserHandler.java,增加方法,註意@PathVariable("username") 不能少

//...
@RequestMapping(value = "/user")
@Controller 
public class UserHandler {
    /**
     * 我們希望目標方法獲取到username和 userid
     * 前端頁面為:<a href="user/reg/kristina/300">占位符的演示</a>
     * 1. value = "/reg/{username}/{userid}"
     *    表示 kristina=>{username} ,300=>{userid}
     * 2.通過 @PathVariable 將變數賦給對應的形參
     */
    @RequestMapping(value = "/reg/{username}/{userid}")
    public String register(@PathVariable("username") String name,
                           @PathVariable("userid") int id) {
        System.out.println("接收到的參數--username=" + name + "--userid=" + id);
        return "success";
    }
}

(2)success.jsp不變

(3)redeployTomcat,訪問 http://localhost:8080/springmvc/request.jsp,點擊超鏈接,成功訪問到success.jsp,後臺輸出如下:

image-20230203213818006

5.2.6註意事項和使用細節

  1. 映射的URL不能重覆,否則報錯:

    Caused by: java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'userHandler' method 
    com.li.web.UserHandler#buy()
    to {POST [/user/buy]}: There is already 'userHandler' bean method
    
  2. 各種請求的簡寫形式

    @RequestMapping(value="/buy",method=RequestMethod.POST) 等價於 @PostMapping(value="buy")

    以此類推,還有 @GetMapping@PostMapping@PutMapping@DeleteMapping

  3. 如果我們確定表單或者超鏈接會提交某個欄位數據,比如email,要求提交的參數名和目標方法的參數名保持一致。

    例如:

    /**
     * hello3(String email){} 如果請求參數有email=xx,就會將傳遞的參數值賦給String email
     * 但是要求名稱保持一致!如果不一致,那麼接收不到數據,而是null
     * @param email
     * @return
     */
    @GetMapping(value = "/hello3")
    public String hello3(String email) {
        System.out.println("hello3= " + email);
        return "success";
    }
    
    image-20230203220142357

5.2.7練習

編寫一個表單,以Post方式提交表單信息,後端編寫ComputerHandler,可以接收到表單信息

image-20230203220422270

computer.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>hw-電腦信息</title>
</head>
<body>
<h1>電腦信息</h1>
<form action="computer/info" method="post">
    品牌:<input type="text" name="brand"/><br/>
    價格:<input type="text" name="price"/><br/>
    數量:<input type="text" name="nums"/><br/>
    <input type="submit" value="提交">
</form>
</body>
</html>

ComputerHandler:

package com.li.web;

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

/**
 * @author 李
 * @version 1.0
 */
@RequestMapping("/computer")
@Controller
public class ComputerHandler {
    //註意接收的參數名要和info方法的形參名一致
    @PostMapping("/info")
    public String info(String brand, String price, String nums) {
        System.out.println("brand=" + brand +
                " price=" + price + " nums=" + nums);
        return "success";
    }
}

redeployTomcat,訪問:http://localhost:8080/springmvc/computer.jsp,輸入信息,點擊提交表單。

image-20230203221946716

後臺輸出:

image-20230203222022381

5.3Postman介面測試工具


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

-Advertisement-
Play Games
更多相關文章
  • 閱識風雲是華為雲信息大咖,擅長將複雜信息多元化呈現,其出品的一張圖(雲圖說)、深入淺出的博文(雲小課)或短視頻(雲視廳)總有一款能讓您快速上手華為雲。更多精彩內容請單擊此處。 摘要:GaussDB性能調優過程需要綜合考慮多方面因素,因此,調優人員應對系統軟體架構、軟硬體配置、資料庫配置參數、併發控制 ...
  • 華為 HMS Core 運動健康服務(HUAWEI Health Kit)提供原子化數據開放。應用在獲取用戶數據授權後,可通過介面訪問運動健康數據,對用戶數據進行讀寫等操作,為用戶提供運動健康類數據服務。 開發者應用在開發和測試階段訪問用戶運動或健康數據時,會有100個用戶的數量限制,需要通過“申請 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 本文用一個簡單的 demo 講解 App端 半屏連續掃碼 的實現方式,包括(條形碼、二維碼等各種各樣的碼)。 我會從實現思路講起,如果你比較急可以直接跳到 動手實現 章節獲取代碼。 開發和運行環境 開發工具:HBuilderX 前端框架: ...
  • Web 頁面可以使用多種方式實現動畫效果,其中最常用的有兩種: CSS 動畫:通過 CSS 中的 transition 和 animation 屬性來實現動畫效果。CSS 動畫實現起來簡單,性能消耗小,支持廣泛。 JavaScript 動畫:通過 JavaScript 代碼來實現動畫效果。JavaS ...
  • At-rules規則是目前CSS中一種常見的語法規則,它使用一個"@"符號加一個關鍵詞定義,後面跟上語法區塊,如果沒有則以分號結束即可。 這種規則一般用於標識文檔、引入外部樣式、條件判斷等等,本文是對該規則的使用總結。 常用規則 @import @import 主要用於從其他樣式表導入新的樣式規則, ...
  • jwt擴展欄位介紹 為了實現業務的定製化需求和開發人員使用的便利,對kc的JWT進行了擴展,這個擴展欄位在解析JWT之後都可以看到。 jwt的payload { "exp": 1675329802, "iat": 1675329622, "jti": "2a80e925-b9ce-464f-822d ...
  • “ DDD設計的目標是關註領域模型而並非技術來創建更好的軟體,假設開發人員構建了一個SQL,並將它傳遞給基礎設施層中的某個查詢服務然後根據表數據的結構集取出所需信息,最後將這些信息提供給構造函數或者Factory,開發人員在做這一切的時候早已不把模型看做重點了,這個整個過程就變成了數據處理的風格 ”... ...
  • 通常,不同的公司里有著不同的編碼規範,主要是從代碼得準確性、穩定性、可讀性等地方著手制定,以提高團隊成員之間的協作效率,這裡主要是列出一些常見的編碼規範。 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...