先看一个简单的实例:

@Controller
@RequestMapping("/hello")
public class anyTypeController{@RequestMapping(method={RequestMethod.GET,RequestMethod.POST})public String processWebRequest(){return "hello";}
}

上述例子中简单了阐明了Controller以及RequestMapping的用法。含义是

将这个class申明为一个bean,当web请求为/hello时,跳转到这个class进行处理。

Controller的原型分析:
既然上文说了,此处的不需要再配置文件中配置例如<bean id="xxx" class="com.xxx">的语句,但是我们的Spring如何知道哪些class是bean文件,哪些class文件不是bean文件呢? 按照Spring教材上所讲,此处所有配置了@Controller 的class文件回通过java的反射机制进行读取,因此在这里Spring2.5官方的 org.springframework.web.servlet.mvc.annotation.defaultAnnotationHandlerMapping 这个类进行处理。Ps:这里想进一步学习的同学可以查看源码进行分析。这个类的作用是:首先扫描Classpath获取注解了@Controller的对 象(扫面通过语句:<context:component-sacn/>进行扫描)。 之后通过反射机制进行绑定。

自定义用于基于注解的HandlerAdapter:

上面我们已经通过注解的方式配置好了bean,但是我们bean中方法不只是一个,我们怎么知道每次访问的是Controller的哪一个具体的方 法呢?具体方法是使用@RequestMapping()注解,然后利用 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter 的反射机制,将Controller中的具体方法和请求方法名绑定起来。Ps:想了解更深的同学请看Spring的源码。

@RequestMapping

由于在网上搜集到的@RequestMapping的资料很不齐全,看完云里雾里,于是找了本书总结了一下。

@RequestMapping可以被标注类型申明和方法申明这两种方式上。

申明在类型定义上,那么@RequestMapping() 括号里面的东西通常为请求的地址

申明在方法定义上,那么它用来表明当面方法定义是一个Web请求处理方法。(Ps:这是书上讲的,个人理解的是加上具体的映射条件,使映射不会出错)

下来看个例子,详细说明:

@Controller
@RequestMapping("/hello")
public class MyController{@RequestMapping(method=RequestMethod.GET)public String function1(..){..}@RequestMapping(method=RequestMethod.POST)public String function2(..){..}
}

类型定义上标注的@RequestMapping("/hello")的意思是,所有提交到/hello的web请求都有MyController处理。 但是问题来了,假设这个bean里面有很多个函数,到底决定由哪一个来处理呢?接下来会使用在方法定义上的@RequestMapping()进行进一步 的缩小范围。如次所以,所有GET方法请求都会被function1处理,POST请求被function2处理。除了method可以区分,我们还有 param可以区分(因为一个bean里面也不仅仅只有两个函数。GET和POST并不能使用于所有的地方)。

params属性的两种表达式形式:

1.“参数名=参数值”,通常参数名相同,后面的参数值用来区分并且界定请求的处理范围。实例:

@Controller
@RequestMapping("/hello")
public class MyController{@RequestMapping(params="locale=en",{method=RequestMethod.POST})public String function1(..){..}@RequestMapping(params="locale=ch",method={RequestMethod.POST})public String function2(..){..}
}

这里,当请求为http://xxx/xxx/hello?locale=en  时,调用function1(..)函数

当请求是http://xxx/xxx/hello?locale=ch时,调用function2()函数

2.“paramter” 形式的表达式。 这里判断请求中时候存在某一个参数来决定当前请求交个哪个方法处理。

@Controller
@RequestMapping("/hello")
public class MyController{@RequestMapping(params="delete",{method=RequestMethod.POST})public String function1(..){..}@RequestMapping(params="update",method={RequestMethod.POST})public String function2(..){..}
}

这里请求可以是http://xxxxxxx/hell?delete  就会访问function1

@RequestMapping还有一一种全部用于方法级别的绑定方式.例:注意,这里用的是value

@Controller
public class MyController{@RequestMapping("/hello1")public String function1(..){...}@RequestMapping(value="/hello2",{method=RequestMethod.POST})public String function2(..){..}@RequestMapping(value="/hello3",method={RequestMethod.POST})public String function3(..){..}
}

上述仅仅讲了映射的相关知识。下来看如果带有参数的请求应该如何处理。

请求参数到方法参数的绑定

1.默认绑定行为

假设有如下请求:<a href="/hello?age=10?name=jack">

@Controller
public class MyController{@RequestMapping("/hello")pulbic String function1(int age ,String name){System.out.println(age + name);return "success";}
}

在这里会发现,age 和name自动赋给了函数参数中的age和name。 这是以为默认绑定行为是根据名称匹配原则进行的函数绑定。当请求中的参数名与方法中的参数名一致,相应的参数值将被绑定到对应的方法参数上(这里框架类保证了请求参数完成了类型转换)。

2.使用@RequestParam明确的指定绑定关系.同样是上面的例子.

@Controller
public class MyController{@RequestMapping("/hello")pulbic String function1(@RequestParam("ageOfJack") int age ,String name){System.out.println(age + name);return "success";}
}

