SpringMVC配置、映射與參數(shù)處理?入門案例詳解
1.SpringMVC概述
? Spring 為展現(xiàn)層提供的基于 MVC 設(shè)計理念的優(yōu)秀的 Web 框架,是目前最主流的MVC 框架之一。
? 一種輕量級的、基于MVC的Web層應(yīng)用框架。它能讓我們對請求數(shù)據(jù)的出來,響應(yīng)數(shù)據(jù)的處理,頁面的跳轉(zhuǎn)等等常見的web操作變得更加簡單方便。

2.入門案例
①導入相關(guān)依賴
<dependencies>
<!-- servlet依賴 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--jsp依賴 -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<!--springmvc的依賴-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<!-- jackson,幫助進行json轉(zhuǎn)換-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!--端口-->
<port>81</port>
<!--項目路徑-->
<path>/</path>
<!--解決get請求中文亂碼-->
<uriEncoding>utf-8</uriEncoding>
</configuration>
</plugin>
</plugins>
</build>②配置web.xml
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--
為DispatcherServlet提供初始化參數(shù)的
設(shè)置springmvc配置文件的路徑
name是固定的,必須是contextConfigLocation
value指的是SpringMVC配置文件的位置
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!--
指定項目啟動就初始化DispatcherServlet
-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<!--
/ 表示當前servlet映射除jsp之外的所有請求(包含靜態(tài)資源)
*.do 表示.do結(jié)尾的請求路徑才能被SpringMVC處理(老項目會出現(xiàn))
/* 表示當前servlet映射所有請求(包含靜態(tài)資源,jsp),不應(yīng)該使用其配置DispatcherServlet
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--亂碼處理過濾器,由SpringMVC提供-->
<!-- 處理post請求亂碼 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<!-- name固定不變,value值根據(jù)需要設(shè)置 -->
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<!-- 所有請求都設(shè)置utf-8的編碼 -->
<url-pattern>/*</url-pattern>
</filter-mapping>③配置SpringMVC
在resources目錄下創(chuàng)建mvc的配置文件spring-mvc.xml
<!--
SpringMVC只掃描controller包即可
-->
<context:component-scan base-package="com.sangeng.controller"/>
<!-- 解決靜態(tài)資源訪問問題,如果不加mvc:annotation-driven會導致無法訪問handler-->
<mvc:default-servlet-handler/>
<!--解決響應(yīng)亂碼-->
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="utf-8"/>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>④創(chuàng)建測試用的jsp頁面
在webapp下創(chuàng)建success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
成功
</body>
</html>⑤編寫Controller
定義一個類,在類上加上@Controller注解,聲明其是一個Controller。主要要創(chuàng)建在之前注解掃描所配置的包下。
然后定義一個方法,在方法上加上@RequestMapping來指定哪些請求會被該方法所處理。
@Controller
public class TestController {
@RequestMapping("/hello")//指定請求路徑是/hello的才能被該方法處理
public String hello(){
System.out.println("hello");
return "/success.jsp";//跳轉(zhuǎn)到success.jsp
}
}3.設(shè)置請求映射規(guī)則@RequestMapping
? 該注解可以加到方法上或者是類上。(查看其源碼可知)
? 我們可以用其來設(shè)定所能匹配請求的要求。只有符合了設(shè)置的要求,請求才能被加了該注解的方法或類處理。
3.1 指定請求路徑
? path或者value屬性都可以用來指定請求路徑。
例如:
? 我們期望讓請求的資源路徑為**/test/testPath的請求能夠被testPath**方法處理則可以寫如下代碼
@Controller
@RequestMapping("/test")
public class TestController {
@RequestMapping("/testPath")
public String testPath(){
return "/success.jsp";
}
}3.2 指定請求方式
? method屬性可以用來指定可處理的請求方式。
例如:
? 我們期望讓請求的資源路徑為**/test/testMethod的POST請求能夠被testMethod**方法處理。則可以寫如下代碼
@Controller
@RequestMapping("/test")
public class TestController {
@RequestMapping(value = "/testMethod",method = RequestMethod.POST)
public String testMethod(){
System.out.println("testMethod處理了請求");
return "/success.jsp";
}
}注意:我們可以也可以運用如下注解來進行替換
- ? @PostMapping 等價于 @RequestMapping(method = RequestMethod.POST)
- ? @GetMapping 等價于 @RequestMapping(method = RequestMethod.GET)
- ? @PutMapping 等價于 @RequestMapping(method = RequestMethod.PUT)
- ? @DeleteMapping 等價于 @RequestMapping(method = RequestMethod.DELETE)
例如:
? 上面的需求我們可以使用下面的寫法實現(xiàn)
@Controller
@RequestMapping("/test")
public class TestController {
@PostMapping(value = "/testMethod")
public String testMethod(){
System.out.println("testMethod處理了請求");
return "/success.jsp";
}
}3.3 指定請求參數(shù)
? 我們可以使用params屬性來對請求參數(shù)進行一些限制??梢砸蟊仨毦哂心承﹨?shù),或者是某些參數(shù)必須是某個值,或者是某些參數(shù)必須不是某個值。
例如:
? 我們期望讓請求的資源路徑為**/test/testParams的GET請求,并且請求參數(shù)中具有code參數(shù)**的請求能夠被testParams方法處理。則可以寫如下代碼
@Controller
@RequestMapping("/test")
public class TestController {
@RequestMapping(value = "/testParams",method = RequestMethod.GET,params = "code")
public String testParams(){
System.out.println("testParams處理了請求");
return "/success.jsp";
}
}
? 如果是要求不能有code這個參數(shù)可以把改成如下形式
@Controller
@RequestMapping("/test")
public class TestController {
@RequestMapping(value = "/testParams",method = RequestMethod.GET,params = "!code")
public String testParams(){
System.out.println("testParams處理了請求");
return "/success.jsp";
}
}
? 如果要求有code這參數(shù),并且這參數(shù)值必須是某個值可以改成如下形式
@Controller
@RequestMapping("/test")
public class TestController {
@RequestMapping(value = "/testParams",method = RequestMethod.GET,params = "code=sgct")
public String testParams(){
System.out.println("testParams處理了請求");
return "/success.jsp";
}
}
? 如果要求有code這參數(shù),并且這參數(shù)值必須不是某個值可以改成如下形式
@Controller
@RequestMapping("/test")
public class TestController {
@RequestMapping(value = "/testParams",method = RequestMethod.GET,params = "code!=sgct")
public String testParams(){
System.out.println("testParams處理了請求");
return "/success.jsp";
}
}
3.4 指定請求頭
? 我們可以使用headers屬性來對請求頭進行一些限制。
例如:
? 我們期望讓請求的資源路徑為**/test/testHeaders的GET請求,并且請求頭中具有deviceType**的請求能夠被testHeaders方法處理。則可以寫如下代碼
@Controller
@RequestMapping("/test")
public class TestController {
@RequestMapping(value = "/testHeaders",method = RequestMethod.GET,headers = "deviceType")
public String testHeaders(){
System.out.println("testHeaders處理了請求");
return "/success.jsp";
}
}? 如果是要求不能有deviceType這個請求頭可以把改成如下形式
@Controller
@RequestMapping("/test")
public class TestController {
@RequestMapping(value = "/testHeaders",method = RequestMethod.GET,headers = "!deviceType")
public String testHeaders(){
System.out.println("testHeaders處理了請求");
return "/success.jsp";
}
}? 如果要求有deviceType這個請求頭,并且其值必須是某個值可以改成如下形式
@Controller
@RequestMapping("/test")
public class TestController {
@RequestMapping(value = "/testHeaders",method = RequestMethod.GET,headers = "deviceType=ios")
public String testHeaders(){
System.out.println("testHeaders處理了請求");
return "/success.jsp";
}
}? 如果要求有deviceType這個請求頭,并且其值必須不是某個值可以改成如下形式
@Controller
@RequestMapping("/test")
public class TestController {
@RequestMapping(value = "/testHeaders",method = RequestMethod.GET,headers = "deviceType!=ios")
public String testHeaders(){
System.out.println("testHeaders處理了請求");
return "/success.jsp";
}
}3.5 指定請求頭Content-Type
? 我們可以使用consumes屬性來對Content-Type這個請求頭進行一些限制。
范例一
? 我們期望讓請求的資源路徑為**/test/testConsumes**的POST請求,并且請求頭中的Content-Type頭必須為 multipart/from-data 的請求能夠被testConsumes方法處理。則可以寫如下代碼
@RequestMapping(value = "/testConsumes",method = RequestMethod.POST,consumes = "multipart/from-data")
public String testConsumes(){
System.out.println("testConsumes處理了請求");
return "/success.jsp";
}
范例二
? 如果我們要求請求頭Content-Type的值必須不能為某個multipart/from-data則可以改成如下形式:
@RequestMapping(value = "/testConsumes",method = RequestMethod.POST,consumes = "!multipart/from-data")
public String testConsumes(){
System.out.println("testConsumes處理了請求");
return "/success.jsp";
}
4.RestFul風格
? RestFul是一種網(wǎng)絡(luò)應(yīng)用程序的設(shè)計風格和開發(fā)方式 ?,F(xiàn)在很多互聯(lián)網(wǎng)企業(yè)的網(wǎng)絡(luò)接口定義都會符合其風格。
主要規(guī)則如下:
- ? 每一個URI代表1種資源
- ? 客戶端使用GET、POST、PUT、DELETE 4個表示操作方式的動詞對服務(wù)端資源進行操作:GET用來獲取資源,POST用來新建資源,PUT用來更新資源,DELETE用來刪除資源;
- ? 簡單參數(shù)例如id等寫到url路徑上 例如: /user/1 HTTP GET:獲取id=1的user信息 /user/1 HTTP DELETE :刪除id=1的user信息
- ? 復雜的參數(shù)轉(zhuǎn)換成json或者xml(現(xiàn)在基本都是json)寫到請求體中。
5.獲取請求參數(shù)
5.1 獲取路徑參數(shù)
? RestFul風格的接口一些參數(shù)是在請求路徑上的。類似: /user/1 這里的1就是id。
? 如果我們想獲取這種格式的數(shù)據(jù)可以使用**@PathVariable**來實現(xiàn)。
范例一
? 要求定義個RestFul風格的接口,該接口可以用來根據(jù)id查詢用戶。請求路徑要求為 /user ,請求方式要求為GET。
? 而請求參數(shù)id要寫在請求路徑上,例如 /user/1 這里的1就是id。
? 我們可以定義如下方法,通過如下方式來獲取路徑參數(shù):
@Controller
public class UserController {
@RequestMapping(value = "/user/{id}",method = RequestMethod.GET)
public String findUserById( @PathVariable("id")Integer id){
System.out.println("findUserById");
System.out.println(id);
return "/success.jsp";
}
}范例二
? 如果這個接口,想根據(jù)id和username查詢用戶。請求路徑要求為 /user ,請求方式要求為GET。
? 而請求參數(shù)id和name要寫在請求路徑上,例如 /user/1/zs 這里的1就是id,zs是name
? 我們可以定義如下方法,通過如下方式來獲取路徑參數(shù):
@Controller
public class UserController {
@RequestMapping(value = "/user/{id}/{name}",method = RequestMethod.GET)
public String findUser(@PathVariable("id") Integer id,@PathVariable("name") String name){
System.out.println("findUser");
System.out.println(id);
System.out.println(name);
return "/success.jsp";
}
}5.2 獲取請求體中的Json格式參數(shù)
? RestFul風格的接口一些比較復雜的參數(shù)會轉(zhuǎn)換成Json通過請求體傳遞過來。這種時候我們可以使用**@RequestBody**注解獲取請求體中的數(shù)據(jù)。
5.2.1 配置
? SpringMVC可以幫我們把json數(shù)據(jù)轉(zhuǎn)換成我們需要的類型。但是需要進行一些基本配置。SpringMVC默認會使用jackson來進行json的解析。所以我們需要導入jackson的依賴(前面我們已經(jīng)導入過)。
<!-- jackson,幫助進行json轉(zhuǎn)換-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>? 然后還要配置注解驅(qū)動(前面已經(jīng)配置過)
<mvc:annotation-driven>
</mvc:annotation-driven>5.2.2 使用
范例一
? 要求定義個RestFul風格的接口,該接口可以用來新建用戶。請求路徑要求為 /user ,請求方式要求為POST。
用戶數(shù)據(jù)會轉(zhuǎn)換成json通過請求體傳遞。
? 請求體數(shù)據(jù)
{"name":"三更","age":15}1.獲取參數(shù)封裝成實體對象
? 如果我們想把Json數(shù)據(jù)獲取出來封裝User對象,我們可以這樣定義方法:
@Controller
public class UserController {
@RequestMapping(value = "/user",method = RequestMethod.POST)
public String insertUser(@RequestBody User user){
System.out.println("insertUser");
System.out.println(user);
return "/success.jsp";
}
}
? User實體類如下:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Integer id;
private String name;
private Integer age;
}
2.獲取參數(shù)封裝成Map集合
? 也可以把該數(shù)據(jù)獲取出來封裝成Map集合:
@RequestMapping(value = "/user",method = RequestMethod.POST)
public String insertUser(@RequestBody Map map){
System.out.println("insertUser");
System.out.println(map);
return "/success.jsp";
}
范例二
? 如果請求體傳遞過來的數(shù)據(jù)是一個User集合轉(zhuǎn)換成的json,Json數(shù)據(jù)可以這樣定義:
[{"name":"三更1","age":14},{"name":"三更2","age":15},{"name":"三更3","age":16}]? 方法定義:
@RequestMapping(value = "/users",method = RequestMethod.POST)
public String insertUsers(@RequestBody List<User> users){
System.out.println("insertUsers");
System.out.println(users);
return "/success.jsp";
}
5.2.3 注意事項
? 如果需要使用**@RequestBody**來獲取請求體中Json并且進行轉(zhuǎn)換,要求請求頭 Content-Type 的值要為: application/json 。
5.3 獲取QueryString格式參數(shù)
? 如果接口的參數(shù)是使用QueryString的格式的話,我們也可以使用SpringMVC快速獲取參數(shù)。
? 我們可以使用**@RequestParam**來獲取QueryString格式的參數(shù)。
5.3.1 使用
范例一
? 要求定義個接口,該接口請求路徑要求為 /testRequestParam,請求方式無要求。參數(shù)為id和name和likes。使用QueryString的格式傳遞。
1.參數(shù)單獨的獲取
? 如果我們想把id,name,likes單獨獲取出來可以使用如下寫法:
? 在方法中定義方法參數(shù),方法參數(shù)名要和請求參數(shù)名一致,這種情況下我們可以省略**@RequestParam**注解。
@RequestMapping("/testRquestParam")
public String testRquestParam(Integer id, String name, String[] likes){
System.out.println("testRquestParam");
System.out.println(id);
System.out.println(name);
System.out.println(Arrays.toString(likes));
return "/success.jsp";
}
? 如果方法參數(shù)名和請求參數(shù)名不一致,我們可以加上**@RequestParam**注解例如:
@RequestMapping("/testRquestParam")
public String testRquestParam(@RequestParam("id") Integer uid,@RequestParam("name") String name, @RequestParam("likes")String[] likes){
System.out.println("testRquestParam");
System.out.println(uid);
System.out.println(name);
System.out.println(Arrays.toString(likes));
return "/success.jsp";
}
2.獲取參數(shù)封裝成實體對象
? 如果我們想把這些參數(shù)封裝到一個User對象中可以使用如下寫法:
@RequestMapping("/testRquestParam")
public String testRquestParam(User user){
System.out.println("testRquestParam");
System.out.println(user);
return "/success.jsp";
}
? User類定義如下:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Integer id;
private String name;
private Integer age;
private String[] likes;
}
? 測試時請求url如下:
http://localhost:81/testRquestParam?id=1&name=xxx&likes=編程&likes=抽煙&likes=燙頭
? 注意:實體類中的成員變量要和請求參數(shù)名對應(yīng)上。并且要提供對應(yīng)的set/get方法。
5.4 相關(guān)注解其他屬性
5.4.1 required
? 代表是否必須,默認值為true也就是必須要有對應(yīng)的參數(shù)。如果沒有就會報錯。
? 如果對應(yīng)的參數(shù)可傳可不傳則可以把去設(shè)置為fasle
例如:
@RequestMapping("/testRquestParam")
public String testRquestParam(@RequestParam(value = "id",required = false) Integer uid,@RequestParam("name") String name, @RequestParam("likes")String[] likes){
System.out.println("testRquestParam");
System.out.println(uid);
System.out.println(name);
System.out.println(Arrays.toString(likes));
return "/success.jsp";
}
5.4.2 defaultValue
? 如果對應(yīng)的參數(shù)沒有,我們可以用defaultValue屬性設(shè)置默認值。
例如:
@RequestMapping("/testRquestParam")
public String testRquestParam(@RequestParam(value = "id",required = false,defaultValue = "777") Integer uid,@RequestParam("name") String name, @RequestParam("likes")String[] likes){
System.out.println("testRquestParam");
System.out.println(uid);
System.out.println(name);
System.out.println(Arrays.toString(likes));
return "/success.jsp";
}
①定義了請求路徑請求方式相同的方法
②json格式數(shù)據(jù)卻無法用@RequestBody獲取
③獲取不到QueryString的參數(shù)
到此這篇關(guān)于SpringMVC配置、映射與參數(shù)處理?入門案例詳解的文章就介紹到這了,更多相關(guān)SpringMVC配置映射參數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringCloudAlibaba極簡入門整合Grpc代替OpenFeign的詳細過程
本文介紹了如何將OpenFeign替換為Grpc進行服務(wù)通信,并通過實際案例展示了如何在Spring?Boot項目中整合Grpc,Grpc提供了高性能、低延遲的服務(wù)間通信,而OpenFeign則注重簡化開發(fā)流程,感興趣的朋友跟隨小編一起看看吧2024-11-11
Java實現(xiàn)提取Word文檔表格數(shù)據(jù)
使用Java實現(xiàn)Word文檔表格數(shù)據(jù)的提取,可以確保數(shù)據(jù)處理的一致性和準確性,同時大大減少所需的時間和成本,下面我們來看看具體實現(xiàn)方法吧2025-01-01
@WebFilter在SpringBoot無效的原因分析和解決方案
使用Ruoyi的demo部署成功后,發(fā)現(xiàn)js、css等靜態(tài)文件都進入了過濾器,但是發(fā)現(xiàn)靜態(tài)文件沒有使用瀏覽器緩存,新建BrowserCacheFilter.java并增加@WebFilter處理,應(yīng)用自動重啟后發(fā)現(xiàn)@WebFilter無效,所以本文給大家介紹了@WebFilter在SpringBoot無效的原因分析和解決方案2024-03-03
idea 實現(xiàn)git rebase操作應(yīng)用場景
本文結(jié)合idea工具進行rebase的各種場景的操作,借助工具更能直觀地觀察到分支之間地操作差異,方便我們理解rebase的各種操作以及場景的使用,對idea git rebase操作知識感興趣的朋友一起看看吧2024-01-01
Swagger-boostrap-ui如何配置用戶名密碼訪問
這篇文章主要介紹了Swagger-boostrap-ui如何配置用戶名密碼訪問,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05
idea配置tomcat,idea配置web下lib的包詳解
這篇文章主要介紹了idea配置tomcat,idea配置web下lib的包,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
springMvc注解之@ResponseBody和@RequestBody詳解
本篇文章主要介紹了springMvc注解之@ResponseBody和@RequestBody詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05

