首頁  >  文章  >  Java  >  SpringMVC學習系列(5) 之 資料綁定-2

SpringMVC學習系列(5) 之 資料綁定-2

黄舟
黄舟原創
2017-03-03 10:54:541435瀏覽

在系列(SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2)中我們介紹瞭如何用@RequestParam來綁定數據,下面我們來看一下其它幾個數據綁定註解的使用方法。

SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2.@PathVariable 用來綁定URL模板變數值,這個我們已經在系列(SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2)中介紹了使用方法,這裡不在贅述。

SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2.@CookieValue 用來綁定Cookie中的資料。下面我們用取得Cookie中的sessionId做測試:

在DataBindController加入cookiebind action,程式碼如下:

//@CookieValue Test@RequestMapping(value="/cookiebind", method = {RequestMethod.GET})public String cookieBind(HttpServletRequest request, Model model, @CookieValue(value="JSESSIONID", defaultValue="") String jsessionId){
    
    model.addAttribute("jsessionId", jsessionId);    return "cookiebindresult";
}


在views資料夾中加入一個cookiebindresult .jsp視圖,程式碼如下:

nbsp;html PUBLIC "-//WSpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2C//DTD HTML SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2.0SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2 Transitional//EN" "http://www.wSpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2.org/TR/htmlSpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2/loose.dtd"><meta><title>Insert title here</title>
    ${jsessionId}


執行測試:

SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2

##可以看到已經取得到了sessionId。

註:@CookieValue 與@RequestParam 一樣也有SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2個參數,其意義與的@RequestParam 參數意義相同。

SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2.@RequestHeader 用來綁定請求頭中的數據,我們用@RequestHeader取得User-Agent 來做示範:

在DataBindController新增requestheaderbind action,程式碼如下:

//@RequestHeader Test@RequestMapping(value="/requestheaderbind", method = {RequestMethod.GET})public String requestHeaderBind(HttpServletRequest request, Model model, @RequestHeader(value="User-Agent", defaultValue="") String userAgent){
    
    model.addAttribute("userAgent", userAgent);    return "requestheaderbindresult";
}


在views資料夾中新增一個requestheaderbindresult.jsp視圖,程式碼如下:

nbsp;html PUBLIC "-//WSpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2C//DTD HTML SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2.0SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2 Transitional//EN" "http://www.wSpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2.org/TR/htmlSpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2/loose.dtd"><meta><title>Insert title here</title>
    ${userAgent}


執行測試:

SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2

可以看到已經取得到了User-Agent 。

註:@RequestHeader 與@RequestParam 一樣也有SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2個參數,其意義與的@RequestParam 參數意義相同。

SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2.@ModelAttribute 綁定資料到模型中。在系列(SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2)的modelAutoBind action中我們將表單提交的資料加入Model中的程式碼如下:

@RequestMapping(value="/modelautobind", method = {RequestMethod.POST})public String modelAutoBind(HttpServletRequest request, Model model, AccountModel accountModel){
    
    model.addAttribute("accountmodel", accountModel);    return "modelautobindresult";
}

而藉助@ModelAttribute 我們可以更簡單的講資料新增到Model中,把上面的程式碼修改為:

@RequestMapping(value="/modelautobind", method = {RequestMethod.POST})public String modelAutoBind(HttpServletRequest request, @ModelAttribute("accountmodel") AccountModel accountModel){    
    return "modelautobindresult";
}

#運行測試:

SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2

可以看到依然成功的綁定了提交的數據。

SpringMVC學習系列(5) 之 資料綁定-2.Model中的資料作用域是Request等級的,也就是說在一個Request請求中是取得不到其它Request請求的Model的資料的。但我們可以用@SessionAttributes 把數據儲存到session中,來保持多次請求間數據,這樣就可以來實現例如分步驟提交表單等需求。下面我們來看如何分SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2步驟把資料綁定到AccountModel中:

在DataBindController上添加:

@SessionAttributes(value = "sessionaccountmodel")

在DataBindController添加usernamebind和passwordbind action,代码如下:

//@SessionAttributes Test@ModelAttribute("sessionaccountmodel")public AccountModel initAccountModel(){    
    return new AccountModel();
}

@RequestMapping(value="/usernamebind", method = {RequestMethod.GET})public String userNameBind( Model model, AccountModel accountModel){
    
    model.addAttribute("sessionaccountmodel", new AccountModel());    return "usernamebind";
}

@RequestMapping(value="/usernamebind", method = {RequestMethod.POST})public String userNameBindPost( @ModelAttribute("sessionaccountmodel") AccountModel accountModel){    
    //重定向到密码绑定测试
    return "redirect:passwordbind";
}

@RequestMapping(value="/passwordbind", method = {RequestMethod.GET})public String passwordBind(@ModelAttribute("sessionaccountmodel") AccountModel accountModel){    
    return "passwordbind";
}

@RequestMapping(value="/passwordbind", method = {RequestMethod.POST})public String passwordBindPost(@ModelAttribute("sessionaccountmodel") AccountModel accountModel, SessionStatus status){    
    //销毁@SessionAttributes存储的对象    status.setComplete();    //显示绑定结果
    return "sessionmodelbindresult";
}


