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
  • 概述:本文代碼示例演示瞭如何在WPF中使用LiveCharts庫創建動態條形圖。通過創建數據模型、ViewModel和在XAML中使用`CartesianChart`控制項,你可以輕鬆實現圖表的數據綁定和動態更新。我將通過清晰的步驟指南包括詳細的中文註釋,幫助你快速理解並應用這一功能。 先上效果: 在 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • 概述:本示例演示了在WPF應用程式中實現多語言支持的詳細步驟。通過資源字典和數據綁定,以及使用語言管理器類,應用程式能夠在運行時動態切換語言。這種方法使得多語言支持更加靈活,便於維護,同時提供清晰的代碼結構。 在WPF中實現多語言的一種常見方法是使用資源字典和數據綁定。以下是一個詳細的步驟和示例源代 ...
  • 描述(做一個簡單的記錄): 事件(event)的本質是一個委托;(聲明一個事件: public event TestDelegate eventTest;) 委托(delegate)可以理解為一個符合某種簽名的方法類型;比如:TestDelegate委托的返回數據類型為string,參數為 int和 ...
  • 1、AOT適合場景 Aot適合工具類型的項目使用,優點禁止反編 ,第一次啟動快,業務型項目或者反射多的項目不適合用AOT AOT更新記錄: 實實在在經過實踐的AOT ORM 5.1.4.117 +支持AOT 5.1.4.123 +支持CodeFirst和非同步方法 5.1.4.129-preview1 ...
  • 總說周知,UWP 是運行在沙盒裡面的,所有許可權都有嚴格限制,和沙盒外交互也需要特殊的通道,所以從根本杜絕了 UWP 毒瘤的存在。但是實際上 UWP 只是一個應用模型,本身是沒有什麼許可權管理的,許可權管理全靠 App Container 沙盒控制,如果我們脫離了這個沙盒,UWP 就會放飛自我了。那麼有沒... ...
  • 目錄條款17:讓介面容易被正確使用,不易被誤用(Make interfaces easy to use correctly and hard to use incorrectly)限制類型和值規定能做和不能做的事提供行為一致的介面條款19:設計class猶如設計type(Treat class de ...
  • title: 從零開始:Django項目的創建與配置指南 date: 2024/5/2 18:29:33 updated: 2024/5/2 18:29:33 categories: 後端開發 tags: Django WebDev Python ORM Security Deployment Op ...
  • 1、BOM對象 BOM:Broswer object model,即瀏覽器提供我們開發者在javascript用於操作瀏覽器的對象。 1.1、window對象 視窗方法 // BOM Browser object model 瀏覽器對象模型 // js中最大的一個對象.整個瀏覽器視窗出現的所有東西都 ...