1、環境搭建 1.1 jar包 <spring.version>4.3.18.RELEASE</spring.version> <!-- spring-mvc begin --> <dependency> <groupId>org.springframework</groupId> <artifac ...
1、環境搭建
1.1 jar包
<spring.version>4.3.18.RELEASE</spring.version>
<!-- spring-mvc begin -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring-mvc end -->
1.2 web.xml
-
前端核心控制器(dispatcherServlet)
- 配置初始化參數,指定springMvc的核心配置文件,目的就是自動創建容器對象
- 啟動級別 1
-
Rest風格 請求轉換過濾器
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<!--前端核心控制器 springMvc框架提供的 -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置初始化參數,指定springMvc的核心配置文件,目的就是自動創建容器對象 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!-- web容器啟動,優先創建前端核心控制器實例對象 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!-- 攔截所有的請求處理,放行jsp -->
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- Rest風格 請求轉換過濾器-->
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
1.3spring-mvc.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 http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 組件掃描 -->
<context:component-scan base-package="com.kgc.mvc"></context:component-scan>
<!-- jsp 視圖解析器 -->
<!-- 作用:當請求處理方法返回一個目標視圖頁面的名稱,視圖解析器會自動將返回的視圖名稱解析為真實的物理視圖(prefix + 目標視圖頁面名稱 + suffix) -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 統一首碼,請求處理方法返回目標視圖名稱時,會被統一增加此首碼目錄(目錄視圖目錄),結尾的 / 不能少 -->
<property name="prefix" value="/WEB-INF/views/"></property>
<!-- 統一尾碼,請求處理方法返回目標視圖名稱時,會被統一增加此尾碼 -->
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
2、Mvc 使用流程
需求,瀏覽器發送請求helloMvc,請求後端處理方法,返回目標success。jsp頁面,併在頁面中顯示 Hello Mvc in KH96;
2.1 HelloMvcController
@Controller //不可以用其他的分層註解替換,只能用controller (1.可以作為一個控制層組件掃描到容器 2.代表一個控制器)
public class HelloMvcController {
//接收helloMvc,跳轉到目標success.jsp
@RequestMapping("/helloMvc") //定義當前請求控制器中,可以處理請求的映射url字元串,前面的 / 可寫 可不寫
public String helloSpringMvc(){
System.out.println("------ 調用 HelloMvcController控制器的 helloSpringMvc() 請求處理方法------");
//目標jsp視圖頁面的名稱(不帶尾碼),區分大小寫
return "success";
}
}
2.2 success.jsp
webapp/WEB-INF/views/success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>成功頁面</title>
</head>
<body>
<h2>KH96 Success Page</h2>
</body>
</html>
2.3 測試
2.4 總結
springMvc使用流程小結:
- 1、Tomcat伺服器啟動時,自動創建前端核心控制器的實例-DispatcherServlet,同時自動讀取配置的spring-mvc.xml核心配置文件,創建容器對象,並掃描組件加入到容器中;
-
即:將控**制器組件**(加了@Controller註解)**加入到容器中**,並**自動解析**加入的**請求控制器**,可以得到**請求處理url**和**請求處理方法**的**映射**;
-
-
2、客戶端瀏覽器,**發送請求**:http://localhost:8080/springmvc-01/helloMvc
-
3、請求會被 **前端核心控制器** **攔截**(匹配到**前端核心控制器**的**url-pattern**)
-
4、**前端核心控制器** ,自動根據請求**url和請求處理方法的映射關係**,進行**映射查找**,如果**找到了**對應關係,自動將**當前請求**發送**給目標請求處理器**的請求處理方法,進行業務處理,如果**沒有找到**,直接**報錯誤404**;
-
5、目標請求處理方法,處理完業務後,**返回**一個目標**視圖的名稱**-success
- 6、返回的目標視圖名稱,仍然會交給 前端核心控制器 進行視圖解析(自動調用容器中添加的視圖解析器解析),會得到一個真實的目標物理視圖頁面(要跳轉的真實頁面),進行響應跳轉目標頁面給瀏覽器顯示;
3、@RequestMapping
3.1 @RequestMapping可以寫的位置
類上和方法上 :
-
類上:相對於web應用根目錄的;
-
方法上:相對於類上的映射,如果類上沒有,就是相對於web應用根目錄;
3.1.1 只用方法上有
@RequestMapping("/testSpringMvcRequestMappingTarget")
public String testMvcRequestMappingTarget(){
//返回成功頁面
return "hello";
}
測試
3.1.2 類上 和 方法上都有
@Controller
@RequestMapping("/kh96")
public class SpringMvcController {
@RequestMapping("/testSpringMvcRequestMappingTarget")
public String testMvcRequestMappingTarget(){
//返回成功頁面
return "hello";
}
}
測試
3.2 method屬性
-
作用:指定當前請求處理方法的請求方式;
-
一旦指定了請求方式,就只能使用指定的請求方式,才可以映射處理,不指定,自動適配(所有方式都可以);
-
method 屬性可以指定多個請求方式;
3.2.1 method = RequestMethod.GET
@RequestMapping(value = "/testSpringMvcRequestMappingMethodGet",method = RequestMethod.GET)
public String testSpringMvcRequestMappingMethodGet(){
System.out.println("----- @RequestMapping method = RequestMethod.GET ------");
//返回成功頁面
return "hello";
}
使用PostMan測試
Get測試
Post測試
3.2.2 method = RequestMethod.POST
@RequestMapping(value = "/testSpringMvcRequestMappingMethodPost",method = RequestMethod.POST)
public String testSpringMvcRequestMappingMethodPost(){
System.out.println("----- @RequestMapping method = RequestMethod.Post ------");
//返回成功頁面
return "hello";
}
Get測試
Post測試
3.2.3 method = {RequestMethod.GET,RequestMethod.POST})
@RequestMapping(value = "/testSpringMvcRequestMappingMethodGetAndPost",method = {RequestMethod.GET,RequestMethod.POST})
public String testSpringMvcRequestMappingMethodGetAndPost(){
System.out.println("----- @RequestMapping method = RequestMethod.Post ------");
//返回成功頁面
return "hello";
}
Get測試
Post測試
3.3 params屬性
指定當前請求處理方法對於請求,必要攜帶的參數:
- 寫法1:指定當前請求必須攜帶的參數名,沒有參數值,可以指定多個(大括弧,逗號分割),如果請求沒有攜帶params的所有參數,請求404;
- 寫法2:指定當前請求必須攜帶的參數名和對應的參數值,可以指定多個(大括弧,逗號分割),如果請求沒有攜帶params指定的所有參數,請求404,如果請求攜帶的參數及對應的參數值不匹配,請求404;
- 註意:攜帶的參數值必須是指定的參數值
- 總結,必須攜帶所有的參數,如果有指定參數值,必須攜帶參數值且攜帶的參數值必須一致;
3.3.1 params ={"uname"}
指定一個參數,不指定參數值;
@RequestMapping(value = "/testSpringMvcRequestMappingParams",params ={"uname"} )
public String testSpringMvcRequestMappingParams(){
System.out.println("----- @RequestMapping 屬性 params------");
//返回成功頁面
return "hello";
}
測試,不帶參數
測試,帶參數,不帶值
測試,帶參數,帶值
3.3.2 params ={"uname=kh96"}
指定一個參數,指定值;
@RequestMapping(value = "/testSpringMvcRequestMappingParams",params ={"uname=kh96"} )
public String testSpringMvcRequestMappingParams(){
System.out.println("----- @RequestMapping 屬性 params------");
//返回成功頁面
return "hello";
}
測試,帶參數,帶值,值不匹配
測試,帶參數,帶值,值匹配
3.3.3 params ={"uname=kh96","upwd=123"}
指定兩個參數,並指定值;
@RequestMapping(value = "/testSpringMvcRequestMappingParams",params ={"uname=kh96","upwd=123"})
public String testSpringMvcRequestMappingParams(){
System.out.println("----- @RequestMapping 屬性 params------");
//返回成功頁面
return "hello";
}
測試,帶一個參數,並指定值
測試,帶兩個參數,並指定第一個值
測試,帶兩個參數,並指定第兩個值
3.4 headers屬性
指定當前請求處理方法對於請求,必要攜帶的請求頭參數,用法和params類似,參數位置不同;
@RequestMapping(value = "/testSpringMvcRequestMappingHeaders",headers = {"token=123"})
public String testSpringMvcRequestMappingHeaders(){
System.out.println("----- @RequestMapping 屬性 headers------");
//返回成功頁面
return "hello";
}
測試,主要觀察參數位置,其他參數規則跟params一致
3.5 @RequestMapping + @PathVariable
請求映射註解:參數占位符註解 @PathVariable:
- 寫法:只能攜帶請求處理方法的形參中,自動將RequestMapping中指定的url使用的占位符綁定參數值,
- 即:請求地址映射為: /url/{參數名},目標請求為:/url/參數值,自動將參數值綁定到指定參數名上;
- 要求1:@RequestMapping("指定參數名")註解請求url中,指定的占位符參數名,必須跟當前請求方法形參中@PathVariable註解指定的參數名一致;否者報錯: Could not find @PathVariable [utel] in @RequestMapping
- 要求2:@RequestMapping,只寫註解,不指定參數名,指定的占位符參數名,必須跟當前請求方法形參名一致(也就是預設為形參名);否則,報錯:Could not find @PathVariable [uemail] in @RequestMapping
3.5.1 測試
3.5.1.1 占位符與@PathVariable註解指定的參數名不一致
@RequestMapping("/testSpringMvcRequestMappingPathVariable/{utel#}/{uemail}")
public String testSpringMvcRequestMappingPathVariable(@PathVariable("utel") String utel,@PathVariable("uemail") String uemail){
System.out.println("----- @RequestMapping + @PathVariable utel:"+utel+",uemail"+uemail+" ------");
//返回成功頁面
return "hello";
}
測試結果
3.5.1.2 占位符與@PathVariable註解指定的參數名一致
@RequestMapping("/testSpringMvcRequestMappingPathVariable/{utel}/{uemail}")
public String testSpringMvcRequestMappingPathVariable(@PathVariable("utel") String utel,@PathVariable("uemail") String uemail){
System.out.println("----- @RequestMapping + @PathVariable utel:"+utel+",uemail"+uemail+" ------");
//返回成功頁面
return "hello";
}
測試結果
3.5.1.3 @PathVariable不指定參數名
測試,占位符與形參不一致
@RequestMapping("/testSpringMvcRequestMappingPathVariable/{utel}/{uemail#}")
public String testSpringMvcRequestMappingPathVariable(@PathVariable("utel") String utel,@PathVariable String uemail){
System.out.println("----- @RequestMapping + @PathVariable utel:"+utel+",uemail"+uemail+" ------");
//返回成功頁面
return "hello";
}
測試結果
測試,占位符與形參一致
@RequestMapping("/testSpringMvcRequestMappingPathVariable/{utel}/{uemail}")
public String testSpringMvcRequestMappingPathVariable(@PathVariable("utel") String utel,@PathVariable String uemail){
System.out.println("----- @RequestMapping + @PathVariable utel:"+utel+",uemail"+uemail+" ------");
//返回成功頁面
return "hello";
}
測試結果
4.Rest風格
- get------查詢select
- post------新增insert
- put------更新update
- delete------刪除delete
相同的請求路徑,通過請求方式判斷請求方法;
自定義請求方式,一定要帶一個名字為_method的參數;
4.1 Rest風格 請求轉換過濾器
<!-- Rest風格 請求轉換過濾器-->
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4.1 get------查詢 select
請求方法
//請求映射註解:rest風格處理-get,查詢select
//@RequestMapping(value = "/testSpringMvcRequestMappingRestGet/{uid}",method = RequestMethod.GET)
@RequestMapping(value = "/testSpringMvcRequestMappingRest/{uid}",method = RequestMethod.GET)
public String testSpringMvcRequestMappingRestGet(@PathVariable("uid") String uid){
System.out.println("----- Rest Get 根據 uid:"+uid+" 查詢用戶詳情 ------");
//返回成功頁面
return "hello";
}
jsp
<h3>Get 請求映射註解:rest風格處理-get,查詢select</h3>
<h3><a href="${pageContext.request.contextPath}/testSpringMvcRequestMappingRest/KH96_01">Test SpringMvc Rest Get</a> </h3>
測試
4.2post------新增 insert
//請求映射註解:rest風格處理-post,新增insert
//@RequestMapping(value = "/testSpringMvcRequestMappingRestPost",method = RequestMethod.POST)
@RequestMapping(value = "/testSpringMvcRequestMappingRest",method = RequestMethod.POST)
public String testSpringMvcRequestMappingRestPost(){
System.out.println("----- Rest Post 新增用戶詳情 ------");
//返回成功頁面
return "hello";
}
jsp
<h3>Post 求映射註解:rest風格處理-post,新增insert</h3>
<form action="testSpringMvcRequestMappingRest" method="post">
<input type="submit" value="Test SpringMvc Rest Post">
</form>
測試
4.3 put------更新 update
//請求映射註解:rest風格處理-put,更新update
//@RequestMapping(value = "/testSpringMvcRequestMappingRestPut",method = RequestMethod.PUT)
@RequestMapping(value = "/testSpringMvcRequestMappingRest",method = RequestMethod.PUT)
public String testSpringMvcRequestMappingRestPut(){
System.out.println("----- Rest Put 更新用戶詳情 ------");
//返回成功頁面
return "hello";
}
jsp
<h3>Put 請求映射註解:rest風格處理-put,更新update</h3>
<form action="testSpringMvcRequestMappingRest" method="post">
<input type="hidden" name="_method" value="put">
<input type="submit" value="Test SpringMvc Rest put">
</form>
測試
4.4 delete------刪除 delete
//請求映射註解:rest風格處理-delete,刪除delete
//@RequestMapping(value = "/testSpringMvcRequestMappingRestDelete/{uid}",method = RequestMethod.DELETE)
@RequestMapping(value = "/testSpringMvcRequestMappingRest/{uid}",method = RequestMethod.DELETE)
public String testSpringMvcRequestMappingRestDelete(@PathVariable("uid") String uid){
System.out.println("----- Rest Delete 根據 uid:"+uid+" 刪除用戶 ------");
//返回成功頁面
return "hello";
}
jsp
<h3>Delete 請求映射註解:rest風格處理-delete,刪除delete</h3>
<form action="testSpringMvcRequestMappingRest/KH96_01" method="post">
<input type="hidden" name="_method" value="delete">
<input type="submit" value="Test SpringMvc Rest delete">
</form>
測試