3.1、環境搭建 創建名為spring_mvc_demo的新module,過程參考2.1節 3.1.1、創建SpringMVC的配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.o ...
3.1、環境搭建
創建名為spring_mvc_demo的新module,過程參考2.1節
3.1.1、創建SpringMVC的配置文件
<?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="org.rain.controller"></context:component-scan>
<!-- 配置Thymeleaf視圖解析器 -->
<bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
<property name="order" value="1"/>
<property name="characterEncoding" value="UTF-8"/>
<property name="templateEngine">
<bean class="org.thymeleaf.spring5.SpringTemplateEngine">
<property name="templateResolver">
<bean
class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
<!-- 視圖首碼 -->
<property name="prefix" value="/WEB-INF/templates/"/>
<!-- 視圖尾碼 -->
<property name="suffix" value=".html"/>
<property name="templateMode" value="HTML5"/>
<property name="characterEncoding" value="UTF-8" />
</bean>
</property>
</bean>
</property>
</bean>
</beans>
3.1.2、配置web.xml
<!--配置SpringMVC的前端控制器DispatcherServlet,對瀏覽器發送的請求統一進行處理-->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--通過初始化參數指定SpringMVC配置文件的位置和名稱-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--將DispatcherServlet的初始化時間提前到伺服器啟動時-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
3.1.3、創建請求控制器
package org.rain.controller;
import org.springframework.stereotype.Controller;
/**
* @author liaojy
* @date 2023/9/21 - 8:47
*/
@Controller
public class TestRequestMappingController {
}
package org.rain.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author liaojy
* @date 2023/9/21 - 8:49
*/
@Controller
public class PortalController {
@RequestMapping("/")
public String portal(){
return "index";
}
}
3.1.4、創建靜態資源目錄及頁面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首頁</title>
</head>
<body>
<h1>index.html</h1>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>成功</title>
</head>
<body>
<h1>success.html</h1>
</body>
</html>
3.1.5、配置tomcat
細節請參考2.6節
3.2、註解的功能
-
從註解名稱上可以看出,@RequestMapping註解的作用就是將請求和處理請求的控制器方法關聯起來,建立映射關係;
-
SpringMVC 的前端控制器(DispatcherServlet)接收到請求後,就會在映射關係中找到對應的控制器方法來處理這個請求;
3.3、註解的位置
3.3.1、源碼定義
從源碼可知,@RequestMapping註解既可以標識在類上,也可以標識在方法上
3.3.2、控制器示例
-
@RequestMapping標識在類上:設置映射請求的基礎信息
-
@RequestMapping標識在方法上:設置映射請求的具體信息
@Controller
@RequestMapping("/test")
public class TestRequestMappingController {
// 此時控制器方法所匹配的請求的請求路徑為:/test/hello
@RequestMapping("/hello")
public String hello(){
return "success";
}
}
3.3.3、請求示例
註意html要引入thymeleaf的約束:xmlns:th="http://www.thymeleaf.org"
<a th:href="@{/hello}">測試/hello請求</a>
<a th:href="@{/test/hello}">測試/test/hello請求</a>
3.3.4、測試效果
3.3.5、雙重位置的作用
可以根據業務需要劃分模塊,在請求路徑中就可以體現出請求的是哪個模塊的資源
3.4、註解的value屬性
@RequestMapping註解的value屬性必須設置,其作用是根據請求路徑來匹配請求
3.4.1、源碼定義
value屬性的別名是path,所以用path屬性代替也可以;
value屬性是字元串數組類型,所以可以設置多個值;
3.4.2、匹配多個請求的控制器示例
普通的servlet,也可以在web.xml的<servlet-mapping>標簽中,設置多個<url-pattern>子標簽,從而實現同樣的效果
@RequestMapping({"/hello","/hi"})
<a th:href="@{/test/hi}">測試/test/hi請求</a>
3.4.3、測試效果
3.5、註解的method屬性
-
@RequestMapping註解的method屬性的作用是,根據請求方式(get或post)匹配請求
-
若當前請求的請求地址滿足value屬性,但是請求方式不滿足method屬性,
則瀏覽器報錯 405:Request method '請求方式' not supported
3.5.1、源碼定義
method屬性是RequestMethod數組類型,所以可以設置多個值;
RequestMethod是枚舉類型,有固定的可選值
3.5.2、控制器示例
@RequestMapping(value = {"/hello","/hi"},method = {RequestMethod.GET,RequestMethod.POST})
3.5.3、請求示例
<!--除了form表單和Ajax設置為post請求之外,其他諸如超鏈接、直接瀏覽器地址欄訪問等均為get請求-->
<a th:href="@{/test/hello}">測試/test/hello請求</a>
<!--表單預設為get請求,使用post請求須顯式設置-->
<form th:action="@{/test/hello}" method="post">
<input type="submit" value="測試@RequestMapping註解的method屬性的post請求">
</form>
3.5.4、測試效果
++++++++++++++++++++++++++分割線++++++++++++++++++++++++++
3.5.5、結合請求方式的派生註解
對於處理指定請求方式的控制器方法,SpringMVC中提供了@RequestMapping的派生註解
-
處理get請求的派生註解-->@GetMapping
-
處理post請求的派生註解-->@PostMapping
-
處理put請求的派生註解-->@PutMapping
-
處理delete請求的派生註解-->@DeleteMapping
// 只處理post請求方式的請求
@PostMapping("/hello")
++++++++++++++++++++++++++分割線++++++++++++++++++++++++++
3.6、註解的params屬性(瞭解)
-
@RequestMapping註解的params屬性的作用是,根據請求參數匹配請求
-
瀏覽器發送的請求的請求參數,必須滿足params屬性的設置(如果有的話)
否則報錯:HTTP狀態 400 - 錯誤的請求
3.6.1、源碼定義
params屬性是字元串數組類型,所以可以設置多個值;
註意:請求必須滿足params屬性所有值的要求。
3.6.2、params屬性的四種表達式
-
"param":表示所匹配的請求的請求參數中,必須攜帶param參數
-
"!param":表示所匹配的請求的請求參數中,必須不能攜帶param參數
-
"param=value":表示所匹配的請求的請求參數中,必須攜帶param參數,且值必須為value
-
"param!=value":表示所匹配的請求的請求參數中,可以不攜帶param參數;若攜帶param參數,其值必須不能為value
3.6.3、控制器示例
@RequestMapping(
value = {"/hello","/hi"},
method = {RequestMethod.GET,RequestMethod.POST},
params = {"username","!password","age=18","gender!=女"}
)
3.6.4、請求示例
<!--使用傳統的?分隔符傳參,雖然是有效果的,但thymeleaf語法會有錯誤提示-->
<a th:href="@{/test/hello?username=admin&age=18}">測試@RequestMapping註解的params屬性(傳統?傳參)</a>
<br><br>
<!--thymeleaf語法的標準傳參方式,註意字元串要用單引號-->
<a th:href="@{/test/hello(username='admin',age=18)}">測試@RequestMapping註解的params屬性(thymeleaf語法傳參)</a>
3.6.5、測試效果
++++++++++++++++++++++++++分割線++++++++++++++++++++++++++
++++++++++++++++++++++++++分割線++++++++++++++++++++++++++
3.7、註解的headers屬性(瞭解)
-
@RequestMapping註解的headers屬性的作用是,根據請求頭信息匹配請求
-
瀏覽器發送的請求的請求頭信息,必須滿足headers屬性的設置(如果有的話)
否則報錯:HTTP狀態 404 - 未找到
3.7.1、源碼定義
headers屬性是字元串數組類型,所以可以設置多個值;
註意:請求必須滿足headers屬性所有值的要求。
3.7.2、headers屬性的四種表達式
-
"header":表示所匹配的請求,必須攜帶header請求頭信息
-
"!header":表示所匹配的請求,必須不能攜帶header請求頭信息
-
"header=value":表示所匹配的請求,必須攜帶header請求頭信息,且值必須為value
-
"header!=value":表示所匹配的請求,可以不攜帶header請求頭信息;若攜帶header請求頭信息,其值必須不能為value
3.7.3、控制器示例
註意:請求頭信息的鍵不區分大小寫,但其值區分大小寫
@RequestMapping(
value = {"/hello","/hi"},
method = {RequestMethod.GET,RequestMethod.POST},
params = {"username","!password","age=18","gender!=女"},
headers = {"referer"}
)
3.7.4、請求示例
Referer請求頭表示請求的來源,本例的請求來源為http://localhost:8080/spring_mvc_demo/
如果是通過瀏覽器地址欄直接訪問,是沒有Referer(請求來源)的
3.8、ant風格的路徑
3.8.1、通配符
-
? :表示任意的單個字元(不包括 ? 和 / ,因為它們是分隔符)
-
* :表示任意個數的任意字元(不包括 ? 和 / )
-
** :表示任意層數的任意目錄(其用法是 /**/xxx 的方式)
3.8.2、? 通配符示例
@RequestMapping("/a?a")
public String testAnt(){
return "success";
}
3.8.3、* 通配符示例
@RequestMapping("/a*a")
public String testAnt(){
return "success";
}
3.8.4、** 通配符示例
@RequestMapping("/**/aa")
public String testAnt(){
return "success";
}
3.9、路徑中的占位符(重點)
-
原始風格的請求(?分隔符前面是路徑,後面是參數):/deleteUser?id=1
-
RESTful 風格的請求(參數是路徑的一部分):/user/delete/1
-
SpringMVC 路徑中的占位符常用於RESTful風格中;
-
在@RequestMapping註解的value屬性中,通過占位符{xxx}表示路徑中傳輸的數據;
-
再通過@PathVariable註解,將占位符所表示的數據賦值給控制器方法的形參。
3.9.1、控制器示例
對於占位符的數據類型,@PathVariable註解會自動轉換賦值給控制器方法的形參
@RequestMapping("/rest/{restfulId}/{restfulUsername}")
public String testRestful(@PathVariable("restfulId") Integer id,@PathVariable("restfulUsername") String username){
System.out.println("id:"+id);
System.out.println("username:"+username);
return "success";
}
3.9.2、請求示例
<a th:href="@{/test/rest/12345/zhangsan}">測試@RequestMapping註解的value屬性中的占位符</a>