Controller中的handler方法参数

        今天继续看Spring MVC中16.3节(Implementing Controllers)的内容。


        由@RequestMapping注解的handler允许的方法参数中,包括Errors和BindingResult,这两个类是Spring的验证框架(validation)中的类。这个参数可以为参数列表中在其之前(紧挨,中间不能有其他Model参数,因为方法签名中可能不止有一个model对象,而Spring会为它们每一个都创建一个BindingResult对象)被@ModelAttribute绑定的model对象返回错误验证信息。

        

        这里提到了@ModelAttribute,此注解可以放在方法上或者方法参数列表中。

        添加在方法上表示此方法的目的是添加一个或多个model属性,它支持和@RequestMapping method一样的参数类型,但是不能直接映射请求。在同一Controller中,@ModelAttribute method会在@RequestMapping method之前被激活。  下面的例子是添加一个和添加多个属性的情况:  

//add one attribute
//the return type of the method is added to the model under the name "account"
//you can customize the name via @ModelAttribute("myAccount")
@ModelAttribute
public Account addAccount(@RequestParam String number){
    return accountManager.findAccount(number);
}

//add multiple attributes
public void populateModel(@RequestParam String number, Model model){
    model.addAttribute(accountManager.findAccount(number));
    // add more...
}

        在添加一个属性的情况下,如果没有明确指定属性名,那么就根据返回对象的类型默认为其指定属性名,如返回对象类型为Account,则属性名为account。


        @ModelAttribute添加在方法参数上

        


        另一个值得注意的是由@RequestBody注解的方法参数,该参数和HTTP request body绑定。将request body转换为方法参数需要借助于HttpMessageConverter(这里提到了MVC namespace,它默认注册了更多的message converters),这个类可以将HTTP request message转换为一个对象,也可将一个对象转换为HTTP response body。


        @RequestBody方法参数能够被@Valid注解,这样它就会被Validator验证。不同于@ModelAttribute参数,@RequestBody的验证错误总是会导致一个MethodArgumentNotValidException,此异常会被DefaultHandlerExceptionResolver处理,并向客户端返回400错误码。


        @ResponseBody和@RequestBody比较像,如果将这个注解放在方法上,表明此方法返回的内容将被直接写进HTTP response body中(不会被放到Model中,也不会被解析成视图名),如:

@RequestMapping(value="/something", method=RequestMethod.PUT)
@ResponseBody
public String helloWorld(){
    return "hello world!"
}

        上面的例子,"hello world!"这段文本会被写到HTTP response stream中。


        从请求中(包括request parameters、path variables、request headers、cookie values等)中提取的String-based值需要转换成他们绑定到的参数所属的类型,如果绑定到的参数不是String,Spring会自动将前面提到的那些值转换为合适的类型,所有的简单类型如int、long、Date等都是被支持的。也可以通过WebDataBinder或者FormattingConversionService进一步定制化这种转换。


转载于:https://my.oschina.net/volcode/blog/636745

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值