Controller 控制器,是MVC 中的部分C,主要负责功能处理部分:一、收集、验证请求参数并绑定到命令对象;二、将命令对象交给业务对象,由业务对象处理并返回模型数据;三、返回ModelAndView(Model 部分是业务对象返回的模型数据,视图部分为逻辑视图名)。web
DispatcherServlet主要负责总体的控制流程的调度部分:
一、负责将请求委托给控制器进行处理;
二、根据控制器返回的逻辑视图名选择具体的视图进行渲染(并把模型数据传入)。
MVC 中完整的C(包含控制逻辑+功能处理)由(DispatcherServlet + Controller)组成。chrome
Spring2.5以前,咱们都是经过实现Controller接口或其实现来定义咱们的处理器类,已不建议使用。Spring2.5引入注解式处理器支持,经过@Controller 和@RequestMapping注解定义咱们的处理器类。而且提供了一组强大的注解:
@Controller:用于标识是处理器类;
@RequestMapping:请求处处理器功能方法的映射规则;
@RequestParam:请求参数处处理器功能处理方法的方法参数上的绑定;浏览器
@ModelAttribute:请求参数到命令对象的绑定;
@SessionAttributes:用于声明session级别存储的属性,放置在处理器类上,一般列出模型属性(如@ModelAttribute)对应的名称,则这些属性会透明的保存到session中;
@InitBinder:自定义数据绑定注册支持,用于将请求参数转换到命令对象属性的对应类型;cookie
Spring3.0引入RESTful架构风格支持(经过@PathVariable注解和一些其余特性支持), 且又引入了更多的注解支持。@CookieValue:cookie数据处处理器功能处理方法的方法参数上的绑定;
@CookieValue:cookie数据处处理器功能处理方法的方法参数上的绑定;
@RequestHeader:请求头(header)数据处处理器功能处理方法的方法参数上的绑定;
@RequestBody:请求的body体的绑定(经过HttpMessageConverter进行类型转换);
@ResponseStatus:定义处理器功能处理方法/异常处理器返回的状态码和缘由;
@ExceptionHandler:注解式声明异常处理器session
@PathVariable:请求URI中的模板变量部分处处理器功能处理方法的方法参数上的绑定,从而支持RESTful架构风格的URI;
Spring3.1使用新的HandlerMapping 和HandlerAdapter来支持@Contoller和@RequestMapping注解处理器,使用处理器映射RequestMappingHandlerMapping和处理器适配器RequestMappingHandlerAdapter组合来代替Spring2.5开始的处理器映射DefaultAnnotationHandlerMapping和处理器适配器AnnotationMethodHandlerAdapter。架构
注解实现Controllerapp
普通URL映射:
@RequestMapping(value={"/hello","/user/create"}) :多个URL路径能够映射到同一个处理器的功能处理方法
URI模板模式映射
一、@RequestMapping(value="/users/{userId}") :{xx} 占位符请求的URL能够是“/users/123456”或“/users/abcd”
经过@PathVariable能够提取URI模板模式中的{xx}中的xx 变量的值ui
二、@RequestMapping(value=“/users/{userId}/create” ) :请求的URL能够是”/users/uid/create”
三、@RequestMapping(value="/users/{userId}/topics/
{topicId}“) :请求的URL能够是”/users/uid/topics/tid”
Ant风格的URL路径映射
一、@RequestMapping(value=“/users/**”):能够匹配”/users/abc/abc”,但”/users/123”将会被URI模板模式映射中的”/users/{userId}”模式优先映射到(最长匹配优先)google
二、@RequestMapping(value=“/product?”):可匹配”/product1”或”/producta”,但不匹配”/product”或”/productaa”;
三、@RequestMapping(value=“/product*”):可匹配”/productabc”或”product”,但不匹配”/productabc/abc”;spa
四、@RequestMapping(value=“/product/*”):可匹配”/product/abc”,但不匹配“/productabc”;
五、@RequestMapping(value=“/products/**/
{productId}”):可匹配“/products/abc/abc/123”或
”/products/123”,也就是Ant风格和URI模板变量风格可混用;
若是有以下模式,那Spring该选择哪个执行呢?当请求为”/long/long” 时以下所示:/long/long/long/**/abc/long/**/**Spring的AbstractUrlHandlerMapping使用:最长匹配优先;如请求为”/long/long” 将匹配第一个”/long/long” ,但请求”/long/acd” 则将匹配”/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=RequestMethod. 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”})
一、Chrome浏览器安装插件。插件下载地址:https://chrome.google.com/webstore/detail/modheader/idgpnmonknjnojddfkpgkljpfnnfcklj
请求头数据中有指定参数名@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” )