对Spring MVC中几个常用注解的用法和参数分析

在学习SpringMVC时一直对下面这几个注解的参数分不太清楚,现在来重新理一下。

  1. @RequestAttribute
    就像@SessionAttribute一样,注解@RequestAttribute可以被用于访问由过滤器或拦截器创建的、预先存在的请求属性。
    源码:

    @Target({ElementType.PARAMETER})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface RequestAttribute {
         
        @AliasFor("name")//作为name的别名
        String value() default "";
    
        @AliasFor("value")//作为value的别名
    
        //The default name is inferred from the method parameter name.
        String name() default "";
    
        boolean required() default true;
    }

    从源码中可以看出,name属性其实和value属性是一样的,互相为对方的别名。属性name(或者说value)的默认值是形参名。
    如果同时设置了name和value为不同的值,那么结果会怎么样?
    controller层部分代码:

    @RequestMapping(value = "/register", method = RequestMethod.GET)
    public ModelAndView register(@RequestParam(name = "info1", value = "info2")String info){
        System.out.println("info = " + info);
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("register");
        return modelAndView;
    }

    出错信息:

    org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.core.annotation.AnnotationConfigurationException: In annotation [org.springframework.web.bind.annotation.RequestParam] declared on public org.springframework.web.servlet.ModelAndView com.ths.demo3.controller.UserController.register(java.lang.String) and synthesized from [@org.springframework.web.bind.annotation.RequestParam(name=info1, value=info2, defaultValue=
        , required=true)], attribute 'name' and its alias 'value' are present with values of [info1] and [info2], but only one is permitted.
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

    可以看到attribute 'name' and its alias 'value' are present with values of [info1] and [info2], but only one is permitted这行,name和value确实是绑定的,不能同时设定为不同的值。

  2. @RequestParam
    @RequestParam用于将请求参数数据映射到功能处理方法的参数上。更通俗的讲,就是将请求中的参数放到方法的形参里,从而更加方便使用。
    源码:

    @Target({ElementType.PARAMETER})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface RequestParam {
        @AliasFor("name")
        String value() default "";
    
        @AliasFor("value")
        String name() default "";
    
        //Defaults to true, leading to an exception being thrown if the parameter is missing in the request. Switch this to false if you prefer a null value if the parameter is not present in the request.
        //Alternatively, provide a defaultValue(), which implicitly sets this flag to 
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值