SpringMVC的Controller

来源:互联网 发布:mac上安装android sdk 编辑:程序博客网 时间:2024/05/12 18:44

SpringMVC的Controller

Controller控制器,是MVC中的C,主要负责功能处理部分:
1、收集、验证请求参数并绑定到命令对象
2、将命令对象交给业务对象,有业务对象处理并返回模型数据
3、返回ModelAndView,Model部分是业务对象返回的数据,视图部分是逻辑视图名

DispatcherServlet主要负责整体的控制流程的调度部分:
1、负责将请求委托给处理器进行处理
2、根据控制器返回的逻辑视图名选择具体的视图进行渲染,并且把模型数据传入
MVC中完成的C 有DispatcherServlet+Controller 组成

Controller的注解:
Spring2.5之前我们都是通过实现Controller接口或其实现来定义我们的处理器
Spring2.5之后引入了注解式处理器支持,通过@Controller和@RequestMapping注解定义我们的处理器类。并且提供了一组强大的注解:
@Controller:用于标识是处理器类
@RequestMapping:请求到处理器功能方法的映射规则
@RequestParam:请求参数到处理器功能处理方法的方法参数的绑定
@ModelAttribute:请求参数到命令对象的绑定
@SeessionAttributes:用于声明session级别存储的属性,放置在处理器类上,通常列出模型属性对应的名称,则这些属性会透明的保存到session中
@InitBinder:自定义数据绑定注册支持,用于将请求参数转换到命令对象属性的对应类型
Spring3.0引入RESTful风格支持(通过@PathVariable注解和一些其他特性支持),且又引入了更多的注解支持。
@CookieValue:cookie数据到处理器功能处理方法的方法参数的绑定
@RequestHeader:请求头(header)数据到处理器功能处理方法的方法参数上的绑定
@RequestBody:请求的body体的绑定(通过HttpMessageConverter进行类型转换)
@ResponseStatus:定义处理器功能处理方法/异常处理器返回的状态码和原因
@ExceptionHandler:注解式声明异常处理器

URL路径映射
普通URL映射:
@RequestMapping(value={“/hello”,”/user/create”}):多个URL路径可以映射到同一个处理器的功能处理方法

URI模板模式映射:
1、@RequestMapping(value=”/users/{userid}”): {xx}占位符请求的url可以是”/users/123456”或”/users/abcd” 通过@PathVariable可以提取模板模式中{xx} xx的值
2、@RequestMapping(value=”/users/{userId}/create”):请求的url可以是”/users/uid/create”
3、@RequestMapping(value=”/users/{userId}/topics/{topicId}”):请求的url可以是”/users/uid/topics/tid”

Ant风格的URL路径映射:
1、@RequestMapping(value=”/users/**”):可以匹配”/users/abc/abc”,但”/users/123” 将会被URL模板模式映射中的”/users/{userId}”模式优先映射到
2、@RequestMapping(value=”/product?”):可匹配”/product1”或”product”或”productaa”
3、@RequestMapping(value=”/product*”):可匹配 “/productabc” 或 “/product” 但不匹配”/productabc/abc”
4、@RequestMapping(value=”/product/*”):可以匹配”/product/abc”,但不匹配”/productabc”
5、@RequestMapping(value=”/products/**/{productId}”):可匹配”/products/abc/abc/123”或”/products/123”,也就是Ant风格和URI模板变量风格可混用

URL路径映射:
如果有如下模板,那Spring该选择哪一个执行呢?当强求为”/long/long”时如下所示:
/long/long
/long/**/abc
/long/**
/**
Spring的AbstractUrlHandlerMapping使用:最长匹配优先; 如请求为”/long/long” 将匹配第一个”/long/long”,但请求”/long/abcd” 则匹配”/long/“,如果请求”/long/aa/abc”则匹配“/long//abc”,如果请求”/abc” 则将匹配”/**”

请求方法限定:
请求窄化:
Controller上直接使用@RequestMapping(value=”/create”)
方法上
@RequestMapping(value=”/create”,method=RequestMethod.GET)
组合方式
@RequestMapping(value=”/create”,{method = RequestMethod.GET,RequestMethod.POST})

请求数据中有指定参数名
@RequestMapping(params=”create”,method=RequestMrthod.GET):表示请求中有”create”的参数名且请求方法为”GET” 既可匹配

请求数据中没有指定参数名
@RequestMapping(params=”!create”,method = RequestMethod.GET)
请求数据中指定参数名=值
@RequestMapping(params=”submitFlag=create”)

请求参数映射:
请求数据中指定参数名!=值
@RequestMapping(params=”submitFlag != create”,method=RequestMethod.GET)
组合使用时 是且的关系
@RequestMapping(params={“test1”,”test2=create”})

请求Header映射
请求头数据中有指定参数名
@RequestMapping(value=”/header/test1”,headers=”Hello”)

请求头数据中 没有指定参数名
@RequestMapping(value=”/header/test1”,headers=”!Hello”)

请求头数据中指定参数名 = 值
@RequestMapping(value=”/header/test1”,headers=”Hello=abc”)

请求头数据中指定参数名 !=值
@RequestMapping(value=”/header/test1”,headers=”Hello != abc”)

组合使用时 是且的关系
@RequestMapping(value=”/header/test1”,headers={“Hello=abc”,”Accept!=text/vnd.wap.wml”})

请求头数据中指定参数名 = 值
@RequestMapping(value=”/header/test1”,headers=”Hello=abc”)