Spring MVC 3命令对象值在GET和POST操作之间丢失

时间:2012-01-05 14:08:46

标签: spring-mvc

我的域对象不保留JSP文件中未在同一控制器上的GET和POST操作之间显式引用的值。这是省略错误检查的示例

我有一个域对象。

class foo
{
    private int fieldA;
    private String fieldB;
    // .. getters and setters omitted
}

控制器

@Controller
public class MyController
{
@Autowired
private IDaoService daoService;

@RequestMapping(value = "/display", method = RequestMethod.GET)
public String newForm(@RequestParam("id") Long id, Model model, Principal principal) throws Exception
{
    // check that the user has permissions
    ...

    // get the object
    Foo foo = daoService.read(id);
    // at this point foo.fieldA is equal to the input id
    model.addAttribute("foo", foo);

    // return the JSP path
}

@RequestMapping(value="/update", method = RequestMethod.POST)
public String update(@ModelAttribute("foo") Foo foo,
        BindingResult result, 
        Principal principal,
        Model model) throws Exception

{   
    // ERROR - at this point, fieldA is null

}
}

JSP

    <form:form  method="post" commandName="foo">
        <fieldset>
            <legend>Invest</legend>
            <div class="fm-req">
                <label for="fm-name">Field B</label>    
                <spring:bind path="fieldB">
                    <input id="fm-name" type="text" name="${status.expression}" value="${status.value}" ></input>
                </spring:bind>
            </div>
            <div id="fm-submit" class="fm-req">
                <INPUT type="submit" value="Submit" name="Submit" />        
            </div>
        </fieldset>
    </form:form>                

我原以为JSP会获得在newForm中创建的对象,该对象具有fieldA集(可能还有fieldB)。用户可以选择更改fieldB然后点击提交。 我已经完成了很多关于Spring文档和检查网站的阅读,但是无法找出为什么foo.fieldA在控制器中的更新方法上为空。

根据我对Spring MVC的理解,这似乎是一个标准模式,但请随时纠正我。

提前致谢,

2 个答案:

答案 0 :(得分:1)

您可以使用以下内容之一:

  
      
  1. 使用拉尔夫的隐藏方式。
  2.   
  3. 将Foo.fieldA的类型更改为私有Integer Foo
  4.   

原因可能是:Foo.fieldA正在创建问题,因为NULL值设置为int类型fieldA。

答案 1 :(得分:0)

这是预期的行为。

对象newForm 的两个实例(在updatefoo中)(在java类名称中应以大写字母开头)是完全独立的彼此。

因此,eighter会创建一个隐藏字段,或将其放入会话中。 我会推荐隐藏的字段: