3.10、在方法参数上使用@ModelAttribute注解

  这一部分实例见这个项目的 mvc 分支下的 ModelAttrArgsController.java


  上节说过,@ModelAttribute可以用在方法或方法参数上。本节解释它用在参数上的情形。

  一个用在方法参数上的@ModelAttribute注解指示了参数应该从模型(这里所说的“模型”指 Model)中获取。如果模型中不存在,参数会首先被实例化,然后添加到模型中。一旦模型中存在,这个参数的字段会被所有的名字匹配的请求参数所填充。这在 Spring MVC 中叫做数据绑定,它能够把你从要对每一个字段进行类型转换的繁重体力劳动中解救出来,是非常有用的机制。

@PostMapping("/owners/{ownerId}/pets/{petId}/edit")
public String processSubmit(@ModelAttribute Pet pet) 
{ 
    // ...
}

  上面给出的例子的 Pet 实例来自哪里?这里有一个可选项:

  • 它可能已经存在与模型中了,因为使用了@SessionAttributes — 见“使用@SessionAttributes存储模型属性到 HTTP 会话中”一节.

  • 它可能已经存在于模型中了,因为同一个控制器中的@ModelAttribute方法,就像上一节中解释的那样。

  • 它可能是从URI模板变量和类型转换器中获取的(下面会详细解释)。

  • 它可能是使用默认构造器初始化的。

@ModelAttribute方法是一种常用的从数据库中获取属性的方式,可以通过使用@SessionAttributes注解把这种属性在各个请求之间共享。在一些情况下,可以很方便的通过使用URI模板变量和类型转换器来获取这些属性。下面是一个例子:

@PutMapping("/accounts/{account}")
public String save(@ModelAttribute("account") Account account) 
{
    // ...
}

  在这个例子中,模型属性名(“account”)匹配URI模板变量名。如果你注册的一个Converter<String, Account>可以把字符串 account 值转换为一个 Account,那么上面的例子即使不需要@ModelAttribute也可以正常工作。

  下一步是数据绑定。WebDataBinder类匹配请求参数名称——包括请求字符串参数和表单字段——到属性字段名。在必须的类型转换(从字符串到目标类型字段)之后,匹配的字段收集好了。数据绑定和校验见官方文档第五章-检验、数据绑定和类型转换。为控制器自定义数据绑定过程见 “自定义WebDataBinder初始化”一节。

  在数据绑定之后,可能会出现一些错误,比如缺少必须字段或者类型转换错误。为了检查这些错误,你可以紧跟在@ModelAttribute参数后面添加一个BindingResult参数:

@PostMapping("/owners/{ownerId}/pets/{petId}/edit")
public String processSubmit(@ModelAttribute("pet") Pet pet, BindingResult result) 
{
    if (result.hasErrors()) { return "petForm"; }
    // ...
}

  有了BindingResult之后,你就可以检查在提交同一个表单时有没有发现错误,这些错误可以通过 Spring 的<errors>表单标签来显示。

  注意到在一些情况下,在 model 中不使用数据绑定来访问一个属性是很有用的。这种情况下,你可以把Model注入到控制器中,或者在注解上使用绑定标记:

@ModelAttribute
public AccountForm setUpForm() { return new AccountForm(); }

@ModelAttribute
public Account findAccount(@PathVariable String accountId) 
{ 
    return accountRepository.findOne(accountId); 
}

@PostMapping("update")
public String update(
        @Valid AccountUpdateForm form, BindingResult result,
        @ModelAttribute(binding=false) Account account) 
{ /* omitted */ }

  除了数据绑定,你也可以使用你自己定义的、用来传递BindingResult(用于记录数据绑定错误)的校验器调用校验这允许数据绑定和验证的错误积累在一个地方,随后报告给用户:

@PostMapping("/owners/{ownerId}/pets/{petId}/edit")
public String processSubmit(@ModelAttribute("pet") Pet pet, BindingResult result) 
{
    new PetValidator().validate(pet, result);
    if (result.hasErrors()) return "petForm";

    // ...
}

  或者你可以自动调用校验,通过添加 JSR-303 的 @Valid 注解:

@PostMapping("/owners/{ownerId}/pets/{petId}/edit")
public String processSubmit(@Valid @ModelAttribute("pet") Pet pet, BindingResult result) 
{
    if (result.hasErrors()) return "petForm";

    // ...
}

  关于如何配置和使用校验器,详见官方文档的5.8节“Spring校验”和第五章 校验、数据绑定和类型转换

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python3.10在Windows 7上是可以运行的,但需要注意一些细节。 首先,需要下载并安装适用于Windows 7的Python3.10版本。在官网上可以找到相应的安装包,点击下载后按照提示安装即可。 其次,需要配置环境变量,将Python的安装目录添加到系统路径。这样,就可以在命令行直接执行Python命令了。 同时,在Windows 7上可能会遇到一些兼容性问题。例如,Python3.10可能需要更新一些依赖库、修复一些兼容性问题,才能在Windows 7上正常运行。如果遇到问题,可以去官网或社区寻找解决方案。 总的来说,Python3.10可以在Windows 7上运行,但需要注意相关的细节和兼容性问题。对于不熟悉操作系统和Python的用户来说,可能需要花费一些时间和精力来调试和解决问题。 ### 回答2: Python3.10 是最新的 Python 编程语言版本,提供了新的语言特性和性能优化。虽然 Python3.10 可以在 Windows 7 上运行,但是需要注意一下几个方面。 首先,Python3.10 仅支持 Windows 7 SP1 及更高版本的操作系统。如果您的 Windows 7 版本低于 SP1,需要先更新操作系统才能使用 Python3.10。 其次,在 Windows 7 上安装 Python3.10 时,需要选择与您的系统位数相对应的版本。如果您的系统是 64 位,则应选择 64 位的 Python3.10;如果您的系统是 32 位,则应选择 32 位的 Python3.10。 最后,在 Windows 7 上使用 Python3.10 时,需要先将 Python3.10 的路径添加到系统环境变量。这样才能在命令行或其他程序直接调用 Python3.10。 总的来说,Python3.10 在 Windows 7 上运行是完全可行的。只需满足一些简单要求,即可使用这个强大的编程语言来开发您的项目。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值