一、@RequestParam
RequestParam注解有三个属性:value、required(默认为true)、defaultValue
value:
获取参数的名称。
required:
是否是必须。
defaultValue:默认值,当没有传入对应的参数时使用默认值。
二、@RequestMapping
@RequestMapping的value、method、params、及headers分别表示URL、请求方法、请求参数、及报文头的映射条件,他们之间是与的关系。
params和headers分别通过请求参数及报文属性进行映射,他们支持简单的表达式,headers基本上可以参照params进行理解。
下面是params的说明:
"param1":请求中必须包含名为param1的请求参数。
"!param1":请求中不能包含名为param1的请求参数。
"param1!=value1":请求中包含名为param1的请求参数,但其值不能为value1。
{"param1=value1","param2"}:请求中必须包含名为param1和param2的两个请求参数且param1参数的值必须为value1。
下面是
value
的示例:
总结:@RequestMapping 映射请求/user/*/index: 匹配 /user/aaa/index
/user/**/index: 匹配 /user/aaa/bbb/index
/user/index??: 匹配 /user/indexaaa、/user/indexbbb
/user/{userId}: 匹配 /user/123、/user/456
/user/**/{userId}: 匹配 /user/aaa/bbb/123、/user/aaa/123
/company/{companyId}/user/{userId}/detail: 匹配 /company/123/user/456/detail
method:
@RequestMapping(value = "/index", method = RequestMethod.GET)
RequestMethod是一个枚举类:
GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
不指定method时,既支持GET也支持POST。
三、@ModelAttribute
在被@RequestMapping注释的处理器类中,@ModelAttribute注解可以绑定到一个方法参数或者一个方法的返回值到一个命名的模型属性,提供给一个视图。
Spring MVC在调用方法之前会创建一个隐含的模型对象,作为模型数据的存储容器,我们称之为“隐含模型”。如果处理方法的入参为Map或者Model类型,Spring MVC
会将隐含模型的引用传递给这些入参。在方法体内,开发者可以通过这个入参对象访问到模型中的所有数据,也可以向模型中添加新的属性数据。(摘自Spring 3.x企业应用开发实战)
1、注解方法。(处理方法入参最多只能使用一个Spring MVC的注解,如果使用了两个或两个以上注解,Spring MVC会抛出异常。
)
一个控制器可以有任意数量的@ModelAttribute方法。所有这些方法都在@RequestMapping方法被调用之前调用。
被@ModelAttribute注释的方法表示这个方法的目的是增加一个或多个模型(model)属性。这个方法和被@RequestMapping注释的方法一样也
支持@RequestParam参数,但是它不能直接被请求映射。实际上,控制器中的@ModelAttribute方法是在同一控制器中的@RequestMapping方
法被调用之前调用的。
被@ModelAttribute注释的方法用于填充model属性,例如,为下拉菜单填充内容,或检索一个command对象(如,Account),用它来表示一个HTML表单中的数据。
2、注解属性。
入参级的@ModelAttribute注解和@RequestParam注解类似。
四、@SessionAttribute
org.springframework.web.HttpSessionRequiredException:Session attribute 'user' required-not found in session.
@SessionAttribute的作用是将处理方法对于的模型属性透明的保存在HttpSession中,并没有要求HttpSession中必须事先拥有对应的模型属性。
通过研究Spring MVC源码,原来Spring MVC对@ModelAttribute及@SessionAttribute的处理遵循一个特定的流程,流程条件不满足是就会报错,处理
流程说明如下:
1、Spring MVC在调用处理方法之前,在请求线程中自动创建一个隐含的模型对象。
2、调用所有在方法级标注了@ModelAttribute的方法,并将方法返回值添加到隐含模型中。
3、查看Session中是否存在@SessionAttribute("XX")所指定的XX属性,如果有,将其添加到隐含模型中。如果隐含模型中已经有XX属性,
该步操作会覆盖模型中已有的属性。
4、对标注了@ModelAttribute("XX")处理方法的入参按如下流程处理。
4.1、如果隐含模型中拥有了名为XX的属性,将其赋给该入参,再用请求消息填充该入参对象直接返回,否则到4.2。
4.2、如果XX是会话属性,即在处理类定义处标注了@SessionAttribute("XX"),则尝试从会话中获取该属性,将其赋给该入参,然后再用请求消息填充该入参对象直接返回。
如果在会话中找不到对应的属性,则抛出HttpSessionRequiredException异常。否则到4.3。
4.3、如果隐含模型不存在XX属性,且XX也不是会话属性,这创建入参的对象实例,再用请求消息填充该入参。