Spring MVC常用客戶端引數接收方式
Spring MVC常用客戶端引數接收方式
在MVC結構中,控制器元件主要的功能就是接收請求、處理請求、生成響應,接收客戶端傳來的請求引數的往往是控制器要做的第一件事。
Book實體類Book.java
public class Book { private Integer bookId; private String author; //生成Get、Set方法,此處省略 }
一、直接用引數名匹配請求引數
客戶端介面(表單):
<form action="/queryString" method="post"> <input type="text" name="bookId"> <input type="text" name="author"> <input type="submit" value="提交"> </form>
controller層:
@Controller public class ParamPassDemo { @RequestMapping(value="/queryString") public String test1(Integer bookId, String author) { System.out.println("bookId="+bookId+", author="+author); //此處返回的地址為(/WEB-INF/jsp/index.jsp) return "index"; } }
注意:這裡@RequestMapping
中只有value屬性,value可以省略不寫。
客戶端輸入:123,Rose
控制檯輸出:bookId=123, author=Rose
二、通過@RequestParam註解來指定請求引數的name
客戶端介面(表單):
<form action="/queryStringWithSpecName" method="post"> <input type="text" name="bookId" value="321"> <input type="text" name="author" value="Jack"> <input type="submit" value="提交"> </form>
如果表單中的欄位與方法中的引數名一致,可以不需要@RequestParam,Spring會自動處理。
controller層:
@Controller public class ParamPassDemo { @RequestMapping("/queryStringWithSpecName") public String test2((value="bookId",required=false) Integer id, @RequestParam("author") String name) { System.out.println("bookId="+id+", author="+name); return "index"; } }
注意:這裡@RequestMapping
中有兩個屬性,value不能省略。
@RequestParam將請求地址中的引數傳遞給目標方法,在處理方法入參處使用可以把請求引數傳遞給請求方法。
當使用@RequestParam註解時,設定客戶端傳遞的請求引數name="bookId"
和@RequestParam的value值value="bookId"
相匹配後,引數名int id
可以和請求引數不匹配。
客戶端輸入:321, Jack
控制檯輸出:bookId=321, author=Jack
客戶端介面(ajax):
<button onclick="clickMe()">點我</button> <script> function clickMe() { $.ajax({ type : 'POST', url : "/queryStringWithSpecName", data : { "bookId" : 1, "author" : "Jack" }, }); } </script>
controller層:(不變)
客戶端: data:{"author" : "Jack"}
控制檯輸出: bookId=null, author=Jack(如果bookId為int型別,控制檯會丟擲異常)
客戶端: data:{"bookId" : 1}
控制檯輸出: org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'author' is not present
通過required
設定可選引數,required
為false
時表示可以不帶引數,為true
時表示必須帶引數(預設值為true)。
當可選引數不存在時,Spring預設將其賦值為空(null),但由於bookId已定義為基本型別int,所以賦值會失敗。解決方法:採用int包裝類Integer。
三、使用領域物件來接收引數
客戶端介面(表單):
<form action="/queryStringWithDomainObj" method="post"> <input type="text" name="bookId"> <input type="text" name="author"> <input type="submit" value="提交"> </form>
controller層:
@Controller public class ParamPassDemo { @RequestMapping("/queryStringWithDomainObj") public String test3(Book book) { System.out.println("bookId="+book.getBookId()+", author="+book.getAuthor()); return "index"; } }
客戶端輸入:111, Bob
控制檯輸出:bookId=111, author=Bob
四、URL動態引數傳遞(路徑引數)
客戶端介面(超連結):
<a href="/book/1">testPathVariable</a>
controller層:
@Controller public class ParamPassDemo { //@PathVariable可以用來對映URL中的佔位符到目標方法的引數中 @RequestMapping("/book/{bookId}") public String test4(@PathVariable("bookId") Integer bookId) { System.out.println("bookId:" + bookId); return "index"; } }
控制檯輸出:bookId:1
@PathVariable 對映 URL 繫結的佔位符
通過 @PathVariable 可以將 URL 中佔位符引數繫結到控制器處理方法的入參中:URL 中的 {xxx} 佔位符可以通過@PathVariable(“xxx“) 繫結到操作方法的入參中。
五、使用HttpServletRequest獲取請求引數
客戶端介面(表單):
<form action="/queryBook" method="post"> <input type="text" name="bookId"> <input type="text" name="author"> <input type="submit" value="提交"> </form>
controller層:
@Controller public class ParamPassDemo { @RequestMapping("/queryBook") public String test5(HttpServletRequest request) { System.out.println("bookId:" + request.getParameter("bookId")); //此處index.jsp介面在WEB-INF下 return "redirect:/index.jsp"; } }
客戶端輸入:123
控制檯輸出:使用者id:123
六、跳轉到另一個controller方法
客戶端介面(url位址列):
http://localhost:8080/test6?bookId=321
controller層:
@Controller public class ParamPassDemo { @RequestMapping("/test6") public String test6(String bookId){ System.out.println("bookId="+bookId); //使用服務端跳轉的方式轉向到另一個controller //return "forward:queryBook?bookId="+bookId; return "redirect:queryUser?bookId="+bookId; } }
控制檯輸出:bookId=321bookId:321