由于我们在controller上指定了@SessionAttributes,所以在@ModelAttribute(“xxx”)注解的参数会直接在@SessionAttributes中查找名为”xxx”的对象,如果没有找到则调用@ModelAttribute(“xxx”)注解的方法返回对象并存入@SessionAttributes(如果没有找到且没有@ModelAttribute(“xxx”)注解的方法就会抛出HttpSessionRequiredException)。当执行到最后一步就可以调用SessionStatus .setComplete()方法把@SessionAttributes中保存对象销毁了(不会清除HttpSession中的数据)。

在views文件夹中添加usernamebind.jsp、passwordbind.jsp和sessionmodelbindresult.jsp视图内容分别如下:

nbsp;html PUBLIC "-//WSpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2C//DTD HTML SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2.0SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2 Transitional//EN" "http://www.wSpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2.org/TR/htmlSpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2/loose.dtd"><meta><title>Insert title here</title>
    <form>     
        用户名:<input><br>
        <input>
    </form>  


nbsp;html PUBLIC "-//WSpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2C//DTD HTML SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2.0SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2 Transitional//EN" "http://www.wSpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2.org/TR/htmlSpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2/loose.dtd"><meta><title>Insert title here</title>
    <form>     
        密 码:<password></password><br>
        <input>
    </form>  


nbsp;html PUBLIC "-//WSpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2C//DTD HTML SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2.0SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2 Transitional//EN" "http://www.wSpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2.org/TR/htmlSpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2/loose.dtd"><meta><title>Insert title here</title>
    用户名:${sessionaccountmodel.username}<br>
    密 码:${sessionaccountmodel.password}


运行测试:

SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2

SpringMVC學習系列(5) 之 資料綁定-2

SpringMVC學習系列(5) 之 資料綁定-2

可以看到我们已经成功的分SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2步把数据绑定到AccountModel中了。

注:

@SessionAttributes有value和types两个参数其中value指明要对象的名称,types指定要绑定对象的类型,如@SessionAttributes(value = "sessionaccountmodel", types=AccountModel.class)两者是and关系,需要同时满足。也可以同时指定多个value和types 如:@SessionAttributes(value = {"aa", "aa"} , types={XXX.class, YYY.class}) 。

SpringMVC學習系列(5) 之 資料綁定-2.@RequestBody 调用合适的MessageConvert来把非application/x-www-form-urlencoded请求中的内容转换为指定的对象它通常与@ResponseBody合用,@ResponseBody与.@RequestBody刚好相反,他把指定的对象转换为合适的内容(请求头为Accept:application/json 则返回json数据)并返回。这里我们用一个ajax请求做演示:

由于Spring默认解析json用的是Jackson,所以我们这里要把jackson-core-asl-SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2.9.SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2.jar和jackson-mapper-asl-SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2.9.SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2.jar两个包添加到我们项目。

修改AccountModel让其继承Serializable接口,并添加一个空的构造函数(为了Jackson做转换)。

在DataBindController添加requestBodyBindaction,代码如下:

//@RequestBody Test@RequestMapping(value="/requestbodybind", method = {RequestMethod.GET})public String requestBodyBind(Model model){
    
    model.addAttribute("accountmodel", new AccountModel());    return "requestbodybind";
}

@RequestMapping(value="/requestbodybind", method = {RequestMethod.POST})public @ResponseBody AccountModel requestBodyBind(@RequestBody AccountModel accountModel){            
    return accountModel;
}


在views文件夹中添加requestbodybind.jsp视图内容如下:

nbsp;html PUBLIC "-//WSpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2C//DTD HTML SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2.0SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2 Transitional//EN" "http://www.wSpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2.org/TR/htmlSpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2/loose.dtd"><script></script><meta><title>Insert title here</title>
    <form>     
        用户名:<input><br>
        密 码:<password></password><br>
        <input>
    </form> 
    
    <script>
        $(function() { 
            $("#submit").click(function() {   
                var postdata = &#SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-29;{"username":"&#SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-29; + $(&#SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-29;#username&#SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-29;).val() + &#SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-29;","password":"&#SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-29; + $(&#SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-29;#password&#SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-29;).val() + &#SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-29;"}&#SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-29;;   
                $.ajax({  
                    type : &#SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-29;POST&#SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-29;,  
                    contentType : &#SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-29;application/json&#SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-29;,  
                    url : &#SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-29;http://www.php.cn/:8080/SpringMVCLesson/databind/requestbodybind&#SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-29;,  
                    processData : false,  
                    dataType : &#SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-29;json&#SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-29;,  
                    data : postdata,  
                    success : function(data) {  
                        alert(&#SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-29;username : &#SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-29;+data.username+&#SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-29;\npassword : &#SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-29;+data.password);  
                    },  
                    error : function() {  
                        alert(&#SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-29;error...&#SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-29;);  
                    }  
                }); 
            });
        });    </script> 


运行测试:

SpringMVC學習系列(5) 之 資料綁定-2

結果正確,證明轉換成功。

SpringMVC學習系列(5) 之 資料綁定-2.@RequestPart 綁定「multipart/form-data「類型數據,支援javax.servlet.http.Part文件上傳,並可進行類型轉換,詳見官方文件:

http://docs.spring.io/spring-framework/docs/SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2.SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2.x/spring-framework-reference/htmlsingle/#new-in-SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2.SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2-mvc-requestpart

 以上就是SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之資料綁定-SpringMVC學習系列(SpringMVC學習系列(5) 之 資料綁定-2) 之 資料綁定-2的內容,更多相關內容請關注PHP中文網(www.php.cn)!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn