-
項目結構:
-
配置文件及其他初始代碼
- web.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" 5 version="4.0"> 6 <servlet> 7 <servlet-name>springMVC</servlet-name> 8 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 9 </servlet> 10 <servlet-mapping> 11 <servlet-name>springMVC</servlet-name> 12 <url-pattern>/</url-pattern> 13 </servlet-mapping> 14 </web-app>
-
- springMVC-servlet.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 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"> 6 7 <context:component-scan base-package="com.iwakan.controller"/> 8 <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 9 <!-- 10 /WEB-INF下的東西不能直接訪問,只能通過轉發進行訪問。 11 轉發和重定向的區別在於,地址發布發生變化,重定向地址發生變化, 12 如果用重定向訪問的化話,又相當於直接訪問WEB-INF下的頁面了 13 --> 14 <property name="prefix" value="/WEB-INF/view/"/> 15 <property name="suffix" value=".jsp"></property> 16 </bean> 17 </beans>
-
-
TestController.java
-
1 package com.iwakan.controller; 2 3 import org.springframework.stereotype.Controller; 4 import org.springframework.web.bind.annotation.RequestMapping; 5 6 @Controller 7 public class TestController { 8 /** 9 * /test中的‘/’加不加都可以: 10 * 加上【/】代表訪問當前項目下 11 * 不加【/】代表訪問當前目錄下 12 * 因為src和web的訪問級別是一樣的 13 */ 14 15 @RequestMapping("/test") 16 public String test(){ 17 return "success"; 18 } 19 }
-
- index.jsp
1 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 <html> 3 <head> 4 <title>init</title> 5 </head> 6 <body> 7 <a href="/test">測試springMVC</a> 8 </body> 9 </html>
-
內容講解
-
@RequestMapping
- 作用:設置請求映射,把請求和控制層中的方法設置映射關系,當請求路徑和@RequestMapping的value屬性一致時,即注解所標注的方法即為處理請求的方法
- 下面為@RequestMapping的源碼:
1 @Target({ElementType.METHOD, ElementType.TYPE}) 2 @Retention(RetentionPolicy.RUNTIME) 3 @Documented 4 @Mapping 5 public @interface RequestMapping { 6 String name() default ""; 7 8 @AliasFor("path") 9 String[] value() default {}; 10 11 @AliasFor("value") 12 String[] path() default {}; 13 14 RequestMethod[] method() default {}; 15 16 String[] params() default {}; 17 18 String[] headers() default {}; 19 20 String[] consumes() default {}; 21 22 String[] produces() default {}; 23 }
-
-
參數:
- method:
- 用來設置請求方式,只有客戶端發送的請求的方式和method的值一致時,才能處理請求
- 請求方式:GET(查詢),POST(添加),DELETE(刪除),PUT(修改)
- value:
- 用來設置請求路徑,當請求路徑和@RequestMapping的value屬性一致時,才能處理請求
- params:
- 用來設置客戶端傳到服務端的參數,支持表達式
-
例如:params="username":表示發送過來的請求參數中要包含username
params="!username":表示發送過來的請求參數中不能包含username
params="username=admin":表示發送過來的請求參數中要包含username=admin
params="username!=admin":表示發送過來的請求參數中要包含username!=admin
params={"username","age!=12"}:表示發送過來的請求參數中要包含username並且age不等12的參數
- heards:
- headers:用來設置請求頭信息,所發送的請求的請求頭信息一定要和headers屬性中設置的一致
- method:
-
關於上面參數的代碼案例:
index.jsp
1 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 <html> 3 <head> 4 <title>init</title> 5 </head> 6 <body> 7 <a href="/test">測試GET</a> 8 <form action="/test" method="post"> 9 <input type="submit" value="測試POST"> 10 </form> 11 </body> 12 </html>
TestController.java
1 package com.iwakan.controller; 2 3 import org.springframework.stereotype.Controller; 4 import org.springframework.web.bind.annotation.RequestMapping; 5 import org.springframework.web.bind.annotation.RequestMethod; 6 7 @Controller 8 public class TestController { 9 /** 10 * /test中的‘/’加不加都可以: 11 * 加上【/】代表訪問當前項目下 12 * 不加【/】代表訪問當前目錄下 13 * 因為src和web的訪問級別是一樣的 14 * 15 *@RequestMapping: 16 * 設置請求映射,把請求和控制層中的方法設置映射關系, 17 * 當請求路徑和@RequestMapping的value屬性一致時, 18 * 即注解所標注的方法即為處理請求的方法 19 * 20 * method:用來設置請求方式,只有客戶端發送請求的方式和method的值一致時,才能處理請求 21 * 請求方式:GET(查詢),POST(添加),DELETE(刪除),PUT(修改) 22 * 23 * 24 */ 25 26 @RequestMapping(value = "/test",method = RequestMethod.GET) 27 public String testGet(){ 28 System.out.println("GET請求的方法"); 29 return "success"; 30 } 31 32 @RequestMapping(value = "/test",method = RequestMethod.POST) 33 public String testPost(){ 34 System.out.println("POST請求的方法"); 35 return "success"; 36 } 37 }
-
- 客戶端發出請求,相同的請求路徑,服務端會根據請求方法的不同選擇不同的處理方法,
- 例如當客戶端以GET方式發出請求時,控制層會以testGet()進行處理,客戶端以POST方式發出請求時,控制層會用testPost()放到進行處理。
- 根據傳遞的參數的不同映射不同處理方法
- 需求:發送過來的請求參數中要包含username並且age不等12時才進行處理
TestController.java
1 package com.iwakan.controller; 2 3 import org.springframework.stereotype.Controller; 4 import org.springframework.web.bind.annotation.RequestMapping; 5 import org.springframework.web.bind.annotation.RequestMethod; 6 7 @Controller 8 public class TestController { 9 /** 10 * /test中的‘/’加不加都可以: 11 * 加上【/】代表訪問當前項目下 12 * 不加【/】代表訪問當前目錄下 13 * 因為src和web的訪問級別是一樣的 14 * 15 *@RequestMapping: 16 * 設置請求映射,把請求和控制層中的方法設置映射關系, 17 * 當請求路徑和@RequestMapping的value屬性一致時, 18 * 即注解所標注的方法即為處理請求的方法 19 * 20 * method:用來設置請求方式,只有客戶端發送請求的方式和method的值一致時,才能處理請求 21 * 請求方式:GET(查詢),POST(添加),DELETE(刪除),PUT(修改) 22 * 23 * params:用來設置客戶端傳到服務器的參數,支持表達式 24 * 例如:params="username":表示發送過來的請求參數中要包含username 25 * params="!username":表示發送過來的請求參數中不能包含username 26 * params="username=admin":表示發送過來的請求參數中要包含username=admin 27 * params="username!=admin":表示發送過來的請求參數中要包含username!=admin 28 * params={"username","age!=12"}:表示發送過來的請求參數中要包含username並且age不等12的參數 29 * 30 * 31 */ 32 33 @RequestMapping(value = "/test",method = RequestMethod.GET,params = {"username","age=12"}) 34 public String testGet(String username,int age){ 35 System.out.println("GET請求的方法"); 36 System.out.println("username=="+username+",age=="+age); 37 return "success"; 38 } 39 }
- 根據請求頭的不同映射不同的處理方法
TestController.java
1 package com.iwakan.controller; 2 3 import org.springframework.stereotype.Controller; 4 import org.springframework.web.bind.annotation.RequestMapping; 5 import org.springframework.web.bind.annotation.RequestMethod; 6 7 @Controller 8 public class TestController { 9 /** 10 * /test中的‘/’加不加都可以: 11 * 加上【/】代表訪問當前項目下 12 * 不加【/】代表訪問當前目錄下 13 * 因為src和web的訪問級別是一樣的 14 * 15 * @RequestMapping: 設置請求映射,把請求和控制層中的方法設置映射關系, 16 * 當請求路徑和@RequestMapping的value屬性一致時, 17 * 即注解所標注的方法即為處理請求的方法 18 * <p> 19 * method:用來設置請求方式,只有客戶端發送請求的方式和method的值一致時,才能處理請求 20 * 請求方式:GET(查詢),POST(添加),DELETE(刪除),PUT(修改) 21 * <p> 22 * params:用來設置客戶端傳到服務器的參數,支持表達式 23 * 例如:params="username":表示發送過來的請求參數中要包含username 24 * params="!username":表示發送過來的請求參數中不能包含username 25 * params="username=admin":表示發送過來的請求參數中要包含username=admin 26 * params="username!=admin":表示發送過來的請求參數中要包含username!=admin 27 * params={"username","age!=12"}:表示發送過來的請求參數中要包含username並且age不等12的參數 28 * <p> 29 * headers:用來設置請求頭信息,所發送的請求的請求頭信息一定要和headers屬性中設置的一致 30 */ 31 @RequestMapping(value = "/test", method = RequestMethod.POST, params = {"username", "age=13"},headers = {"Accept-Language=zh-CN,zh;q=0.9"}) 32 public String testPost(String username, int age) { 33 System.out.println("POST請求的方法"); 34 System.out.println("username==" + username + ",age==" + age); 35 return "success"; 36 } 37 }
-
-
@RequestMapping作用位置
- @Target({ElementType.METHOD, ElementType.TYPE}):既可以加在類上也可以加在方法上
- 訪問:若類上和方法上都加有,應該一層一層的訪問,先訪問類再訪問方法
-
1 package com.iwakan.controller; 2 3 import org.springframework.stereotype.Controller; 4 import org.springframework.web.bind.annotation.RequestMapping; 5 import org.springframework.web.bind.annotation.RequestMethod; 6 7 @Controller 8 @RequestMapping("/mvc") 9 public class TestController { 10 /** 11 * /test中的‘/’加不加都可以: 12 * 加上【/】代表訪問當前項目下 13 * 不加【/】代表訪問當前目錄下 14 * 因為src和web的訪問級別是一樣的 15 * 16 * @RequestMapping: 設置請求映射,把請求和控制層中的方法設置映射關系, 17 * 當請求路徑和@RequestMapping的value屬性一致時, 18 * 即注解所標注的方法即為處理請求的方法 19 * @RequestMapping位置: 既可以放在類上,也可以放在方法上 20 * 訪問時應該一層一層進行訪問,先訪問類在訪問方法 21 * 22 * <p> 23 * method:用來設置請求方式,只有客戶端發送請求的方式和method的值一致時,才能處理請求 24 * 請求方式:GET(查詢),POST(添加),DELETE(刪除),PUT(修改) 25 * <p> 26 * params:用來設置客戶端傳到服務器的參數,支持表達式 27 * 例如:params="username":表示發送過來的請求參數中要包含username 28 * params="!username":表示發送過來的請求參數中不能包含username 29 * params="username=admin":表示發送過來的請求參數中要包含username=admin 30 * params="username!=admin":表示發送過來的請求參數中要包含username!=admin 31 * params={"username","age!=12"}:表示發送過來的請求參數中要包含username並且age不等12的參數 32 * <p> 33 * headers:用來設置請求頭信息,所發送的請求的請求頭信息一定要和headers屬性中設置的一致 34 */ 35 36 @RequestMapping(value = "/test") 37 public String testPost(String username, int age) { 38 System.out.println("POST請求的方法"); 39 System.out.println("username==" + username + ",age==" + age); 40 return "success"; 41 } 42 }
訪問路徑為:http://localhost:8080/mvc/test
index.jsp
1 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 <html> 3 <head> 4 <title>init</title> 5 </head> 6 <body> 7 <a href="/mvc/test">測試GET</a> 8 <form action="/mvc/test" method="post"> 9 用戶名:<input name="username" ><br> 10 年 齡:<input name="age" ><br> 11 <input type="submit" value="測試POST"> 12 </form> 13 </body> 14 </html>
-
-
RequestMapping支持Ant路徑風格
- Ant風格資源地址支持3中匹配符
-
?:匹配文件名中的一個字符
*:匹配文件名中的任意字符
**:匹配多層路徑
-
-
- @RequestMapping還支持Ant風格的URL
-
/user/*/createUser
匹配/user/aaa/createUser,/user/bbb/createUser等URL
/user/**/createUser
匹配/user/createUser,/user/aaa/bbb/creatUser等URL
/user/createUser??
匹配/user/createUseraa,/user/createUserbb等URL
TestController.java
1 package com.iwakan.controller; 2 3 import org.springframework.stereotype.Controller; 4 import org.springframework.web.bind.annotation.RequestMapping; 5 import org.springframework.web.bind.annotation.RequestMethod; 6 7 @Controller 8 @RequestMapping("/user") 9 public class TestController { 10 11 /** 12 * SpringMVC支持Ant方式的請求路徑 13 * 在Ant中,有三種匹配符 14 * 【*】:任意字符 15 * 【?】:任意一個字符 16 * 【**】:任意多層目錄 17 */ 18 @RequestMapping("/*/createUser??") 19 public String createUser(){ 20 return "success"; 21 } 22 }
TestController.java
1 package com.iwakan.controller; 2 3 import org.springframework.stereotype.Controller; 4 import org.springframework.web.bind.annotation.RequestMapping; 5 import org.springframework.web.bind.annotation.RequestMethod; 6 7 @Controller 8 @RequestMapping("/user") 9 public class TestController { 10 11 /** 12 * SpringMVC支持Ant方式的請求路徑 13 * 在Ant中,有三種匹配符 14 * 【*】:任意字符 15 * 【?】:任意一個字符 16 * 【**】:任意多層目錄 17 */ 18 @RequestMapping("/**/createUser") 19 public String createUser(){ 20 return "success"; 21 } 22 }
-
-
springMVC映射請求占位符@PathVariable注解
-
@PathVariable:帶占位符的URL是spring3.0新增的功能,該功能在springMVC向Rest目標挺進發展過程中具有里程牌的意義。
通過@PathVariable可以將URL中占位符參數綁定到控制器處理方法的入參中
例如:@RequestMapping("/testRest/{id}/{username}")
public String testRest(@PathVariable("id") Integer id, @PathVariable("username") String username){
URL中的{id},{username}占位符可以通過@PathVariable("id"),@PathVariable("username")綁定到操作方法的入參 Integer id,String username中
1 package com.iwakan.controller; 2 3 import org.springframework.stereotype.Controller; 4 import org.springframework.web.bind.annotation.PathVariable; 5 import org.springframework.web.bind.annotation.RequestMapping; 6 import org.springframework.web.bind.annotation.RequestMethod; 7 8 @Controller 9 @RequestMapping("/user") 10 public class TestController { 11 12 /** 13 * 以前:localhost:8080/user/testRest?id=1001&username=admin 14 * 現在:localhost:8080/user/testRest/1001/admin 15 * 16 * @PathVariable: 可以將請求url中的請求參數傳遞到請求方法的入參中 17 */ 18 @RequestMapping("/testRest/{id}/{username}") 19 public String testRest(@PathVariable("id") Integer id, @PathVariable("username") String username) { 20 System.out.println("id==" + id + ",username==" + username); 21 return "success"; 22 } 23 }