我正在使用spring mvc3,我发现我对一些概念很困惑,所以我做了一个总结,然后在这里发布。
我之前使用struct2如果我在动作中有一个bean(i..e,名为'Person'),那么当请求下面的url时:
http://localhost:8080/app/form?person.id=1&person.name=xxx&pet.name=yy
然后将创建一个新的Person实例,并将参数“1”和“xxx”填充到此实例中。 并且将创建一个新的Pet实例,并将名称'yy'填充到此bean。
这是struct2中数据绑定的唯一方法: 您在请求中指定了beanname.property。
现在在spring mvc3中,我知道一种绑定数据的方法:
http://localhost:8080/app/form?id=1&name=xxx&other=yy
@RequestMapping('form')
public String form(Person person,BindingResult result){
//now I get the person
}
即使它有效,但我有一些问题:
1)我在请求url“name”,“pass”,“other”中有三个参数,spring如何知道应该将哪些参数填充到我的bean(模型)中。
2)如果我想将参数绑定到多个模型(如struct2中的示例(人和宠物))怎么样?
此外,spring标记“form”中的modelAttribute
和commandName
属性是什么意思?
2。验证
对于bean(忽略示例中的getter和setter):
import javax.validation.constraints.NotNull;
public class Bean {
@NotNull(message="id can not be null")
private int id;
}
我使用这个控制器:
@RequestMapping("val")
public @ResponseBody
String validate(@Valid Bean bean, BindingResult result) {
if (result.hasErrors()) {
return result.getAllErrors() + "";
} else
return "no error";
}
我发现只有'NotEmpty'有效。 因为如果我使用这个网址:
/val?name=xxx ==> no error !! // id is null now,why it does not has error?
第3。类型转换。
以此网址为例:
http://localhost:8080/app/form?id=1&name=xxx&other=yy
如果我将id设置为字符串值,显然会抛出'NumberFormatException'。
然后在哪里捕获此异常?如果在控制器中,那么我必须在每个控制器中编写这么多的try-catch块。
此外,类型转换异常不仅限于'NumberFormatException',它可能是'dataformaterrorexception'等。
但它们都属于类型转换,如何处理使用常见的解决方案?