1. 完成web.xml配置(不會的請參考springMVC入門篇)javascript
2. 使用Controller完成先後端參數傳遞html
2.1 接收普通請求參數前端
/** * @RequestMapping 能夠標註在類上或者方法上:指定URI。若標註在類上,則訪問該類下面的每一個方法路徑都會加上該前綴,如訪問list方法的完整URL是book/list.do */ //註解@Controller表示它是一個控制器 @Controller @RequestMapping("book") public class FirstController { //映射URI請求爲/list.do @RequestMapping("/list.do") public ModelAndView list(String name) { var ret = new ModelAndView();//模型和視圖 System.out.println(name); ret.addObject("name", "這是從前端發送過來的name");//添加模型到視圖上 ret.setViewName("list");//添加視圖名稱(即本身定義的html或jsp頁面的名稱,注意會去加上配置的視圖解析器前綴) return ret;//返回模型和視圖,它會自動去找視圖頁面 } }
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8"%> <html> <head> <title></title> </head> <body> <a href="/book/list.do?name=peppa">這是第一個springMVC測試</a> </body> </html>
Spring MVC比較智能,若是傳遞過來的參數名稱和Http的請求參數名保持一致,那麼無須任何註解就能夠獲取參數。可是,若是不一致是無法獲取到的,這樣的方式容許參數爲空。java
當參數名稱不一致時使用@RequestParam註解獲取參數,將上圖中前端那頁面的name改爲username,再在後端方法參數前面添加@RequestParam註解
注意:一旦添加@RequestParam註解,系統默認該參數不能爲空,若是找不到該參數(爲空或命名不一致)就會報錯,required = false表示能夠爲空web
@Controller @RequestMapping("book") public class FirstController { @RequestMapping("/list.do") public ModelAndView list(@RequestAttribute(name = "username",required = false) String name) { var ret = new ModelAndView(); System.out.println(name); ret.addObject("name", "這是從前端發送過來的name"); ret.setViewName("list"); return ret; } }
固然這是比較簡單,可是可以知足大部分簡單的表單需求。在參數不少的狀況下,好比新增一個用戶可能須要多達十幾個字段,再用這樣的方式,方法的參數就會很是多,這個時候應該考慮使用一個pojo來管理這些參數。在沒有任何註解的狀況下,spring mvc也有映射pojo的能力。spring
2.2 接收pojo實例 json
pojo實例後端
package com.wise.tiger.domain; public class Book { private Integer id; private String title; private String author; private float price; private String publisher; /**********setter and getter*******************/ }
前端表單數組
<form method="post" action="/book/save.do"> title:<input name="title" type="text"><br/> author:<input type="text" name="author"><br/> price:<input type="text" name="price"><br/> publisher:<input type="text" name="publisher"><br/> <input type="submit"> </form>
後端控制器mvc
@RequestMapping("/save.do") public String save1(Book book) { System.out.println(book.getTitle()); System.out.println(book.getAuthor()); return "list"; }
pojo的屬性要和http請求參數名保持一致,即便沒有任何註解它們也能有效傳遞參數。
注意:若是pojo中包含其餘pojo時,如
public class Book { private Integer id; private String author; private String title; private Float price; private String publisher; private User user;//pojo類user包含字段name和password /*******setter and getter********/ }
前端頁面須要改寫爲
<form method="post" action="/book/save.do"> title:<input name="title" type="text"><br/> author:<input type="text" name="author"><br/> price:<input type="text" name="price"><br/> publisher:<input type="text" name="publisher"><br/> username:<input type="text" name="user.name"><br/> password:<input type="password" name="user.password"><br/> <input type="submit"> </form>
2.3 list、map等特殊參數傳遞
假如pojo類中包含list或map等引用類型時,如
public class Book { private Integer id; private String author; private String title; private Float price; private String publisher; private List<User> list; private Map<String,User> map; /*******setter and getter********/ }
前端頁面須要改寫
<form method="post" action="/book/save.do"> title:<input name="title" type="text"><br/> author:<input type="text" name="author"><br/> price:<input type="text" name="price"><br/> publisher:<input type="text" name="publisher"><br/> username:<input type="text" name="list[0].name"><br/> password:<input type="password" name="list[0].password"><br/> username:<input type="text" name="map['key'].name"><br/> password:<input type="password" name="map['key'].password"><br/> <input type="submit"> </form>
命名規則:list[index].pojo屬性名 map["key值"].pojo屬性名
2.4 使用URL傳遞參數
一些網站使用URL的形式傳遞參數,符合RESTful風格(參考轉載的RESTful博客),好比獲取一個圖書信息:/book/1,其中1就是一個參數,它表明的是圖書編號,只是它在url中傳遞,對此SpringMVC也提供了良好的支持。
如今指定一個方法,它將只支持HTTP的GET請求,經過URL:/book/1來獲取圖書信息而且打印出json數據。
@GetMapping("/book/{id}")//等價於註解@RequestMapping(value ="/book/{id}",method=RequestMethod.GET) //{id}表明接收一個參數,@PathVariable(name = "id")表示從url的請求地址中獲取參數 public Book findById(@PathVariable(name = "id") Integer id) { return service.findById(id); }
這樣就能夠經過@PathVariable註解獲取各種URL參數。@PathVariable容許對應的參數爲空。
2.5 傳遞JSON參數
有時候參數的傳遞須要更多的參數,好比查詢圖書能夠根據多種條件進行查詢(名稱,做者,價格,出版社信息等)以及分頁,分頁參數有開始頁和每頁顯示記錄數(限制返回大小的limit),那麼它涉及到多個參數,封裝在BookParams類進行傳遞
package com.wise.tiger.pojo; public class BookParams{ private String title; private String author; private String publisher; private float price; private int pageIndex; private int pageSize; /********************setter and getter**************/ }
客戶端用JavaScript代碼來模擬參數傳遞,往表單插入一段JavaScript代碼:
$(document).ready(function(){ //json參數和BookParams一一對應 var data = {//圖書查詢參數 title: '天龍八部', author: '金庸', price: 500, publisher: '三聯出版社', pageIndex: 1, pageSize: 20 }; $.post({ url: '/book/findBooks', contentType: 'application/json',//告訴傳遞參數類型爲json,不能缺乏 data: JSON.stringify(data),//將json轉爲字符串傳遞 success: function(result){} }); });
後臺就可使用Spring MVC提供的註解@RequestBody接受參數:@RequestBody會將參數封裝成key=value鍵值對進行參數傳遞,這樣Spring Mvc把傳遞過來的json格式字符串參數轉爲pojo,就能夠接收對應json的參數了。
@RequestMapping("/findBooks") public String findBooks(@RequestBody BookParams bookParams){ var booklist = service.findBooks(bookParams); return ""; }
2.6 接收列表數據和表單序列化
在後臺管理系統中,若是要一次性刪除多個圖書信息,那麼確定將一個圖書編號的數組傳遞給後臺,或須要同時新增多本圖書。這都須要用到java的集合或者數組去保存對應的參數
$(document).ready(function(){ //刪除圖書數組 var ids = [1,3,5,10]; $.post({ url: '/book/removeBooks', data: ids, success: function(result){} }); }
@RequestMapping("/removeBooks") public String removeBooks(Integer ids){ var booklist = service.removeBooks(ids); return ""; }
經過表單序列化也能夠將表單數據轉換爲字符串傳遞給後臺(由於一些隱藏表單須要必定的計算),咱們能夠經過序列化去提交表單:
$.post({ url: '/book/commonParam', //將form數據序列化,傳遞給後臺,則將數據以title=xxx&author=ooo傳遞 data: $('form').serialize(), success: function(result){} });
因爲序列化參數的規則變爲了title=xxx&author=ooo,因此獲取參數也是十分容易的。
@RequestMapping("/book/commonParam") public String commonParam(Book book){ System.out.println(book); return "list"; }
這樣就可以獲取序列化表單後的參數了,因爲表單域和pojo類屬性一一對應,因此將參數封裝成一個pojo實例。