在系列(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}
執行測試:
##可以看到已經取得到了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}執行測試:
可以看到已經取得到了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學習系列(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步把数据绑定到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.@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)!