在学习SpringMVC时一直对下面这几个注解的参数分不太清楚,现在来重新理一下。
@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确实是绑定的,不能同时设定为不同的值。@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