我指的是here
中的示例其中@ModelAttribute放置在方法级别
/**
* Retrieves all addresses and allows them to be used as a model
* @return a model attribute containing addresses
*/
@ModelAttribute("addresses")
public List<Address> getAllAddresses() {
// Delegate to service
return addressService.getAll();
}
@InitBinder
public void initBinder(WebDataBinder webDataBinder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd");
dateFormat.setLenient(false);
webDataBinder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
}
/**
* Handles and retrieves a JSP page containing all addresses.
* We use the @ModelAttribute to pass the data to the view
*
* @return the name of the JSP page
*/
@RequestMapping(value="list1", method = RequestMethod.GET)
public String getAllUsingModelAttribute() {
logger.debug("Received request to show all addresses page");
// No need to add the model here
// It has been automatically added when we used the @ModelAttribute annotation earlier
// The name of the ModelAttribute is "addresses". Your JSP should reference "addresses"
// This will resolve to /WEB-INF/jsp/addressespage.jsp
return "addressespage";
}
我的问题是,当请求到达控制器时,是否使用@ModelAttribute自动注释的方法?在这种情况下,方法getAllAddresses()。在示例中,我没有看到在任何地方显式调用此方法。
或者当请求到达包含@RequestMapping后立即放置的方法时会被触发?
同样的问题@initBinder是在表单提交后自动注释的方法吗?
答案 0 :(得分:2)
当一个页面要呈现时,如果页面的表单是由form taglib使用Spring创建的,那么:
<form:form commandName="addresses" method="post">
这将引导您的页面查找名称为“addresses”的正确@ModelAndAttribute。如果您的程序能够找到(就像您定义的那个)
@ModelAttribute("addresses")
public List<Address> getAllAddresses() {
// Delegate to service
return addressService.getAll();
}
使您的表单可以使用List准备好更改!
然后您可以使用另一种方法提交表单,如下所示:
@RequestMapping(value="path", method=RequestMethod.POST)
public String doSomethingForMe(@Valid @ModelAttribute("addresses") List <Address>, BindingResult result) {
if(result.hasErrors()){
return "TO_THE_PAGE_YOU_WANT_FOR_SHOWING_THE_ERROR_TO_USER";
}
// do the other stuffs you want !
}
我只是在这里写这个代码,很抱歉,如果你发现任何拼写错误的问题,那就是故事!
祝你好运!
答案 1 :(得分:0)
尝试调试控制器并添加一些日志记录。
您最常看到的是调用@ModelAttribute
注释方法。
如果您将自定义对象放入模型中,或者您的处理程序方法将自定义对象声明为参数,则会调用initBinder
。
@ModelAttribute("obj")
public List<Address> getAllAddresses() {
// Delegate to service
return new CustomObject();
}
@RequestMapping(value="list1", method = RequestMethod.GET)
public String getAllUsingModelAttribute(CustomObject customObject) {