3:spring mvc 控制器

  1. Controller 简介

    Controller 控制器,是MVC 中的部分C,主要负责功能处理部分:一、收集、验证请求参数并绑定到命令对象;二、将命令对象交给业务对象,由业务对象处理并返回模型数据;三、返回ModelAndView(Model 部分是业务对象返回的模型数据,视图部分为逻辑视图名)。web

    DispatcherServlet主要负责总体的控制流程的调度部分:
           一、负责将请求委托给控制器进行处理;
           二、根据控制器返回的逻辑视图名选择具体的视图进行渲染(并把模型数据传入)。
    MVC 中完整的C(包含控制逻辑+功能处理)由(DispatcherServlet + Controller)组成。chrome

  2. Controller 注解式配置

    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

     


    HandlerMapping和HandlerAdapter的配置
    一、Spring3.1之前的版本DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter
    二、Spring3.1开始的版本RequestMappingHandlerMapping和RequestMappingHandlerAdapter
     
  3. URL映射配置

    普通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”则将匹配”/**”

  4. 请求方法限定

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

     

  5. 请求参数映射

    请求数据中有指定参数名
    @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”})

  6. 请求头限定

    一、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” )

相关文章
相关标签/搜索