日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jsp与spring mvc后台controller间参数传递处理之总结

發布時間:2024/10/8 编程问答 26 如意码农
生活随笔 收集整理的這篇文章主要介紹了 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方法中必須指明contentTypedataType屬性。

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间参数传递处理之总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。