这时候同样是刚才的web请求,已经可以将age的值赋给了ageOfJack参数。默认情况下,如果@RequestParam请求的数据不存在,会抛 出异常。这是因为他的required属性决定的。他的默认值是true.假设将他设置为false,即该参数不存在时不会报错,对应方法将获取到该类型 的默认值。

pulbic String function1(@RequestParam("ageOfJack",required=false) int age ,String name)

3.添加自定义数据绑定规则。

Spring框架提供的数据绑定才用JavaBean规范的PropertyEditor机制进行数据转换。在基于注解的Controller中,可以用下面两种方式达到这一目的.

1.使用@InitBinder(针对一个Controller)

2.指定自定义的WebBindingInitialize。(这个是针对多个Controller)

这个感觉用的比较少,留下记号,遇到再看。

转载于:https://www.cnblogs.com/ChrisMurphy/p/4877763.html

Spring中Controller和RequestMapping的详解相关推荐

  1. Spring MVC中@Controller和@RequestMapping注解详解

    在<第一个Spring MVC应用>教程中创建了两个传统风格的控制器,它们是实现 Controller 接口的类.传统风格的控制器不仅需要在配置文件中部署映映射,而且只能编写一个处理方法, ...

  2. Spring中的InitializingBean的使用详解

    文章目录 一.InitializingBean作用 二.InitializingBean扩展 写在前面: 我是「境里婆娑」.我还是从前那个少年,没有一丝丝改变,时间只不过是考验,种在心中信念丝毫未减, ...

  3. Spring中的ApplicationListener的使用详解案例(观察者模式)

    1.ApplicationContext Spring的核心,Context我们通常解释为上下文环境.ApplicationContext则是应用的容器. Spring把Bean(object)放在容 ...

  4. Spring中的循环依赖解决详解

    目录 1 什么是循环依赖? 1.1 构造器循环依赖 1.2 field属性注入循环依赖 1.3 field属性注入循环依赖(prototype) 2 循环依赖处理 2.1 构造器循环依赖(无法解决) ...

  5. java注解式开发_JAVA语言之Spring MVC注解式开发使用详解[Java代码]

    本文主要向大家介绍了JAVA语言的Spring MVC注解式开发使用详解,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. MVC注解式开发即处理器基于注解的类开发, 对于每一个定义的处 ...

  6. 第十二章 Spring Cloud Config 统一配置中心详解

    目录 一.配置问题分析及解决方案 1.问题分析 2.解决方案 二.Spring Cloud Config 介绍 1.Spring Cloud Config特性 2.Spring Cloud Confi ...

  7. SpringSecurity权限管理框架系列(六)-Spring Security框架自定义配置类详解(二)之authorizeRequests配置详解

    1.预置演示环境 这个演示环境继续沿用 SpringSecurit权限管理框架系列(五)-Spring Security框架自定义配置类详解(一)之formLogin配置详解的环境. 2.自定义配置类 ...

  8. spring boot模板引擎thymleaf用法详解

    spring boot模板引擎thymleaf用法详解 Spring-boot支持FreeMarker.Thymeleaf.jsp.veocity 但是对freemarker和thymeleaf的支持 ...

  9. @Controller,@Service,@Repository,@Component详解

    转载自 @Controller,@Service,@Repository,@Component详解 @Controller 用来表示一个web控制层bean,如SpringMvc中的控制器. @Ser ...

最新文章

  1. 记忆的天空:“崩塌型”记忆活动原理
  2. Vue.js实现前段评论展示
  3. LeetCode 23 合并K个升序链表
  4. 一年增加1.2w星,Dapr能否引领云原生中间件的未来?
  5. Mybatis参数传递及返回类型
  6. C++笔记-断言、静态断言、R转义符
  7. 计算机应用基础问题,计算机应用基础常见问题
  8. 大牛写的Openstack虚拟机创建细节
  9. 流行于机器学习竞赛的Boosting,一文讲透足够了
  10. 《面向机器智能的TensorFlow实践》导读
  11. application配置和profile隔离配置(转)
  12. 大数据工程师成长之路
  13. gitlab 添加了 ssh keys, git clone git@xxx:xx.git 无法拉取的解决思路及办法
  14. c语言中输出以e为底的指数,c语言中以e为底的指数怎么表示 c++中怎样表示以e为底的...
  15. 海康威视监控摄像头连接电脑教程
  16. java里equal与equals_Java中关于==与equal和equals的区别
  17. python古诗代码案例_一行代码竟然如此逆天?小码王python案例首次对外展现!
  18. 阿里云杨国彦:云上护航,陪伴成长
  19. 小技巧-如何在任何一个文件夹中打开cmd
  20. 以太坊的区块和存储(一):区块头

热门文章

  1. 利用组策略防止计算机访问共享资源
  2. WEB应用常见15种安全漏洞一览
  3. SFB 项目经验-28-设置-所有用户-OWA-时区-语言-跳过-时区设置)
  4. 累加器配上委托也可以很吊
  5. paramiko监控 windows服务器 被监控服务器只需要安装openssh服务即可基于wmic完成大部分监控...
  6. Gatling教程系列一简单GET请求测试(二)
  7. 修改科技论文的6项注意
  8. C#“.NET研究”类类型
  9. 七 递归与二分法、匿名函数、内置函数
  10. 搜索引擎选择: Elasticsearch与Solr