1. 程式人生 > >SpringMVC中@ModelAttribute註解的作用

SpringMVC中@ModelAttribute註解的作用

[email protected]註釋void返回值的方法

[java] view plain copy   print?
  1. @Controller  
  2. public class HelloModelController {  
  3.     @ModelAttribute   
  4.     public void populateModel(@RequestParam String abc, Model model) {    
  5.        model.addAttribute("attributeName", abc);    
  6.     }    
  7.     @RequestMapping
    (value = "/helloWorld")    
  8.     public String helloWorld() {    
  9.        return "helloWorld.jsp";    
  10.     }    
  11. }  

在這個程式碼中,訪問控制器方法helloWorld時,會首先呼叫populateModel方法,將頁面引數abc(/helloWorld.ht?abc=text)放到model的attributeName屬性中,在檢視中可以直接訪問。

jsp頁面頁面如下:

[html] view plain copy   print?
  1. <%@ page language
    ="java" contentType="text/html; charset=utf-8"  
  2.     pageEncoding="utf-8"%>  
  3. <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>  
  4. <html>  
  5. <head>  
  6. </head>  
  7. <body>  
  8. <c:out value="${attributeName}"></c:out>  
  9. </body>  
  10. </html>  

[email protected]
註釋返回具體類的方法
[java] view plain copy   print?
  1. @Controller  
  2. public class Hello2ModelController {  
  3.     @ModelAttribute   
  4.     public User populateModel() {    
  5.        User user=new User();  
  6.        user.setAccount("ray");  
  7.        return user;  
  8.     }    
  9.     @RequestMapping(value = "/helloWorld2")    
  10.     public String helloWorld() {    
  11.        return "helloWorld.jsp";    
  12.     }    
  13. }  

當用戶請求 http://localhost:8080/test/helloWorld2.html時,首先訪問populateModel方法,返回User物件,model屬性的名稱沒有指定,它由返回型別隱含表示,如這個方法返回User型別,那麼這個model屬性的名稱是user。 
這個例子中model屬性名稱有返回物件型別隱含表示,model屬性物件就是方法的返回值。它無須要特定的引數。

jsp 中如下訪問:

[html] view plain copy   print?
  1. <c:out value="${user.account}"></c:out>  

也可以指定屬性名稱
[java] view plain copy   print?
  1. @Controller  
  2. public class Hello2ModelController {  
  3.     @ModelAttribute(value="myUser")  
  4.     public User populateModel() {    
  5.        User user=new User();  
  6.        user.setAccount("ray");  
  7.        return user;  
  8.     }    
  9.     @RequestMapping(value = "/helloWorld2")    
  10.     public String helloWorld(Model map) {    
  11.        return "helloWorld.jsp";    
  12.     }    
  13. }  

jsp中如下訪問:
[html] view plain copy   print?
  1. <c:out value="${myUser.account}"></c:out>  

物件合併:

[java] view plain copy   print?
  1. @Controller  
  2. public class Hello2ModelController {  
  3.     @ModelAttribute  
  4.     public User populateModel() {    
  5.        User user=new User();  
  6.        user.setAccount("ray");  
  7.        return user;  
  8.     }    
  9.     @RequestMapping(value = "/helloWorld2")    
  10.     public String helloWorld(User user) {  
  11.         user.setName("老王");  
  12.        return "helloWorld.jsp";    
  13.     }    
  14. }  

物件合併指定物件名稱:

[java] view plain copy   print?
  1. @Controller  
  2. public class Hello2ModelController {  
  3.     @ModelAttribute("myUser")  
  4.     public User populateModel() {    
  5.        User user=new User();  
  6.        user.setAccount("ray");  
  7.        return user;  
  8.     }    
  9.     @RequestMapping(value = "/helloWorld2")    
  10.     public String helloWorld(@ModelAttribute("myUser") User user) {  
  11.         user.setName("老王");  
  12.        return "helloWorld.jsp";    
  13.     }    
  14. }  

這樣在jsp中可以使用如下方式訪問

