`

Spring MVC学习(六)-------注解式控制器详解1

 
阅读更多

6.1、注解式控制器简介

一、Spring2.5之前,我们都是通过实现Controller接口或其实现来定义我们的处理器类。已经@Deprecated。

二、Spring2.5引入注解式处理器支持,通过@Controller 和 @RequestMapping注解定义我们的处理器类。

并且提供了一组强大的注解:

需要通过处理器映射DefaultAnnotationHandlerMapping和处理器适配器

AnnotationMethodHandlerAdapter来开启支持@Controller 和

@RequestMapping注解的处理器。

@Controller:用于标识是处理器类;

@RequestMapping:请求到处理器功能方法的映射规则;

@RequestParam:请求参数到处理器功能处理方法的方法参数上的绑定;

@ModelAttribute:请求参数到命令对象的绑定;

@SessionAttributes:用于声明session级别存储的属性,放置在处理器类上,通常列出

模型属性(如@ModelAttribute)对应的名称,则这些属性会透明的保存到session中;

@InitBinder:自定义数据绑定注册支持,用于将请求参数转换到命令对象属性的对应类型;

三、Spring3.0引入RESTful架构风格支持(通过@PathVariable注解和一些其他特性支持),且又引入了

更多的注解支持:

@CookieValue:cookie数据到处理器功能处理方法的方法参数上的绑定;

@RequestHeader:请求头(header)数据到处理器功能处理方法的方法参数上的绑定;

@RequestBody:请求的body体的绑定(通过HttpMessageConverter进行类型转换);

@ResponseBody:处理器功能处理方法的返回值作为响应体(通过HttpMessageConverter进行类型转换);

@ResponseStatus:定义处理器功能处理方法/异常处理器返回的状态码和原因;

@ExceptionHandler:注解式声明异常处理器;

@PathVariable:请求URI中的模板变量部分到处理器功能处理方法的方法参数上的绑定,

从而支持RESTful架构风格的URI;

四、Spring3.1使用新的HandlerMapping 和 HandlerAdapter来支持@Contoller和@RequestMapping

注解处理器。

新的@Contoller和@RequestMapping注解支持类:处理器映射RequestMappingHandlerMapping

处理器适配器RequestMappingHandlerAdapter组合来代替Spring2.5开始的处理器映射DefaultAnnotationHandlerMapping和处理器适配器AnnotationMethodHandlerAdapter

提供更多的扩展点。

接下来,我们一起开始学习基于注解的控制器吧。

②、④、⑥一般是可变的,因此我们可以这些信息进行请求到处理器的功能处理方法的映射,

因此请求的映射分为如下几种:

URL路径映射:使用URL映射请求到处理器的功能处理方法;

请求方法映射限定:如限定功能处理方法只处理GET请求;

请求参数映射限定:如限定只处理包含“abc”请求参数的请求;

请求头映射限定:如限定只处理“Accept=application/json”的请求。

接下来看看具体如何映射吧。

6.2、入门

(1、控制器实现


java代码:
Java代码收藏代码
  1. packagecn.javass.chapter6.web.controller;
  2. //省略import
  3. @Controller//或@RequestMapping//①将一个POJO类声明为处理器
  4. publicclassHelloWorldController{
  5. @RequestMapping(value="/hello")//②请求URL到处理器功能处理方法的映射
  6. publicModelAndViewhelloWorld(){
  7. //1、收集参数
  8. //2、绑定参数到命令对象
  9. //3、调用业务对象
  10. //4、选择下一个页面
  11. ModelAndViewmv=newModelAndView();
  12. //添加模型数据可以是任意的POJO对象
  13. mv.addObject("message","HelloWorld!");
  14. //设置逻辑视图名,视图解析器会根据该名字解析到具体的视图页面
  15. mv.setViewName("hello");
  16. returnmv;//○3模型数据和逻辑视图名
  17. }
  18. }


可以通过在一个POJO类上放置@Controller或@RequestMapping,即可把一个POJO类变身为处理器;

@RequestMapping(value = "/hello")请求URL(/hello) 到 处理器的功能处理方法的映射;

模型数据和逻辑视图名的返回。

现在的处理器无需实现/继承任何接口/类,只需要在相应的类/方法上放置相应的注解说明下即可,

非常方便。

(2、Spring配置文件chapter6-servlet.xml

(2.1、HandlerMapping和HandlerAdapter的配置

如果您使用的是Spring3.1之前版本,开启注解式处理器支持的配置为:

DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter。

java代码:
Java代码收藏代码
  1. <!—Spring3.1之前的注解HandlerMapping-->
  2. <bean
  3. class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
  4. <!—Spring3.1之前的注解HandlerAdapter-->
  5. <bean
  6. class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>

如果您使用的Spring3.1开始的版本,建议使用RequestMappingHandlerMapping和RequestMappingHandlerAdapter。

java代码:
Java代码收藏代码
  1. <!--Spring3.1开始的注解HandlerMapping-->
  2. <bean
  3. class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
  4. <!--Spring3.1开始的注解HandlerAdapter-->
  5. <bean
  6. class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

下一章我们介绍DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter

与RequestMappingHandlerMapping和RequestMappingHandlerAdapter 的区别。

(2.2、视图解析器的配置

还是使用之前的org.springframework.web.servlet.view.InternalResourceViewResolver。

(2.3、处理器的配置

java代码:
Java代码收藏代码
  1. <!--处理器-->
  2. <beanclass="cn.javass.chapter6.web.controller.HelloWorldController"/>

只需要将处理器实现类注册到spring配置文件即可,spring的DefaultAnnotationHandlerMapping或RequestMappingHandlerMapping

能根据注解@Controller或@RequestMapping自动发现。

(2.4、视图页面(/WEB-INF/jsp/hello.jsp)

java代码:
Java代码收藏代码
  1. <%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%>
  2. <!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
  3. <html>
  4. <head>
  5. <metahttp-equiv="Content-Type"content="text/html;charset=UTF-8">
  6. <title>HelloWorld</title>
  7. </head>
  8. <body>
  9. ${message}
  10. </body>
  11. </html>

${message}表示显示由HelloWorldController处理器传过来的模型数据。

(4、启动服务器测试

地址栏输入http://localhost:9080/springmvc-chapter6/hello,我们将看到页面显示“Hello World!”,

表示成功了。

整个过程和我们第二章中的Hello World类似,只是处理器的实现不一样。接下来我们来看一下具体流程吧。

6.3、运行流程

和第二章唯一不同的两处是:

1、HandlerMapping实现:使用DefaultAnnotationHandlerMapping(spring3.1之前)或RequestMappingHandlerMapping(spring3.1)

替换之前的BeanNameUrlHandlerMapping

注解式处理器映射会扫描spring容器中的bean,发现bean实现类上拥有

@Controller或@RequestMapping注解的bean,并将它们作为处理器。

2、HandlerAdapter实现:使用AnnotationMethodHandlerAdapter(spring3.1之前)或RequestMappingHandlerAdapter(spring3.1)替换之前的SimpleControllerHandlerAdapter

注解式处理器适配器会通过反射调用相应的功能处理方法(方法上拥有@RequestMapping注解)。

好了到此我们知道Spring如何发现处理器、如何调用处理的功能处理方法了,接下来我们

详细学习下如何定义处理器、如何进行请求到功能处理方法的定义。

6.4、处理器定义

6.4.1、@Controller

java代码:
Java代码收藏代码
  1. @Controller
  2. publicclassHelloWorldController{
  3. ……
  4. }

推荐使用这种方式声明处理器,它和我们的@Service、@Repository很好的对应了我们常见的三层开发架构的组件。

6.4.2、@RequestMapping

java代码:
Java代码收藏代码
  1. @RequestMapping
  2. publicclassHelloWorldController{
  3. ……
  4. }

这种方式也是可以工作的,但如果在类上使用@ RequestMapping注解一般是用于

窄化功能处理方法的映射的,详见6.4.3。

Java代码收藏代码
  1. packagecn.javass.chapter6.web.controller;
  2. @Controller
  3. @RequestMapping(value="/user")//①处理器的通用映射前缀
  4. publicclassHelloWorldController2{
  5. @RequestMapping(value="/hello2")//②相对于①处的映射进行窄化
  6. publicModelAndViewhelloWorld(){
  7. //省略实现
  8. }
  9. }

6.4.3、窄化请求映射

java代码:
Java代码收藏代码
  1. packagecn.javass.chapter6.web.controller;
  2. @Controller
  3. @RequestMapping(value="/user")//①处理器的通用映射前缀
  4. publicclassHelloWorldController2{
  5. @RequestMapping(value="/hello2")//②相对于①处的映射进行窄化
  6. publicModelAndViewhelloWorld(){
  7. //省略实现
  8. }
  9. }

①类上的@RequestMapping(value="/user") 表示处理器的通用请求前缀;

②处理器功能处理方法上的是对①处映射的窄化。

因此http://localhost:9080/springmvc-chapter6/hello2 无法映射到HelloWorldController2的 helloWorld功能处理方法;而http://localhost:9080/springmvc-chapter6/user/hello2是可以的。

窄化请求映射可以认为是方法级别的@RequestMapping继承类级别的@RequestMapping。

窄化请求映射还有其他方式,如在类级别指定URL,而方法级别指定请求方法类型或参数等等,

后续会详细介绍。

到此,我们知道如何定义处理器了,接下来我们需要学习如何把请求映射到相应的功能处理方法

进行请求处理。

6.5、请求映射

处理器定义好了,那接下来我们应该定义功能处理方法,接收用户请求处理并选择视图进行渲染。

首先我们看一下图6-1:

http请求信息包含六部分信息:
①请求方法,如GET或POST,表示提交的方式;
URL,请求的地址信息;
③协议及版本
④请求头信息(包括Cookie信息);
⑤回车换行(CRLF);
⑥请求内容区(即请求的内容或数据),如表单提交时的参数数据、URL请求参数(?abc=123 ?后边的)等。
想要了解HTTP/1.1协议,请访问http://tools.ietf.org/html/rfc2616
那此处我们可以看到有①、②、④、⑥一般是可变的,因此我们可以这些信息进行请求到
处理器的功能处理方法的映射,因此请求的映射分为如下几种:

URL路径映射:使用URL映射请求到处理器的功能处理方法;

请求方法映射限定:如限定功能处理方法只处理GET请求;

请求参数映射限定:如限定只处理包含“abc”请求参数的请求;

请求头映射限定:如限定只处理“Accept=application/json”的请求。

接下来看看具体如何映射吧。

分享到:
评论

相关推荐

    使用Spring 2.5 基于注解驱动的 Spring MVC详解

    使用Spring 2.5 基于注解驱动的 Spring MVC详解

    spring mvc的配置文件详解

    简单的描述了spring mvc的配置示例,不包括注解方法和示例代码

    Spring+MVC+3.0.5+Spring+3.0.5+MyBatis3.0.4全注解实例详解

    Spring+MVC+3.0.5+Spring+3.0.5+MyBatis3.0.4全注解实例详解

    Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解

    Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解

    SpringMVC教程

    第六章 注解式控制器详解1(注解式控制器运行流程及处理器定义).pdf 第六章 注解式控制器详解2(SpringMVC3强大的请求映射规则详解).pdf 第六章 注解式控制器详解3(生产者、消费者请求限定).pdf 第六章 注解式控制器...

    注解的spring MVC 详解

    该文档时基于注解的当前流行的SpringMVC框架,涵盖了springMVC常用的注解的使用方法!以及文件的配置,和案例!

    Spring MVC 使用注解的示例讲解

    一个简单的Spring MVC 框架搭建的示例 并且清楚的注解让你更快速的书写代码

    21道Java Spring MVC综合面试题详解含答案(值得珍藏)

    Spring MVC是Spring框架中的一部分,全称是Spring Web MVC,主要用于实现MVC设计模式的Web框架。它分离了控制器、模型对象、过滤器以及处理程序对象的角色,使得它们更容易进行定制。 Spring MVC的优点包括: 基于...

    跟我学SpringMVC 教程

    第六章 注解式控制器详解 Spring MVC 3.1新特性 生产者、消费者请求限定 第六章 注解式控制器详解 SpringMVC强大的数据绑定(1) 第六章 注解式控制器详解 SpringMVC强大的数据绑定(2) 第七章 注解式控制器的...

    spring_mvc注解总结

    spring_mvc各种注解详解与总结,针对初学spring_mvc的童鞋

    跟我学SpringMVC

    第六章 注解式控制器详解 Spring MVC 3.1新特性 生产者、消费者请求限定 第六章 注解式控制器详解 SpringMVC强大的数据绑定(1) 第六章 注解式控制器详解 SpringMVC强大的数据绑定(2) 第七章 注解式控制器的数据...

    Spring Web MVC入门教程

    第三章:注解式控制器开发详解 包括:注解式开发HelloWorld、处理器定义、请求映射、REST风格支持、请求数据映射、数据绑定等诸多内容 第四章:数据类型转换 包括:简介、内建类型转换器、自定义类型转换器等 第五...

    SpringMVC注解驱动的控制器详解

    SpringMVC注解驱动的控制器详解,具体效果与过程看博文 http://blog.csdn.net/evankaka/article/details/45562951

    Spring MVC注解式开发使用详解

    本篇文章主要介绍了Spring MVC注解式开发使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Spring MVC 框架搭建配置方法及详解

    现在主流的Web MVC框架除了Struts这个主力 外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时,可实行的方案自然就多了。不过要想灵活运用Spring MVC来...

    springmvc3+spring+mybatis3整合项目 注解实现

    springMVC+Mybatis3 0 2+spring3 0 5(包含事务详解 代码诠释 含数据库文件) 注解实现自动注入 展示了增 删 改 查 注解 sql文件 经过严密测试绝对可以运行起来

    详解在Spring MVC中使用注解的方式校验RequestParams

    本篇文章主要介绍了详解在Spring MVC中使用注解的方式校验RequestParams ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

    Java之Spring Boot详解

    (2)在 web.xml 文件中配置 Spring mvc 的前端控制器 (3)创建一个 spring mvc 的配置文件 (4)在 spring mvc 的配置文件中进行相关配置   1) 配置注解扫描路径   2)配置处理器映射器   3)配置处理器...

Global site tag (gtag.js) - Google Analytics