1. 程式人生 > >Spring MVC @ModelAttribute註解

Spring MVC @ModelAttribute註解

public excel contain eth mode 地址 turn 數據 return

  在一個Controller內,被@ModelAttribute標註的方法會在此controller的每個handler方法執行前被執行。

  被@ModelAttribute標註的方法的參數綁定規則和普通handler方法相同。

  可以理解為:

  1. 請求到達Controller後,不論其他handler方法的RequestMapping值是多少,請求都會路由至被@ModelAttribute標註的方法;
  2. 由springMVC再對request執行一次forward,路由至真正的handler方法。

@ModelAttribute用於註解方法

方法返回類型為void

  這種情況,@ModelAttribute只是單純的作為請求路由的第一站,使用者可在方法內部操作Model和Request等參數實現功能。

  對於如下請求:

http://localhost:8080/TestModelAttributeController/testHandler.action?reqParam=123

  對應的Controller:

@Controller
@RequestMapping("/TestModelAttributeController")
public class TestModelAttributeController {

    @ModelAttribute
    public void modelAttributeMethod(HttpServletRequest request, String reqParam, Model model){
        model.addAttribute(
"reqParam",reqParam); request.setAttribute("methodParam","Hello ModelAttribute"); } @RequestMapping("/testHandler") public String testHandler(){ return "testModelAttribute"; } }

   testModelAttribute.jsp如下:

<%@ page contentType="text/html;charset=UTF-8" language=
"java" %> <html> <head> <title>Title</title> </head> <body> <h1>${reqParam}</h1> <h1>${methodParam}</h1> </body> </html>

  最終可以在頁面中看到:

  123

  Hello ModelAttribute

方法返回類型不為void

這種情況,@ModelAttribute會將返回值放到Model中,並將該類型名稱的首字母小寫作為model中的屬性名

請求地址和參數不變。

對應的Controller:

    @ModelAttribute
    public User userModelAttributeMethod2(){
        User user = new User();
        user.setAge(31);
        user.setName("James");
        user.setEmail("[email protected]");
        return user;  //相當於model.addAttribute("user",user);
    }


    @RequestMapping("/testHandler")
    public String testHandler(Model model){
        System.out.println(model.containsAttribute("user"));  //true
        return "testModelAttribute";
}

對應的jsp頁面

<h1>${user.age}</h1>
<h1>${user.email}</h1>
<h1>${user.name}</h1>

  實際上,對於返回類型為void的方法,@ModelAttribute也會在model中添加一對鍵值對,“void”->"null"

方法返回類型不為void,且@ModelAttribute指定屬性名稱

  這種情況下,@ModelAttribute會將返回值放到Medel中,且對應的key值為@ModelAttribute置頂的屬性名

  對應的Controller:

 @ModelAttribute("myUser")
    public User userModelAttributeMethod2(){
        User user = new User();
        user.setAge(31);
        user.setName("James");
        user.setEmail("[email protected]");
        return user;  //相當於model.addAttribute("user",user);
    }


    @RequestMapping("/testHandler")
    public String testHandler(Model model){
        System.out.println(model.containsAttribute("user"));  //true
        return "testModelAttribute";
}

  對應的jsp頁面:

<h1>${myUser.age}</h1>
<h1>${myUser.email}</h1>
<h1>${myUser.name}</h1>

@ModelAttribute和@RequestMapping註解同一個方法

  這種情況下:

  1. 在controller處理其他請求時,不會再首先進入被@ModelAttribute和@RequestMapping同時註解的方法
  2. 該方法的返回值不再是視圖的邏輯名稱,而是按照@ModelAttribute的規則被加入到Model中;
  3. @RequestMapping註解的value值具有兩個作用
    • 作為URI,實現請求的路由;
    • 作為此次請求的邏輯視圖名(嚴格來說此時視圖的邏輯視圖名是:controller的RequestMapping值+method的RequestMapping值
@Controller
@RequestMapping("/TestModelAttributeController")
public class TestModelAttributeController {

    @RequestMapping("/testModelAttribute")
    @ModelAttribute("result")
    public String testModelAttribute(){
        return "excellent";
    }

<body>
<h1>${result}</h1>
</body>

如上Controller和jsp:

testModelAttribute方法的作用是:

  1. 處理路徑為 /TestModelAttributeController/testModelAttribute*的請求
  2. 將鍵值對"result"->"excellent"放至model中,為視圖渲染提供數據
  3. 返回邏輯視圖名 /TestModelAttributeController/testModelAttribute

@ModelAttribute註解參數

Spring MVC @ModelAttribute註解