`
jinnianshilongnian
  • 浏览: 21434403 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2405044
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:2997694
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5631469
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:257571
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1593160
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:248971
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5847542
Group-logo
跟我学Nginx+Lua开...
浏览量:698161
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:780453
社区版块
存档分类
最新评论

注解式控制器运行流程及处理器定义 第六章 注解式控制器详解——跟着开涛学SpringMVC

 
阅读更多

 

声明:本系列都是原创内容,觉得好就顶一个,让更多人知道!! 希望那些的人给出不好的理由,我会积极改正。写博客不容易,写原创更不容易!!


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代码:
package cn.javass.chapter6.web.controller;
//省略import
@Controller         // 或 @RequestMapping               //①将一个POJO类声明为处理器
public class HelloWorldController {
    @RequestMapping(value = "/hello")                  //②请求URL到处理器功能处理方法的映射
    public ModelAndView helloWorld() {
		//1、收集参数
		//2、绑定参数到命令对象
		//3、调用业务对象
		//4、选择下一个页面
		ModelAndView mv = new ModelAndView();
		//添加模型数据 可以是任意的POJO对象
		mv.addObject("message", "Hello World!");
		//设置逻辑视图名,视图解析器会根据该名字解析到具体的视图页面
		mv.setViewName("hello");
		return mv;                                         //○3 模型数据和逻辑视图名
	}
}


 

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

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

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

 

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

非常方便。

 

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

2.1、HandlerMapping和HandlerAdapter的配置

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

DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter。

 

java代码:
<!—Spring3.1之前的注解 HandlerMapping -->
<bean 
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>

<!—Spring3.1之前的注解 HandlerAdapter -->
<bean 
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
    

 

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

 

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

 

下一章我们介绍DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter

与RequestMappingHandlerMapping和RequestMappingHandlerAdapter 的区别。

 

2.2、视图解析器的配置

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

2.3、处理器的配置

 

 

java代码:
<!-- 处理器 -->
<bean class="cn.javass.chapter6.web.controller.HelloWorldController"/>

 

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

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

 

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

 

 

java代码:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello World</title>
</head>
<body>
${message}
</body>
</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代码:
@Controller
public class HelloWorldController {
……
}

 

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

 

6.4.2、@RequestMapping

 

java代码:
@RequestMapping
public class HelloWorldController {
……
}

 

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

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

 

 

package cn.javass.chapter6.web.controller;
@Controller
@RequestMapping(value="/user")                 //①处理器的通用映射前缀
public class HelloWorldController2 {
    @RequestMapping(value = "/hello2")        //②相对于①处的映射进行窄化
    public ModelAndView helloWorld() {
         //省略实现
    }
}

6.4.3、窄化请求映射

 

java代码:
package cn.javass.chapter6.web.controller;
@Controller
@RequestMapping(value="/user")                 //①处理器的通用映射前缀
public class HelloWorldController2 {
    @RequestMapping(value = "/hello2")        //②相对于①处的映射进行窄化
    public ModelAndView helloWorld() {
         //省略实现
    }
}

①类上的@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”的请求。

 

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

 


私塾在线学习网
原创内容(http://sishuok.com

原创内容,转载请注明私塾在线【http://sishuok.com/forum/blogPost/list/0/6117.html

250
4
分享到:
评论
69 楼 wangviviying 2016-08-26  
这篇的赞有点多啊,哈哈
68 楼 zkzqzzz 2016-07-05  
不得不给博主32个赞!
67 楼 HaydnSyx 2016-03-02  
tao哥,这个DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter
与RequestMappingHandlerMapping和RequestMappingHandlerAdapter 的区别到底是什么?为什么我从下一章没看到
66 楼 likui1314159 2016-01-10  
讲的太好了,学到了很多东西。。。懂的技术并懂得分享的人,少有!
65 楼 chen_lian 2016-01-06  
讲述的太详细啦 赞一个
64 楼 木乃伊微笑 2015-10-26  
很好的教程,对于我这样的初学者来说绝对是一大福利。
63 楼 u011225629 2015-07-29  
本文读过的每一篇文章都为你点  顶  了,可是今天网站出现问题了,顶的按钮失效了
62 楼 foreverandever 2015-04-24  
请问一下,所以的 2、4、6 是什么。6.1节中第四点上提到的2.4.6。
61 楼 redcoatjk 2015-04-07  
没看到第7章有说到"下一章我们介绍DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter

与RequestMappingHandlerMapping和RequestMappingHandlerAdapter 的区别。

"
60 楼 james513572009 2015-03-10  
好非常好。
59 楼 java19880223 2015-01-06  

1111111111


58 楼 yj20141126 2014-12-30  
57 楼 ldw4033 2014-09-11  
能看到您这么用心的文档,在国内实属不易
56 楼 杨白白 2014-03-19  
spring3.1.1的版本我用
<bean  
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> 
<!--Spring3.1开始的注解 HandlerAdapter --> 
<bean 
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
替换了<mvc:annotation-driven/> 结果总是404.怎么回事啊。。
55 楼 lzrabbit 2014-02-22  
查了很多资料,你这个讲的最详细清楚,多谢
54 楼 wangzj218 2014-01-26  
最近研究springmvc注解,看到tao哥的原创,很有帮助,会一直关注下去
53 楼 jinnianshilongnian 2013-11-28  
lleid 写道
jinnianshilongnian 写道
c_79_68_69 写道
请教个问题:

  只需要将处理器实现类注册到spring配置文件即可,spring的DefaultAnnotationHandlerMapping或RequestMappingHandlerMapping能根据注解@Controller或@RequestMapping自动发现。
 
   关于上面一句话,spring的注解不都是通过<context:component-scan来扫描的吗?为什么这里面还要注册到配置文件里面?难道某些注解比较特殊?
  

1、<context:component-scan 扫描相关注解bean注册
2、DefaultAnnotationHandlerMapping或RequestMappingHandlerMapping 发现@Controller或@RequestMapping 并把它们映射为控制器(处理用户发过来的请求)  两个的功能是不一样的  (比如我的控制器 完全可以不使用context:component-scan)

那我可不可以理解是:<context:component-scan>会扫描所有带注解的bean,RequestMappingHandlerMapping 只会去发现@Controller或@RequestMapping


可以这么理解
52 楼 lleid 2013-11-28  
jinnianshilongnian 写道
c_79_68_69 写道
请教个问题:

  只需要将处理器实现类注册到spring配置文件即可,spring的DefaultAnnotationHandlerMapping或RequestMappingHandlerMapping能根据注解@Controller或@RequestMapping自动发现。
 
   关于上面一句话,spring的注解不都是通过<context:component-scan来扫描的吗?为什么这里面还要注册到配置文件里面?难道某些注解比较特殊?
  

1、<context:component-scan 扫描相关注解bean注册
2、DefaultAnnotationHandlerMapping或RequestMappingHandlerMapping 发现@Controller或@RequestMapping 并把它们映射为控制器(处理用户发过来的请求)  两个的功能是不一样的  (比如我的控制器 完全可以不使用context:component-scan)

那我可不可以理解是:<context:component-scan>会扫描所有带注解的bean,RequestMappingHandlerMapping 只会去发现@Controller或@RequestMapping
51 楼 jinnianshilongnian 2013-10-17  
c_79_68_69 写道
请教个问题:

  只需要将处理器实现类注册到spring配置文件即可,spring的DefaultAnnotationHandlerMapping或RequestMappingHandlerMapping能根据注解@Controller或@RequestMapping自动发现。
 
   关于上面一句话,spring的注解不都是通过<context:component-scan来扫描的吗?为什么这里面还要注册到配置文件里面?难道某些注解比较特殊?
  

1、<context:component-scan 扫描相关注解bean注册
2、DefaultAnnotationHandlerMapping或RequestMappingHandlerMapping 发现@Controller或@RequestMapping 并把它们映射为控制器(处理用户发过来的请求)  两个的功能是不一样的  (比如我的控制器 完全可以不使用context:component-scan)
50 楼 c_79_68_69 2013-10-16  
请教个问题:

  只需要将处理器实现类注册到spring配置文件即可,spring的DefaultAnnotationHandlerMapping或RequestMappingHandlerMapping能根据注解@Controller或@RequestMapping自动发现。
 
   关于上面一句话,spring的注解不都是通过<context:component-scan来扫描的吗?为什么这里面还要注册到配置文件里面?难道某些注解比较特殊?
  

相关推荐

    跟我学SpringMVC 教程

    第六章 注解式控制器详解 注解式控制器运行流程及处理器定义 第六章 注解式控制器详解 SpringMVC3强大的请求映射规则详解 第六章 注解式控制器详解 Spring MVC 3.1新特性 生产者、消费者请求限定 第六章 注解式...

    跟我学SpringMVC

    第六章 注解式控制器详解 注解式控制器运行流程及处理器定义 第六章 注解式控制器详解 SpringMVC3强大的请求映射规则详解 第六章 注解式控制器详解 Spring MVC 3.1新特性 生产者、消费者请求限定 第六章 注解式控制...

    SpringMvc开涛.rar

    PDF,源代码 开涛学SpringMVC 第一章源代码下载 第二章 Spring MVC入门 源代码下载 ...第五章 处理器拦截器详解——跟着开涛学SpringMVC 第六章 注解式控制器详解 第七章 注解式控制器的数据验证、类型转换及格式化

    SpringMVC教程

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

    SpringMVC注解驱动的控制器详解

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

    springmvc常用注解标签详解

    springmvc常用注解标签详解,总结,常用注解,标签详解,springmvc

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

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

    SpringMVC注解开发的详解.doc

    该文档是关于SpringMVC注解开发的详解,如:@Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC ...@Controller 只是定义了一个控制器类,而使用@RequestMapping 注解的方法才是真正处理请求的处理器。

    SpringMVC 常用注解类视频详解

    SpringMVC 常用注解类,视频讲解,带课程文档。SpringMVC 常用注解类

    springmvc注解详解

    文档详细的解释了springmvc,有springmvc的配置及注解详解

    springMVC详解以及注解说明

    springMVC详解以及注解说明

    SpringMvc注解详解

    详细的介绍了Spring注解,常用注解标签详解,以及注解之间的区别与联系。

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

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

    springMVC详解以及注解

    对spring的注解作了详细的解释,很有用

    学习SpringMVC——如何获取请求参数详解

    本篇文章主要介绍了SpringMVC——如何获取请求参数详解,详细的介绍了每种参数注解的用法。具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

    springmvc开发资料

    3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。 4、 DispatcherServlet调用HandlerAdapter处理器适配器。 5、 ...

Global site tag (gtag.js) - Google Analytics