2011-11-09 88 views
2

我需要幫助理解下面的例子與@ModelAttributeSpring文件:(方法populatePetTypes()我瞭解@ModelAttribute的權利嗎?

@Controller 
@RequestMapping("/owners/{ownerId}/pets/{petId}/edit") 
@SessionAttributes("pet") 
public class EditPetForm { 

    // ... 

    @ModelAttribute("types") 
    public Collection<PetType> populatePetTypes() { 
     return this.clinic.getPetTypes(); 
    } 

    @RequestMapping(method = RequestMethod.POST) 
    public String processSubmit(
      @ModelAttribute("pet") Pet pet, 
      BindingResult result, SessionStatus status) { 

     new PetValidator().validate(pet, result); 
     if (result.hasErrors()) { 
      return "petForm"; 
     } 
     else { 
      this.clinic.storePet(pet); 
      status.setComplete(); 
      return "redirect:owner.do?ownerId=" + pet.getOwner().getId(); 
     } 
    } 

} 

我undestood這個喜歡額外的「價值」,我們的模型對象可以得到整個電流控制器。這是真的嗎?

我試圖做一些測試,通過添加代碼到我的控制器:

@ModelAttribute("user") 
public Integer getKod(){ 
    return new Integer(123321); 
} 

另一種方法是:

@RequestMapping("/register") 
public String register(Map<String, Object> map, @ModelAttribute("user") MyUser user, BindingResult result) { 
... 
} 

,現在我儘量只顯示「KOD」到我形式:

<form:form method="post" action="" commandName="user"> 
(...) 
     <form:label path="kod">kod</form:label>: 
     <form:input path="kod"/> 
(...) 
</form:form> 

但我得到:

java.lang.IllegalArgumentException: [email protected]

請大家幫忙!

回答

3

註釋意味着不同的事情取決於你把它放在哪裏。

@ModelAttribute上的一個方法告訴Spring將該方法的返回值vlaue放入Map中,在該名稱下。它不會告訴它在該對象上執行屬性綁定。所以你在Map中放置一個叫做「user」的Integer。

@ModelAttribute上的一個參數告訴Spring「用這個名字在映射中查找某個東西,並將其分配給該方法參數。」

所以你把一個Integer放在地圖下名爲「user」的地方,然後讓Spring把它分配給MyUser類型的對象。當然Integer不能投射到MyUser!

我想你混淆了經典的MVC意義上的「模式」,這是你的MYUSER,Spring的ModelMap,這是這可以作爲視圖的一部分數據的所有。當Spring控制器引用'Model'時,它意味着與構建屏幕相關的所有事物的ModelMap。您的MyUser對象是該地圖中的一個條目,但可能還有更多其他內容也是該屏幕中的一部分。在spring-ese中,我們經常會將MyUser引用爲「Form Backing Object」,因爲它是表單的實際綁定目標。

例如,在您發佈的代碼片段中,PetTypes的「types」列表是Spring ModelMap的一部分。它是構建視圖所需的參考數據。但它不是'Pet'對象的屬性,它是窗體支持對象。

+0

謝謝,你對我的「模型」感到困惑......現在我將我的「用戶」改爲「kod」,但是「'只顯示」$ {kod}「,你知道爲什麼這仍然不起作用嗎? – Maxiq

+0

什麼應用服務器和版本?它實際上是jsp-2.0嗎? – Affe

+0

我在版本1.1.2中使用jstl和taglibs,我的服務器是tomcat 6. – Maxiq