SpringMVC(詳細版從入門到精通)未完

SpringMVC介紹

image-20211221143600426

MVC模型

MVC全稱Model View Controller,是一種設計創建Web應用程序的模式。這三個單詞分別代表Web應用程序的三個部分:

  • Model(模型):指數據模型。用于存儲數據以及處理用戶請求的業務邏輯。在Web應用中,JavaBean對象,業務模型等都屬于Model。

  • View(視圖):用于展示模型中的數據的,一般為jsp或html文件。

  • Controller(控制器):是應用程序中處理用戶交互的部分。接受視圖提出的請求,將數據交給模型處理,并將處理后的結果交給視圖顯示。

    image-20211214152348721

SpringMVC

SpringMVC是一個基于MVC模式的輕量級Web框架,是Spring框架的一個模塊,和Spring可以直接整合使用,我們使用的版本是Spring6,所以JDK需要17以上。SpringMVC代替了Servlet技術,它通過一套注解,讓一個簡單的Java類成為處理請求的控制器,而無須實現任何接口。

實時效果反饋

1. 在MVC模型中,Controller指的是

A 數據模型

B 展示數據的視圖

C 應用程序中處理用戶交互的部分

D 以上說法都不對

2. SpringMVC框架可以讓一個簡單JAVA類成為

A 控制器

B 視圖

C 模型

D 以上均可以

答案

1=>C 2=>A

SpringMVC入門案例

接下來我們編寫一個SpringMVC的入門案例

  1. 使用maven創建web項目,補齊包結構。

  2. 引入相關依賴

    <dependencies><!-- Spring核心依賴 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.0.11</version></dependency><!-- SpringMVC --><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>6.0.11</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>6.0.11</version></dependency><!-- Servlet --><dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><version>6.0.0</version><scope>provided</scope></dependency><!-- JSP --><dependency><groupId>jakarta.servlet.jsp</groupId><artifactId>jakarta.servlet.jsp-api</artifactId><version>3.0.0</version><scope>provided</scope></dependency>
    </dependencies>
    
  3. 在web.xml中配置前端控制器DispatcherServlet。

    <web-app><display-name>Archetype Created Web Application</display-name><!--SpringMVC前端控制器,本質是一個Servlet,接收所有請求,在容器啟動時就會加載--><servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcherServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
    </web-app>
    
  4. 編寫SpringMVC核心配置文件springmvc.xml,該文件和Spring配置文件寫法一樣。

    <?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!-- 掃描包 --><context:component-scan base-package="com.itbaizhan"/><!-- 開啟SpringMVC注解的支持 --><mvc:annotation-driven/></beans>
    
  5. 編寫控制器

    @Controller
    public class MyController1 {// 該方法的訪問路徑是/c1/hello1@RequestMapping("/c1/hello1")public void helloMVC(){System.out.println("hello SpringMVC!");}
    }
    
  6. 配置tomcat10啟動項目,訪問 http://localhost:8080/c1/hello1

實時效果反饋

1. 使用SpringMVC必須要配置的是

A 監聽器

B IOC容器

C 前端控制器

D 編碼過濾器

答案

1=>C

SpringMVC執行流程

image-20211222093922306

SpringMVC的組件

  • DispatcherServlet:前端控制器,接受所有請求,調用其他組件。
  • HandlerMapping:處理器映射器,根據配置找到方法的執行鏈。
  • HandlerAdapter:處理器適配器,根據方法類型找到對應的處理器。
  • ViewResolver:視圖解析器,找到指定視圖。

組件的工作流程

  1. 客戶端將請求發送給前端控制器。
  2. 前端控制器將請求發送給處理器映射器,處理器映射器根據路徑找到方法的執行鏈,返回給前端控制器。
  3. 前端控制器將方法的執行鏈發送給處理器適配器,處理器適配器根據方法類型找到對應的處理器。
  4. 處理器執行方法,將結果返回給前端控制器。
  5. 前端控制器將結果發送給視圖解析器,視圖解析器找到視圖文件位置。
  6. 視圖渲染數據并將結果顯示到客戶端。

實時效果反饋

1. 在SpringMVC中,通過組件找到指定視圖

A 前端控制器

B 處理器映射器

C 處理器適配器

D 視圖解析器

2. 在SpringMVC中,通過組件接受所有請求,調用其他組件

A 前端控制器

B 處理器映射器

C 處理器適配器

D 視圖解析器

答案

1=>D 2=>A

SpringMVC封裝參數_簡單數據類型

image-20211221144403791