[html] view plain copy   print?
  1. <c:out value="${myUser.name}"></c:out>  
  2. <c:out value="${myUser.account}"></c:out>  

3.通過此特性控制權限.

我們可以在基類方法中控制寫此註解,需要控制權限的控制器,繼承控制器就可以了。

[java] view plain copy   print?
  1. public class BaseController {  
  2.     @ModelAttribute  
  3.     public void populateModel() throws Exception {    
  4.        SysUser user=ContextUtil.getCurrentUser();  
  5.        if(user.getAccount().equals("admin")){  
  6.            throw new Exception("沒有許可權");  
  7.        }  
  8.     }    
  9. }  

需要控制權限的類繼承BaseController [java] view plain copy   print?
  1. @Controller  
  2. public class Hello2ModelController extends BaseController {  
  3.     @RequestMapping(value = "/helloWorld2")    
  4.     public String helloWorld(@ModelAttribute("myUser") User user) {  
  5.         user.setName("老王");  
  6.        return "helloWorld.jsp";    
  7.     }    
  8. }  

這樣就可以控制權限了,當然控制權限的方法有很多,比如通過過濾器等。這裡只是提供一種思路。

總結:

@ModelAttribute具有如下三個作用:

①繫結請求引數到命令物件:放在功能處理方法的入參上時,用於將多個請求引數繫結到一個命令物件,從而簡化繫結流程,而且自動暴露為模型資料用於檢視頁面展示時使用。其實@ModelAttribute此處對於供檢視頁面展示來說與model.addAttribute("attributeName", abc);功能類似。

[java] view plain copy   print?
  1. public String test(@ModelAttribute("user") UserModel user)   

此處多了一個註解@ModelAttribute("user"),它的作用是將該繫結的命令物件以“user”為名稱新增到模型物件中供檢視頁面展示使用。我們此時可以在檢視頁面使用${user.username}來獲取繫結的命令物件的屬性。

②暴露@RequestMapping 方法返回值為模型資料:放在功能處理方法的返回值上時,是暴露功能處理方法的返回值為模型資料,用於檢視頁面展示時使用。

[java] view plain 

相關推薦

SpringMVC@ModelAttribute註解作用

