springMVC RequestMapping注解的實(shí)現(xiàn)過(guò)程
什么是springMVC
springMVC是一個(gè)實(shí)現(xiàn)了mvc架構(gòu)模式的web框架。底層基于servlet實(shí)現(xiàn)。
springMVC幫我們做了什么
springMVC幫我們做了什么?與傳統(tǒng)的servlet開(kāi)發(fā)有什么區(qū)別?
- 入口控制:springMVC通過(guò)DispatcherServlet作為入口控制器。負(fù)責(zé)接收請(qǐng)求和分發(fā)請(qǐng)求。而在servlet中。需要自己編寫servlet程序,并在web.xml中配置,才能接收和處理請(qǐng)求。
- 在springMVC中,表單提交時(shí)可以自動(dòng)將表單數(shù)據(jù)綁定到對(duì)應(yīng)的JavaBean對(duì)象中。只需要在控制器方法的參數(shù)列表中聲明該JavaBean對(duì)象即可。無(wú)需手動(dòng)獲取和賦值表單數(shù)據(jù)。而在servlet中需要手動(dòng)完成。
- IoC容器:springMVC通過(guò)IOC容器管理對(duì)象。只需要在配置文件中進(jìn)行相應(yīng)的配置即可獲取實(shí)例對(duì)象。而在servlet中需要手動(dòng)創(chuàng)建對(duì)象實(shí)例。
- 統(tǒng)一處理請(qǐng)求:springMVC提供了攔截器、異常處理器等統(tǒng)一處理請(qǐng)求的機(jī)制。并且可以靈活的配置這些處理器。而在servlet中。需要自行編寫過(guò)濾器、異常處理器等,增加了代碼復(fù)雜度和開(kāi)發(fā)難度。
- 視圖解析:springMVC提供多種視圖模板,如jsp、Freemarker等,并且支持國(guó)際化、主題等特性。而在servlet中需要手動(dòng)處理視圖,增加了代碼復(fù)雜度。
第一個(gè)springmvc程序
- 引入依賴
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>6.1.14</version>
</dependency>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.1.0</version>
<!-- 指定依賴范圍,provided表示依賴由第三方容器提供-->
<!-- 打war包的時(shí)候,這個(gè)依賴不會(huì)打進(jìn)包內(nèi)。-->
<scope>provided</scope>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.5.25</version>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring6</artifactId>
<version>3.1.2.RELEASE</version>
</dependency>
</dependencies>- 在web.xml文件中配置:前端控制器(DispatcherServlet類),所有請(qǐng)求都應(yīng)應(yīng)該經(jīng)過(guò)這個(gè)DispatcherServlet的處理。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- / 表示:除xxx.jsp結(jié)尾的請(qǐng)求路徑之外的所有請(qǐng)求路徑-->
<!-- /* 表示:所有的請(qǐng)求路徑-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>DispatcherServlet是springmvc最核心的類。他是springmvc的前端控制器,主要職責(zé)包括:
- 接收客戶端的HTTP請(qǐng)求:DispatcherServlet監(jiān)聽(tīng)來(lái)自web瀏覽器的HTTP請(qǐng)求。然后根據(jù)強(qiáng)求的url將請(qǐng)求數(shù)據(jù)解析為request對(duì)象
- 處理請(qǐng)求的url:DispatcherServlet將請(qǐng)求的url與處理程序進(jìn)行匹配。確定要調(diào)用哪個(gè)controller來(lái)處理請(qǐng)求
- 調(diào)用相應(yīng)的控制器:DispatcherServlet將強(qiáng)求發(fā)送給控制器處理??刂破鲌?zhí)行業(yè)務(wù)邏輯。然后返回一個(gè)模型對(duì)象(Model)
- 渲染視圖:DispatcherServlet調(diào)用視圖引擎。將模型對(duì)象呈現(xiàn)為用戶可以查看的html頁(yè)面
- 返回響應(yīng)給客戶端:DispatcherServlet將響應(yīng)發(fā)送回瀏覽器。響應(yīng)包括表單、json、xml、html以及其他類型數(shù)據(jù)。
- 編寫控制器
// @Controller 納入ioc容器管理,
// @Controller 是@Component的別名
@Controller
public class FirstController {
@RequestMapping("/test")
public String say(){
// 返回邏輯視圖名稱,會(huì)通過(guò)配置文件設(shè)置的前綴和后綴將邏輯視圖解析成物理視圖進(jìn)行返回。
return "first";
}
}編寫springmvc配置文件(springmvc-servlet.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 https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 組件掃描-->
<context:component-scan base-package="com.ali.controller" />
<!-- 配置視圖解析器-->
<bean id="thymeleafViewResolver" class="org.thymeleaf.spring6.view.ThymeleafViewResolver">
<!-- 設(shè)置視圖編碼字符集-->
<property name="characterEncoding" value="UTF-8" />
<!-- 如果配置多個(gè)視圖解析器,它來(lái)決定優(yōu)先使用哪個(gè)視圖解析器,值越小優(yōu)先級(jí)越高-->
<property name="order" value="1" />
<!-- 使用該模板引擎來(lái)解析、編譯、渲染模板-->
<property name="templateEngine">
<bean class="org.thymeleaf.spring6.SpringTemplateEngine">
<!-- 指定thymeleaf使用的模板解析器。模板解析器負(fù)責(zé)根據(jù)模板位置、模板資源名稱、文件編碼等信息,加載模板并對(duì)其進(jìn)行解析。-->
<property name="templateResolver">
<bean class="org.thymeleaf.spring6.templateresolver.SpringResourceTemplateResolver" >
<!-- 設(shè)置模板文件位置(前綴)-->
<property name="prefix" value="/WEB-INF/templates/" />
<!-- 設(shè)置模板文件后綴,文件擴(kuò)展名不一定是html。也可以是其他。比如txt。大部分是html-->
<property name="suffix" value=".html" />
<!-- 設(shè)置模板類型-->
<property name="templateMode" value="HTML" />
<!-- 設(shè)置編碼字符集-->
<property name="characterEncoding" value="UTF-8" />
</bean>
</property>
</bean>
</property>
</bean>
</beans>配置tomcat,啟動(dòng)tomcat后,訪問(wèn)http://localhost:8080/springmvc/test 。
執(zhí)行流程總結(jié):
- 瀏覽器發(fā)送請(qǐng)求:http://localhost:8080/springmvc/test
- springmvc前端控制器DispatcherServlet接收到請(qǐng)求
- DispatcherServlet根據(jù)請(qǐng)求路徑/test映射到FirstController,調(diào)用該方法
- FirstController處理請(qǐng)求
- FirstController返回視圖邏輯名稱first給視圖解析器
- 視圖解析器找到/WEB-INF/templates/first.html文件,并進(jìn)行解析。生成視圖解析對(duì)象返回給前端控制器DispatcherServlet
- 前端控制器DispatcherServlet響應(yīng)結(jié)果到瀏覽器。
一個(gè)控制器里可以編寫多個(gè)方法。
實(shí)現(xiàn)springmvc的首頁(yè)功能
在controller里添加跳轉(zhuǎn)首頁(yè)的方法。請(qǐng)求路徑設(shè)為“/”
@RequestMapping("/")
public String toIndex(){
return "index";
}
這樣就會(huì)默認(rèn)跳轉(zhuǎn)到index.html這個(gè)首頁(yè)里面,因?yàn)閣eb.xml文件里配置了/屬性。
指定springmvc配置文件的名字和路徑
在web.xml文件中??梢匀缦屡渲?/p>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!-- 指定springmvc配置文件的名字是springmvc.xml
指定springmvc配置文件存放的路徑是類的根路徑-->
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 在web服務(wù)器啟動(dòng)的時(shí)候,就初始化DispatcherServlet
這樣在第一次訪問(wèn)請(qǐng)求的時(shí)候,速度就比較快-->
<load-on-startup>0</load-on-startup>
</servlet>RequestMapping注解
RequestMapping的作用
@RequestMapping用于將請(qǐng)求映射到相應(yīng)的處理方法上,可以將指定url的請(qǐng)求綁定到一個(gè)方法或者類上,從而實(shí)現(xiàn)對(duì)請(qǐng)求的處理和相應(yīng)。
@RequestMapping可以標(biāo)注在類和方法上。
在同一個(gè)web應(yīng)用中,不允許有2個(gè)相同的RequestMapping,否則啟動(dòng)報(bào)錯(cuò)。
RequestMapping注解的value屬性
value屬性填寫的是請(qǐng)求路徑。value屬性是一個(gè)字符串?dāng)?shù)組。表示可以提供多個(gè)路徑。
也就是說(shuō),在springmvc中,可以將多個(gè)不同的請(qǐng)求路徑映射到一個(gè)控制器的同一個(gè)方法上。
@RequestMapping({"/test01","/test_01","test1"})
public String testRequest(){
return "test_01";
}
ant風(fēng)格的value(路徑支持模糊匹配)
ant風(fēng)格的value支持路徑模糊匹配。關(guān)于路徑中的通配符包括:
- ? ?:代表任意一個(gè)字符(除/ ? 之外的其他字符,不能空著)
- *:代表0到n個(gè)任意字符(除/ ? 之外的其他字符)
- ** :代表0到n個(gè)任意字符,并且路徑中可以出現(xiàn)路徑分隔符/
注意: 通配符在使用時(shí),左右不能出現(xiàn)字符,只能是/(spring5及以前的版本適用,spring6會(huì)報(bào)錯(cuò))**
在spring6中 通配符只能出現(xiàn)在末尾。比如:/testAnt/****
@RequestMapping("/x?y/test")
public String testAntValue(){
return "test_ant";
}
value中的占位符
// restful風(fēng)格的url
@RequestMapping("/test/restful/{id}/{name}")
public String testRestful(@PathVariable("id") int id,
@PathVariable("name") String name){
return "test_restful";
}
RequestMapping注解的method屬性
用來(lái)指定請(qǐng)求方式。
method屬性是一個(gè)數(shù)組,所以可以設(shè)置多種請(qǐng)求方式。
// 請(qǐng)求路徑是/test/login,且請(qǐng)求方式是post
@RequestMapping(value = "/test/login", method = RequestMethod.POST)
public String testLogin(){
return "test_login";
}
衍生的Mapping
@PostMapping 默認(rèn)采用post方式處理。
@GetMapping 默認(rèn)采用get方式處理。
web的請(qǐng)求方式
- get(查):獲取資源,不影響數(shù)據(jù)的狀態(tài)和功能。使用url中傳遞參數(shù),或者在HTTP請(qǐng)求的頭部使用參數(shù),服務(wù)器返回請(qǐng)求資源。
- post(增):向服務(wù)器提交資源,可能會(huì)改變數(shù)據(jù)的狀態(tài)和功能。通過(guò)表單方式提交請(qǐng)求體。服務(wù)器接收請(qǐng)求體后,進(jìn)行數(shù)據(jù)處理。
- put(改):更新資源,用于更新指定的資源上所有可編輯內(nèi)容。通過(guò)請(qǐng)求體發(fā)送需要被更新的全部?jī)?nèi)容,服務(wù)器接收數(shù)據(jù)后,將被更新的資源進(jìn)行修改或替換。
- delete(刪):刪除資源。用于刪除指定的資源。將要被刪除的資源標(biāo)識(shí)符放在url中或請(qǐng)求體中。
- head:請(qǐng)求服務(wù)器返回資源的頭部,與get類似。但是返回的信息是頭部信息,不能包含數(shù)據(jù)體。主要用于資源檢測(cè)和緩存控制。
- patch:部分更改請(qǐng)求。當(dāng)請(qǐng)求的資源是可被更改的資源時(shí),請(qǐng)求服務(wù)器對(duì)該資源進(jìn)行部分更新,即每次更新一部分。
- options:請(qǐng)求獲得服務(wù)器支持的請(qǐng)求方法類型。以及支持的請(qǐng)求頭標(biāo)志。“OPTIONS”則返回支持全部方法類型的服務(wù)器標(biāo)志。
- trace:服務(wù)器響應(yīng)客戶端HTTP請(qǐng)求,主要用于調(diào)試和測(cè)試。
- connect:建立網(wǎng)絡(luò)連接。通常用于加密ssl/TLS連接。
get與post的區(qū)別
| get | post |
|---|---|
| 數(shù)據(jù)會(huì)掛在url后面,并且在url后面添加一個(gè)?。數(shù)據(jù)會(huì)回顯在瀏覽器地址欄 | 數(shù)據(jù)在請(qǐng)求體中,不會(huì)回顯在瀏覽器地址欄 |
| 只能發(fā)送普通字符串,并且有長(zhǎng)度限制,不同的瀏覽器限制不同 | 可以發(fā)送任何類型數(shù)據(jù),包括字符串、流媒體等信息。理論上沒(méi)有長(zhǎng)度限制 |
| 適合從服務(wù)端獲取數(shù)據(jù) | 適合向服務(wù)端傳送數(shù)據(jù) |
| 請(qǐng)求是安全的,因?yàn)槭谦@取數(shù)據(jù) | 危險(xiǎn)的。因?yàn)槭切薷姆?wù)器資源 |
| 支持緩存,二次請(qǐng)求會(huì)走瀏覽器緩存,不去請(qǐng)求真正的服務(wù)器 | 不支持緩存 |
RequestMapping注解的params屬性
params用來(lái)設(shè)置請(qǐng)求參數(shù)映射。
params屬性也是一個(gè)數(shù)組,要求請(qǐng)求參數(shù)必須和params數(shù)組中要求的所有參數(shù)完全一致后,才能映射成功。

RequestMapping注解的headers屬性
headers和params原理相同。用法也相同。
當(dāng)前端提交的請(qǐng)求頭信息和后端要求的請(qǐng)求頭信息一致時(shí),才能映射成功。
// 請(qǐng)求路徑是/test/headers,且請(qǐng)求頭中必須包含Referer和Host
@RequestMapping(value = "/test/headers", headers = {"Referer", "Host"})
public String testHeaders(){
return "test_headers";
}到此這篇關(guān)于springMVC RequestMapping注解的實(shí)現(xiàn)過(guò)程的文章就介紹到這了,更多相關(guān)springMVC RequestMapping注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringMVC中@RequestMapping注解的實(shí)現(xiàn)
- SpringMVC?@RequestMapping注解屬性詳細(xì)介紹
- SpringMVC @RequestMapping注解作用詳解
- Java SpringMVC的@RequestMapping注解使用及說(shuō)明
- SpringMVC @RequestMapping注解應(yīng)用方法示例講解
- SpringMVC中@RequestMapping注解用法實(shí)例
- SpringMVC的注解@RequestMapping屬性及使用
- SpringMVC?@RequestMapping注解詳解
- SpringMVC中RequestMapping注解(作用、出現(xiàn)的位置、屬性)
相關(guān)文章
Java中實(shí)現(xiàn)訂單超時(shí)自動(dòng)取消功能(最新推薦)
本文介紹了Java中實(shí)現(xiàn)訂單超時(shí)自動(dòng)取消功能的幾種方法,包括定時(shí)任務(wù)、JDK延遲隊(duì)列、Redis過(guò)期監(jiān)聽(tīng)、Redisson分布式延遲隊(duì)列、RocketMQ延遲消息和RabbitMQ死信隊(duì)列,每種方法都有其優(yōu)缺點(diǎn),可以根據(jù)具體需求選擇合適的方法,感興趣的朋友一起看看吧2025-02-02
修改xml文件再也不用重啟項(xiàng)目mybatis-xmlreload方法
這篇文章主要為大家介紹了修改xml文件再也不用重啟項(xiàng)目mybatis-xmlreload,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
Mybatis Plus框架項(xiàng)目落地實(shí)踐分析總結(jié)
這篇文章主要為大家介紹了Mybatis Plus框架項(xiàng)目落地實(shí)踐分析總結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
SpringBoot actuator 健康檢查不通過(guò)的解決方案
這篇文章主要介紹了SpringBoot actuator 健康檢查不通過(guò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
基于令牌桶的限流器注解的簡(jiǎn)單實(shí)現(xiàn)詳解
令牌桶算法是一種常用的流量控制算法,用于限制請(qǐng)求或事件的發(fā)生速率,這篇文章主要介紹了如何基于令牌桶實(shí)現(xiàn)限流器注解,需要的可以參考一下2023-08-08
SpringBoot注解機(jī)制實(shí)現(xiàn)API多版本共存和灰度發(fā)布的方案
在快速迭代的產(chǎn)品開(kāi)發(fā)中,API接口的更新迭代是常態(tài),然而,舊版本接口往往已經(jīng)有大量用戶依賴,無(wú)法立即停用,那么如何在不影響現(xiàn)有用戶的前提下平滑引入新版本API,本文將介紹如何通過(guò)Spring Boot注解機(jī)制實(shí)現(xiàn)API多版本共存,并基于此實(shí)現(xiàn)灰度發(fā)布,需要的朋友可以參考下2025-06-06