在Servlet中我們通過request.getParameter(name)獲取請求參數。該方式存在兩個問題:

  • 請求參數較多時會出現代碼冗余。
  • 與容器緊耦合。

而SpringMVC支持參數注入的方式用于獲取請求數據,即將請求參數直接封裝到方法的參數當中。用法如下:

  1. 編寫控制器方法

    // 封裝為簡單數據類型類型參數
    @RequestMapping("/c1/param1")
    public void simpleParam(String username,int age){
    System.out.println(username);
    System.out.println(age);
    }
  2. 訪問該方法時,請求參數名和方法參數名相同,即可完成自動封裝。

    http://localhost:8080/c1/param1?username=bz&age=10

實時效果反饋

1. 在SpringMVC中,接受簡單類型參數時,請求參數名和相同即可自動封裝

A 類名

B 屬性名

C 方法名

D 方法參數名

答案

1=>D

SpringMVC封裝參數_簡單對象

image-20211221144613779

SpringMVC支持將參數直接封裝為對象,寫法如下:

  1. 編寫實體類

    public class Student {private int id;private String name;private String sex;// 省略getter/setter/tostring
    }
    

  2. 編寫控制器方法

    // 封裝為簡單對象類型參數
    @RequestMapping("/c1/param2")
    public void objParam(Student student){System.out.println(student);
    }
    

  3. 訪問該方法時,請求參數名和對象參數的屬性名相同,即可完成自動封裝。

    http://localhost:8080/c1/param2?id=1&name=bz&sex=female

SpringMVC封裝參數_關聯對象

SpringMVC還可以將請求參數封裝為關聯對象,即對象的屬性也是一個對象。寫法如下:

  1. 編寫實體類

    public class Student {private int id;private String name;private String sex;private Address address; // 地址對象// 省略getter/setter/tostring
    }public class Address {private String info; //地址信息private String postcode; //郵編// 省略getter/setter/tostring
    }
    

  2. 編寫控制器方法

    // 獲取關聯對象類型參數
    @RequestMapping("/c1/param3")
    public void objParam2(Student student){  System.out.println(student);
    }
    
  3. 訪問該方法時,請求參數名和方法參數的屬性名相同,即可完成自動封裝。

    http://localhost:8080/c1/param3?id=1&name=bz&sex=female&address.info=beijing&address.postcode=030000

    我們也可以使用表單發送帶有參數的請求:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html><head><title>表單提交</title></head><body><form action="/c1/param3" method="post">id:<input name="id">姓名:<input name="name">性別:<input name="sex">住址:<input name="address.info">郵編:<input name="address.postcode"><input type="submit"></form></body>
    </html>
    

實時效果反饋

1. 在SpringMVC中,接受對象類型參數時,請求參數名和相同即可自動封裝

A 方法參數名

B 方法對象參數的屬性名

C 方法名

D 類名

答案

1=>B

SpringMVC封裝參數_List集合

image-20211221144931683

SpringMVC支持將請求參數封裝為List或Map集合,寫法如下:

封裝為簡單數據類型集合

  1. 編寫控制器方法(封裝為簡單數據類型集合的話,參數前必須添加@RequestParam注解)

    // 封裝為簡單數據類型集合,參數前必須添加@RequestParam注解
    @RequestMapping("/c1/param4")
    public void listParam(@RequestParam List<String> users){ System.out.println(users);
    }
    

    該方式也可以封裝為簡單數據類型數組:

    @RequestMapping("/c1/param5")
    public void listParam2(@RequestParam String[] users){ System.out.println(users[0]); System.out.println(users[1]);
    }
    

  2. 請求的參數寫法

    http://localhost:8080/c1/param4?users=bj&users=sxt

封裝為對象類型集合

SpringMVC不支持將請求參數封裝為對象類型的List集合,但可以封裝到有List屬性的對象中。

  1. 編寫實體類

    public class AddressList {private List<Address> address; // 地址集合// 省略getter/setter/tostring
    }
    
  2. 編寫控制器方法

    // 對象中包含集合屬性
    @RequestMapping("/c1/param6")
    public void listParam3(AddressList addressList){System.out.println(addressList);
    }
    
  3. 請求的參數寫法

    http://localhost:8080/c1/param6?address[0].info=bj&address[0].postcode=100010&address[1].info=sh&address[1].postcode=100011

新版Tomcat中,URL中的方括號必須編碼,[使用%5B代替, ]使用%5D代替,所以URL的路徑寫法如下:

http://localhost:8080/c1/param6?address%5B0%5D.info=bj&address%5B0%5D.postcode=100010&address%5B1%5D.info=sh&address%5B1%5D.postcode=100011

