我的域对象不保留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的理解,这似乎是一个标准模式,但请随时纠正我。
提前致谢,
答案 0 :(得分:1)
您可以使用以下内容之一:
- 使用拉尔夫的隐藏方式。
- 将Foo.fieldA的类型更改为私有Integer Foo
醇>
原因可能是:Foo.fieldA正在创建问题,因为NULL值设置为int类型fieldA。
答案 1 :(得分:0)
这是预期的行为。
对象newForm
的两个实例(在update
和foo
中)(在java类名称中应以大写字母开头)是完全独立的彼此。
因此,eighter会创建一个隐藏字段,或将其放入会话中。 我会推荐隐藏的字段: