2011-09-01 58 views
1

我正在尝试使用Spring @MVC 3.0创建表单。这种形式应该让用户更新汤的味道,但我遇到了一些问题。以下是我的相关模型类(假设所有的getter和setter方法是否有):为什么Spring @ MVC窗体中的对象的其他属性变为空?

public class Soup { 
    String name, flavor, mainIngredient; 
    public String toString() 
    { 
     return "name: " + this.name + ", flavor: " 
      + this.flavor + ", main: " + this.mainIngredient; 
    } 
} 

public class SmallMeal { 
    List<Soup> soups; 
} 

public class Menu { 
    String id; 
    SmallMeal smallMeals; 
} 

应用程序的这部分允许用户编辑汤。这里的控制器:

public class MenuController { 

    @RequestMapping(value="/soupForm", method = RequestMethod.GET) 
    public String updateSoups(
    @PathVariable("menuId") String menuId, 
    ModelMap model) 
    { 
    Menu menu = // ... looked up with a DAO. 
    if (menu != null) 
    { 
     model.addAttribute("menu", menu); 
     for (Soup s : menu.getSmallMeal().getSoups()) 
     { 
      System.out.println("soup: " + s.toString()); 
     } 
    } 
    return "soupEditor"; 
    } 

    @RequestMapping(value="/soupForm", method = RequestMethod.POST) 
    public String updateSoups(
    @ModelAttribute("menu") Menu menu, 
    BindingResult result, SessionStatus status) 
    { 
    for (Soup s : menu.getSmallMeal().getSoups()) 
    { 
     System.out.println("soup: " + s.toString()); 
    } 
    return "redirect:soupUpdated"; 
    } 

} 

而这里的soupForm JSP:

<form:form modelAttribute="menu"> 
    <c:forEach var="soup" varStatus="stat" items="${menu.smallMeal.soups}"> 
    <label>${soup.name} flavor</label> 
    <form:input path="smallMeal.soups[${stat.index}].flavor" /> 
    </c:forEach> 
</form:form> 

现在,当我第一次请求页面时,我看到类似这样的输出:

name: tortilla, flavor: spicy, mainIngredient: tortillas 
name: crab bisque, flavor: crab, mainIngredient: crab 

并经过我提交表格(在更新tortilla的风味后),我会得到类似于以下的输出:

name: null, flavor: delicious, mainIngredient: null 
name: null, flavor: null, mainIngredient: null 

怎么回事?为什么没有绑定对象的其余数据?

回答

3

原来,@SessionAttributes注释是答案。

@Controller 
@SessionAttributes("menu") 
public class MenuController { 

    /* ... */ 

} 

添加之后,对象上当前存在的数据仍然存在。

相关问题