實時效果反饋

1. 在SpringMVC中,接受簡單數據類型List參數,必須在方法參數前加

@RequestParam

@Param

@Value

@List

2. SpringMVC不支持封裝對象類型的List參數,但可以封裝

A 包含List的數組

B 包含List的Map集合

C 包含List的Collection集合

D 有List屬性的對象

答案

1=>A 2=>D

SpringMVC封裝參數_Map集合

同樣,SpringMVC要想把參數封裝到Map集合中,需要封裝到有Map屬性的對象中

  1. 編寫實體類

    public class AddressMap {private Map<String,Address> address;// 省略getter/setter/tostring
    }
    
  2. 編寫控制器方法

    // 對象中包含map屬性
    @RequestMapping("/c1/param7")
    public void mapParam3(AddressMap addressMap){System.out.println(addressMap.getAddress());
    }
    

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/95619.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/95619.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/95619.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue3運行機制同tkinter做類比

把剛才“Vue3 蓋別墅”的故事&#xff0c;和 Python 的 tkinter 做一個“一一對應”的翻譯&#xff0c;你就能瞬間明白兩件事的異同。 為了直觀&#xff0c;用同一棟房子比喻&#xff1a; Vue3 的“網頁” ? tkinter 的“桌面窗口”瀏覽器 ? Python 解釋器 Tcl/Tk 引擎 下面…

Fastadmin后臺列表導出到表格

html中添加按鈕<a href"javascript:;" class"btn btn-success btn-export" title"{:__(導出數據)}" ><i class"fa fa-cloud-download"></i> {:__(導出數據)}</a>對應的js添加代碼處理點擊事件&#xff0c;添加…

Nginx反向代理與緩存實現

1. Nginx反向代理核心配置解析 1.1 反向代理基礎配置結構 Nginx反向代理的基礎配置結構主要包括server塊和location塊的配置。一個典型的反向代理配置示例如下&#xff1a; server {listen 80;server_name example.com;location / {proxy_pass http://backend_servers;proxy_se…

第2節 如何計算神經網絡的參數:AI入門核心邏輯詳解

?? 核心目標:找到最佳w和b! 上期咱們聊了神經網絡就是復雜的"線性變換+激活函數套娃",今天的重頭戲就是:怎么算出讓模型完美擬合數據的w(權重)和b(偏置)!先從最簡單的線性函數說起,一步步揭開神秘面紗 那么如何計算w和b呢?首先明確我們需要的w和b能夠讓…

AutoSar AP平臺功能組并行運行原理

在 AUTOSAR Adaptive Platform&#xff08;AP&#xff09;中&#xff0c;同一個機器上可以同時運行多個功能組&#xff08;Function Groups&#xff09;&#xff0c;即使是在單核CPU環境下。其調度機制與進程調度既相似又存在關鍵差異&#xff0c;具體實現如下&#xff1a;功能…

linux服務器查看某個服務啟動,運行的時間

一 查看服務啟動運行時間1.1 查看啟動時間查看啟動時間&#xff08;精確到秒&#xff09;&#xff1a;ps -p <PID> -o lstart例子如下&#xff1a;ps -p 1234 -o lstart1.2 查詢運行時長ps -p <PID> -o etimeps -p 1234 -o etime1.3 總結

【JS 性能】前端性能優化基石:深入理解防抖(Debounce)與節流(Throttle)

【JS 性能】前端性能優化基石&#xff1a;深入理解防抖&#xff08;Debounce&#xff09;與節流&#xff08;Throttle&#xff09; 所屬專欄&#xff1a; 《前端小技巧集合&#xff1a;讓你的代碼更優雅高效》 上一篇&#xff1a; 【JS 語法】代碼整潔之道&#xff1a;解構賦值…

線性代數 · 直觀理解矩陣 | 空間變換 / 特征值 / 特征向量

注&#xff1a;本文為 “線性代數 直觀理解矩陣” 相關合輯。 英文引文&#xff0c;機翻未校。 如有內容異常&#xff0c;請看原文。 Understanding matrices intuitively, part 1 直觀理解矩陣&#xff08;第一部分&#xff09; 333 March 201120112011 William Gould Intr…

設計模式基礎概念(行為模式):策略模式

概述 策略模式是一種行為設計模式&#xff0c; 它能讓你定義一系列算法&#xff0c; 并將每種算法分別放入獨立的類中&#xff0c; 以使算法的對象能夠相互替換。 主要目的是通過定義相似的算法&#xff0c;替換if else 語句寫法&#xff0c;并且可以隨時相互替換 結構示例 策略…

