springMVC初級篇

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實例。

相關文章
相關標籤/搜索