jsp与spring mvc后台controller间参数传递处理之总结
在編程過程中,最容易出現問題及卡殼的地方,往往是各層之間接縫處,接縫處往往存在著各種各樣的參數傳遞,數據轉換和格式化,參數很好的傳遞并正確接收過來之后就是復雜邏輯之間的處理了,所以為了避免多種問題占用時間,提高編程效率故而做此總結,此處jsp和springmvc'后臺controller間參數的傳遞、數據轉換是各層間傳遞關鍵處的關鍵,把握好此處,就能高效很多。
首先:前臺傳遞數據的主要形式和類型大概有以下幾點:
傳遞形式有:a標簽的url,表單傳遞,ajax類型傳遞
傳遞類型有:字符串,對象,數組,json,xml等
在數據傳遞時,往往是在某一種傳遞形式下傳遞某一類型的數據,故而,之后的總結就按照傳遞形式來進行:
1.a標簽url請求傳遞往往是地址+參數(字符串、對象等)的形式,比如www.baidu.com?id=123456&name=zhangsan&password=666666,傳遞方法是get;此形式傳遞往往以基本數據類型進行傳遞。
2.表單請求傳遞,通常是以action為地址進行傳遞,傳遞方法采用post,其中有二進制數據如上傳文件,需要更改屬性enctype=“multipart/form-data”;此形式傳遞主要以基本數據類型或對象進行傳遞。
3.ajax請求傳遞,主要以ajax所特有的形式進行傳遞,通常傳遞方法根據要求選擇post或者get,穿的數據類型MINI都可以,相應參數也要進行設置,本篇主要說說json和數組吧,后續根據情況補充,因為ajax本身也算是一個獨立的技術。
其次:后臺controller接收數據,對于接收參數在表現上主要是注解的應用,故而,以下主要是介紹以下注解作用
controller接收數據往往是通過注解進行反射接收,所有不同形式不同類型的數據一定要采用正確的注解。
一、url和表單傳參相對常規,主要用的注解就是@RequestParam,@ModelAttribute,@PathVariable
@RequestMapping(value="對應請求的url",method=RequestMethod.(大寫GET/POST/PUT/DELET等)--不寫代表支持所有方式的請求)
@RequestParam(value=""),意義是:將制定的請求參數賦值給方法中的形參,主要綁定接收url非對象參數或者是對象中各個具體字段參數(如方法中形參列表中列出對象中的某幾個)。
@PathVariable 方便的獲得請求url中的動態參數,但是僅僅支持一個屬性值(就是該注解只有value一個屬性),類型為String。
@ModelAttribute 注解作用是將請求參數綁定到Model對象上,只支持一個屬性value,類型為String,該注解作用可以理解為將請求參數設置到Model中,這樣當返回一個界面后就可以從Model中取得相應的值。
該注解的使用特別注意一點:被@ModelAttribute注解的方法會在整個Controller中每個方法前被執行,因此在一個Contrller映射到多個URL時,要謹慎使用,因此這個特點,所以可能不常用。常用的會是注解方法中的某個參數用來傳遞POJO
(基于紅色字體,往往采用該注解的controller中只有兩個方法,一個是被注解的該方法,另一個則是請求的實際url的方法)該注解使用的方式比較多主要有:
@ModelAttribute(value="")注釋返回具體類的方法,其中value的值用來指定model的屬性名稱,而形參注解用@RequestParam(value="")綁定請求參數,@model屬性值往往是被注解方法的返回值。
@ModelAttribute注解Void返回值的方法,形參中需要Model來設置請求的信息,采用model.addAttribute("",value),不需要return語句,跳轉后可以通過request作用域訪問到相應數據。
@ModelAttribute注釋返回具體類的方法,這里model屬性沒有被指定,被注解的方法返回類型隱含表示,如果備注解方法返回的是User類型,name這個model屬性名稱就是user。
@ModelAttribute和@RequestMapping一同使用時注解一個方法,此時返回值不是視圖名,而是Model的屬性值,視圖名稱是RequestMapping的value值。
@ModelAttribute注解一個方法的參數(非被注解的方法形參),主要作用可以理解為,在非被注解方法中修改Model的相關屬性。也可以作為接收表單傳遞的pojo
最終在跳轉后都能夠通過request作用域訪問到相應數據。
二、ajax參數傳遞
ajax傳遞參數主要有基本數據類型、基本對象類型(不含集合等)、特殊對象類型(含集合)、數組類型和json類型。經常用json的方式傳遞
要使用json,首先需要對應支持的js文件和jar包,
json2.js放入相應工程中,并且在jsp頁面引入路徑
jackson-core
jackson-databind
ajax傳遞參數及接收很多童鞋已經總結的挺到位,以下借鑒一下直接拿來,以免不好找.
參考1、http://blog.csdn.net/Huangcsdnjava/article/details/76072795
這里有@ResponseBody和@RequestBody 是很好很重要的兩個注解
@ResponseBody可以將結果(一個包含字符串和JavaBean的Map),轉換成JSON。
@RequestBody 注解前臺只需要向 Controller 提交一段符合格式的 JSON,Spring 會自動將其拼裝成 bean。
Spring這個轉換是靠org.codehaus.jackson這個組件來實現的,所有需要引入jackson-core-asl和org.codehaus.jackson兩個jar包
通過ajax傳遞參數給springmvc,經常會因為 參數類型太復雜,或者根本不知道springmvc都支持哪些類型轉換,導致后臺接收出現各種問題。如果書寫格式沒有問題仍然接受參數報錯,大部分是因為springmvc默認無法支持該種格式的json轉換導致的
現在一句話解決,就是用@RequestBody注解接收
案例1:簡單數組 idList[]
ajax
$("#test1").on("click",function(){
var idList = new Array();
idList.push("1");
idList.push("2");
idList.push("3");
$.post("/mvc/client1/test1",{idList:idList})
});
java
/**
* 簡單類型list
* explain:包含string int date 等屬性
*/
@RequestMapping("/test1")
@ResponseBody
public void test1(@RequestParam("idList[]") List<Integer> idList){
for(Integer i: idList){
System.out.println(i);
}
}
案例1中要注意,當你ajax傳遞一個很簡單的數組,本以為后臺能夠接受到,卻總是報錯,很可能的原因是:http請求傳遞數組的時候,為了區別是一個數組,會在數組名稱后面加上中括號“[]”,所以后臺接受的時候用@RequestParam告訴方法,你要的idList實際上是idList[]就可以了
案例:2:簡單對象User (包含id,username)
ajax
$("#test2").on("click",function(){
var id =1;
var username ="fangxin";
$.post("/mvc/client1/test2",{id:id,username:username,birthday:new Date()})
});
java
@RequestMapping("/test2")
@ResponseBody
public void test2(User user){
System.out.println(user.getId());
System.out.println(user.getUsername());
System.out.println(user.getBirthday());
}
這就是最常見的傳遞參數,如果一個對象的屬性都是簡單類型,那基本沒什么問題
案例3:復雜對象User (包含id,username,String[],List<Person>)
ajax
$("#test3").on("click",function(){
var user = {
id:1,
username:"fangxin",
birthday:new Date(),
luckyNums:[1,2,3],
friends:[
{name:"zhangsan"},
{name:"lisi"}
]
};
$.ajax({
type: "POST",
url:"/mvc/client1/test3",
data: JSON.stringify(user),
contentType:"application/json"
})
});
java
/**
* 復雜對象
* explain:包含簡單list屬性、對象list屬性
*/
@RequestMapping("/test3")
@ResponseBody
public void test3(@RequestBody User user){
System.out.println(user.getId());
System.out.println(user.getUsername());
System.out.println(user.getBirthday());
for(Integer i:user.getLuckyNums()){
System.out.println(i);
}
for(Person p:user.getFriends()){
System.out.println(p.getName());
}
}
案例3中的User的屬性相當復雜,有簡單數組,還有包含對象的復雜List,這樣的user如果用案例2的方式接受,肯定就掛了。此時,最好是前臺stringify轉換成json字符串,后臺用@RequestBody接受自動轉換成想要的數據格式。
案例4:復雜List<User>
ajax
$("#test5").on("click",function(){
var users = [];
for(var i=0;i<10;i++){
var user = {
id:1,
username:"fangxin",
birthday:new Date(),
luckyNums:[1,2,3],
friends:[
{name:"zhangsan"},
{name:"lisi"}
]
};
users.push(user);
}
$.ajax({
type: "POST",
url:"/mvc/client1/test5/",
data: JSON.stringify(users),
contentType:"application/json"
})
});
java
/**
* 復雜List
*/
@RequestMapping("/test5")
@ResponseBody
public void test5(@RequestBody List<User> users){
for(User user:users){
System.out.println(user.getUsername());
}
}
參考2、http://www.jb51.net/article/118659.htm 在此基礎上對數組進行修改
基礎類型
如果傳遞的json數據為基礎類型(Int,String等)的話,則只需要用@RequestParam標注方法中的參數就行了。
ajax代碼
$.ajax({ url : "someurl", type : "POST", dataType : "JSON", data : {"name":"test", "password":"testpassword"}, success : function (data) { console.log(data) }})java代碼
@RequestMapping("someurl")public @ResponseBody SomeData basicType(@RequestParam String name, @RequestParam String password){ //具體方法}在這里@ResponseBody說明返回的是一個對象。@RequestParam的用法還很多,具體可以去參考springmvc的文檔
簡單的對象類型
簡單的對象類型是指,在對象中不包含復雜的數據結構類似于list,map等。在這里可以使用標簽@ModelAttribute來直接將JSON數據封裝成對象。
假設我們有一個用戶對象,用戶的屬性包括name,age
public class User{ private String name; private int age; //getters and setters}ajax傳輸的數據如下
$.ajax({ url : "someurl", type : "POST", dataType : "JSON", data : { 'name : 'test', 'age' : 10 }, success : function (data) { console.log(data) }})controller中的代碼如下
@RequestMapping("someurl")public @ResponseBody SomeData objects(@ModelAttribute User user){//具體方法}springmvc 暫時不支持接收并生成多個modelAttribute
數組類型
有些情況下,可能需要傳遞一組相同類型的數據,比如添加一組用戶的信息。這是可以通過ajax傳遞一個數組給controller方法。具體情況可以參考
見我的隨筆另一個,一天的成果啊
這個回答給的非常的詳細具體,需要補充的是,接收端的數據結構無論是List<T>或是T[]都可以成功獲得數組數據。
復雜的對象
但是上面的方法有一個問題,就是只能接收純數組數據。假設一個對象,比如用戶,該用戶下的屬性除了包含name(名稱),age(年齡)之外,還有一個聯系方式屬性contacts(List<String>) ,如何才能將既包含基本類型又包含數組類型的JSON數據直接封裝成對象呢?這里就需要標簽@RequestBody
ajax代碼如下,需要注意的是,這里需要用JSON.stringfy()方法將json數據轉化成字符流,添加至requestbody中。且在ajax方法中必須指明contentType和dataType屬性。
public class User{ private String name; private int age; private List<String> contacts; //或是 private String[] contacts; //getters and setters}$.ajax({ var user = { 'name' : 'test', 'age ' : 10, 'contacts' : ['12313','123213123'] } url : "someurl", type : "POST", dataType : "JSON", contentType:"application/json", data : JSON.stringify(user), success : function (data) { console.log(data) }})java代碼如下
@RequestMapping("someurl")public @ResponseBody SomeData complicateObject(@RequestBody User user){ //方法詳情}總結
以上是生活随笔為你收集整理的jsp与spring mvc后台controller间参数传递处理之总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nyoj 822-画图 (*)
- 下一篇: java实验7线程2020.5.28