功能組和功能組狀態的概念關系和區別

在 AUTOSAR Adaptive Platform 中&#xff0c;功能組&#xff08;Function Group&#xff0c;FG&#xff09; 和 功能組狀態&#xff08;Function Group State&#xff09; 是狀態管理&#xff08;SM&#xff09;的核心概念&#xff0c;二者構成靜態邏輯單元與動態行為模式的協…

力扣326:3的冪

力扣326:3的冪題目思路代碼題目 給定一個整數&#xff0c;寫一個函數來判斷它是否是 3 的冪次方。如果是&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。 整數 n 是 3 的冪次方需滿足&#xff1a;存在整數 x 使得 n 3^x 思路 想要是三的冪次方的話將這個…

前瞻性技術驅動,楓清科技助力制造企業借助大模型完成生產力轉化

麥肯錫于近期發布的《技術趨勢展望2025》更清晰地定義了AI的角色與發展方向。報告在不止一個章節總結了基礎模型加速小型化的趨勢&#xff0c;多模態融合成為主流&#xff1a;企業的模型利用從追求“大而全”轉向“小而精”&#xff0c;高效專用小模型成本降低90%的同時保持性能…

如何遠程連接云服務器上mysql

一&#xff1a;使用系統命令查看端口占用# 查看MySQL進程及其端口sudo netstat -tlnp | grep mysql# 或者使用ss命令sudo ss -tlnp | grep mysql# 查看3306端口&#xff08;MySQL默認端口&#xff09;sudo netstat -tlnp | grep 3306出現如下信息&#xff0c;說明端口3306[root…

今日分享:C++模板(全詳解)

&#x1f60e;【博客主頁&#xff1a;你最愛的小傻瓜】&#x1f60e; &#x1f914;【本文內容&#xff1a;C模板 &#x1f60d; 】&#x1f914; -------------------------------------------------------------------------------------------------------------------…

ramdisk內存虛擬盤(一)——前世今生

1990 年代&#xff1a;前因——“硬盤太慢、驅動太多” 背景&#xff1a;早期 Linux 根文件系統要么在軟盤、要么在 IDE 硬盤&#xff0c;內核把對應的軟盤/IDE 驅動編進去即可順利掛載。矛盾出現&#xff1a;隨著 SCSI、PCMCIA、USB、RAID 控制器等百花齊放&#xff0c;如果把…

ETH持續上漲推動DEX熱潮,交易活躍度飆升的XBIT表現強勢出圈

BOSS Wallet 8月15日訊&#xff0c;隨著ETH價格在過去24小時內強勢拉升至4300美元&#xff0c;整個加密市場再度掀起漲勢狂潮&#xff0c;鏈上交易活躍度空前高漲。其中&#xff0c;去中心化交易所平臺迅速成為市場焦點&#xff0c;其平臺活躍度與交易量雙雙上漲&#xff0c;吸…

Stand-In - 輕量級人物一致性視頻生成 高保真視頻人臉交換 ComfyUI工作流 支持50系顯卡 一鍵整合包下載

Stand-In 是一個輕量級、即插即用的身份保護視頻生成框架&#xff0c;只需要上傳一張人物照片&#xff0c;加上一段提示詞&#xff0c;即可生成高度一致性的高保真人物視頻&#xff0c;人臉相似度和自然都幾乎達到100%還原水平。 Stand-In 能把任何一張人臉&#xff08;甚至動漫…

vue3相關基礎

1、ref和reactive的區別兩者都是響應式數據的聲明。Reactive只適用于非基本數據類型&#xff0c;如對象&#xff0c;數組等。而ref是兼容適用于reactive的的數據類型的以及其他數據&#xff0c;靈活性較高。ref聲明的變量取值時需要.value。在<template></template>…

云手機存儲和本地存儲的區別

云手機存儲通常指云存儲&#xff0c;即數據存儲在云端服務器&#xff0c;本地存儲則是將數據存儲在用戶設備硬件中&#xff0c;主要區別體現在存儲位置、訪問方式、依賴條件等多個方面&#xff0c;具體如下&#xff1a;本地存儲主要是將數據存儲在用戶自有設備的物理硬件中&…

【科研繪圖系列】R語言繪制三維曲線圖

文章目錄 介紹 加載R包 數據下載 導入數據 數據預處理 畫圖 系統信息 參考 介紹 【科研繪圖系列】R語言繪制三維曲線圖 加載R包 library(tidyverse) library(ggsignif) library(RColorBrewer) library(dplyr) library(reshape2) library(grid