[email protected]註釋void返回值的方法 [java] view plain copy   print? @Controller   public class HelloModelController {       @Mo

關於springMVC@ModelAttribute註解的隱含model屬性名

springMVC中對現有的部落格的小補充 宣告:本人菜鳥一個,這次是第一次寫部落格,可能格式有點不好,請見諒, 如有不正確歡迎前來斧正。 序言:寫這篇部落格的原因:是我在使用一個框架時遇到的問題,百度了很多部落格和知乎等等都沒有什麼收穫,後來弄

springMVC@ModelAttribute與@SessionAttributes註解一起使用時容易引發的異常

        當使用@ModelAttribute註解時,會取@ModelAttribute的value值,若@ModelAttribute的value值是空串(即沒有配置@ModelAttribute的value屬性),則會將當前用@ModelAttribute修飾的方法

springMVC註解@RequestParam與@PathVariable的區別

actor nal lencod mat 控制 關系 tor oid 沒有 @PathVariable綁定URI模板變量值 @PathVariable是用來獲得請求url中的動態參數的 @PathVariable用於將請求URL中的模板變量映射到功能處理方法的參數上。//配

SpringMvc@ModelAttribute的運用

獲取對象 urn tgui mapping pri return 嘗試 bind 類型 /** * 1. 有 @ModelAttribute 標記的方法, 會在每個目標方法執行之前被 SpringMVC 調用! * 2. @ModelAttribute 註解也可以來

springmvc@requestbody註解接收請求引數

一、POST請求的四種常用方式   1、application/x-www-form-urlencoded     瀏覽器原生的表單,值為urlencoded之後的  key1=value1&key2=value2......   2、multipart/form-data     

springmvc@requestbody註解接收請求參數

pri 傳輸 四種 文件表 multi post 傳輸文件 解析json 方式 一、POST請求的四種常用方式   1、application/x-www-form-urlencoded     瀏覽器原生的表單,值為urlencoded之後的 key1=value1&a

Spring MVC@ModelAttribute註解

Spring MVC中,@ModelAttribute註解主要功能: 1、標註在引數上進行資料繫結,將前端上送的引數按照名稱繫結到指定物件中,並且將該物件自動加入ModelMap中,後續可供View層使用。 2、標註在方法上,會在每一個@RequestMapping標

Springmvc @ModelAttribute的用法

至於 @ModelAttribute 適用場合在修改資料上,作用在方法上, 好,下面就上程式碼,看看@ModelAttribute它的用法,說一個簡單的實列: 1.比如,在我的一個介面上,我要修改資料:我會點選一個連線進入我的controller類,先找到這個物件:

springmvcModelAttribute註解,在controller每個方法執行前被執行

先看一個沒有使用@ModelAttribute的Controller方法. @RequestMapping("/save")   public String save(User user) {       user.setUsername("U love me")

SpringMVC Transactional註解的巨坑

最近的一個專案中對資料庫事務的處理要求比較嚴格。比如要完成業務A,需要完成操作1和操作2, 如果操作1失敗,則業務A要整體回滾;如果操作2失敗, 則僅需回滾操作2的資料,操作1的資料要留下來。因此整個業務算是兩個事務。 發現的問題 以前並沒有認真整理過程式碼

springmvcModelAttribute註解

參考資料:spring-framework-reference的Using @ModelAttribute on a method和Using @ModelAttribute on a method argument先看一個沒有使用@ModelAttribute的Contr

springmvc@requestbody註解接收前端引數使用content-type型別

最近程式碼遇見了一個springmvc中的小問題,算是很基礎的東西,同事問我後我有有些迷惑上網找了一些資料後弄清楚了。特此記錄一下 首先是後臺程式碼使用springmvc註解@requestbody,

關於springmvc註解@ModelAttribute的bean(物件引數)問題

環境:jdk6 sping3.2.3  oracle10g 問題闡述: 我通過jsp提交一個表單,然後通過js方法$('#id').submit()函式,提交表單,通過post提交表單如下: 我在springmvc的controller接受時,如下: 顯然  我是通過b

SpringMVC的一些註解

gmv pub pan else bsp break () 獲取參數 false @Controller:表明該類是一個Controller; @RequestMapping(參數) :為類或者方法定義一個url @RequestParam(value = "id" ):

SpringBoot@EnableAutoConfiguration註解作用

springboot enable auto 在這個註解中,最重要的是它導入了一個類EnableAutoConfigurationImportSelector它是一個ImportSelector接口的實現類,而ImportSelector接口中的selectImports方法所返回的類將被Spri

總結本次實訓springMVC常用的註解@,以後用到別的會持續更新

col ring key值 ppi div jsp頁面 ajax請求 map spa @Repository //dao層註解。聲明本層為dao層。 @serivce //service層。 @controller //con層。 @auto

SpringMVC用於綁定請求數據的註解以及配置視圖解析器

SpringMVC 視圖解析器 @RequestHeader 綁定集合參數 @CookieValue SpringMVC中用於綁定請求數據的註解 在上一篇文章中我們簡單介紹了@RequestMapping與@RequestParam註解,知道了如何去配置地址映射,本篇則介紹一些用於處理re

Kotlin使用註解框架不起作用

Butter Knife Kotlin中註解失效 Kotlin開發問題 問題 在Kotlin中使用註解框架,發現在編譯的時候註解的字段沒有生效。 原因 由於Kotlin是基於jvm運行時的開發語言,所以需要單獨對它引入註解環境 解決方法: 這個方式是基於Gradle方式的,如使用開發工具Inter

大佬教你在springMVC使用dubbo註解配置的問題

ica .get -s sta for dispatch 自動 xtu ces 問題,在controller中無法通過註解自動註入dubbo服務,但是在service中可以自動註入。package com.sl;@Controllerbr/>//期望註入dubbo服務@Re