先看一个简单的实例:

@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)

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

Spring中Controller和RequestMapping的详解的更多相关文章

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

    前言 说起Spring中循环依赖的解决办法,相信很多园友们都或多或少的知道一些,但当真的要详细说明的时候,可能又没法一下将它讲清楚.本文就试着尽自己所能,对此做出一个较详细的解读.另,需注意一点,下文 ...

  2. Spring中@Value标签的使用详解

    1.@Value标签 由于Spring对通过IOC的方式对对象进行统一管理,所以对任何对象而言,其生成方法均由Spring管理.传统的方法是通过XML配置每一个Bean,并对这个Bean的所有Fiel ...

  3. Spring中bean的作用域scope详解

    参考文献:http://blog.csdn.net/jacklearntech/article/details/40157861 http://www.cnblogs.com/qq78292959/p ...

  4. Spring中配置文件applicationContext.xml配置详解

    <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...

  5. spring中Bean的注入参数详解

    字面值    一般指可用字符串表示的值,这些值可以通过<value>元素标签进行注入.在默认情况下,基本数据类型及其封装类.String等类型都可以采取字面值注入的方式,Spring容器在 ...

  6. Spring中的ApplicationListener的使用详解案例

    本文链接:https://blog.csdn.net/u010963948/article/details/83507185 1.ApplicationContext Spring的核心,Contex ...

  7. @RequestMapping 用法详解之地址映射

    @RequestMapping 用法详解之地址映射 引言: 前段时间项目中用到了RESTful模式来开发程序,但是当用POST.PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没 ...

  8. idea spring+springmvc+mybatis环境配置整合详解

    idea spring+springmvc+mybatis环境配置整合详解 1.配置整合前所需准备的环境: 1.1:jdk1.8 1.2:idea2017.1.5 1.3:Maven 3.5.2 2. ...

  9. [转帖]@RequestMapping 用法详解之地址映射(转)

    @RequestMapping 用法详解之地址映射(转) https://www.cnblogs.com/qq78292959/p/3760560.html 从csdn 发现的文章 然后csdn指向c ...

随机推荐

  1. java并发实战:连接池实现

    池化技术简介 在我们使用数据库的过程中,我们往往使用数据库连接池而不是直接使用数据库连接进行操作,这是因为每一个数据库连接的创建和销毁的代价是昂贵的,而池化技术则预先创建了资源,这些资源是可复用的,这 ...

  2. 关于secureCRT的安装

    原文地址:https://www.cnblogs.com/yjd_hycf_space/p/7729796.html 安装该楼主的方式基本可以破解: 踩坑事项:1)可以选择自定义安装:然后将注册机复制 ...

  3. 集合之WeakHashMap

    WeakHashMap 底层数据结构是哈希表结构 依赖于键的数据结构特点 不同于HashMap,该类的键是以弱键的形式存在 当该键成为垃圾对象,会被垃圾回收期空闲的时候回收,那么改键所对应值也会被回收 ...

  4. Java开发小技巧(六):使用Apache POI读取Excel

    前言 在数据仓库中,ETL最基础的步骤就是从数据源抽取所需的数据,这里所说的数据源并非仅仅是指数据库,还包括excel.csv.xml等各种类型的数据接口文件,而这些文件中的数据不一定是结构化存储的, ...

  5. 破解Wifi

    牛刀小试:Wifi破解的原理. 准备工具:   1:Kali Linux系统 2:一块好用的无线网卡 (推荐免驱版,网上也有推荐,可以去百度上google一下) 3:WPA字典(用来爆破抓获的握手包) ...

  6. Python 入门(一)

    IDE 个人推荐  Pycharm : 比较好用,虽然没有中文,但是练练英语也不错,毕竟大同小异 基础语法 行与缩进 python最具特色的就是使用缩进来表示代码块,不需要使用大括号 {} . 缩进的 ...

  7. React Router 4.0 实现路由守卫

    在使用 Vue 或者 Angular 的时候,框架提供了路由守卫功能,用来在进入某个路有前进行一些校验工作,如果校验失败,就跳转到 404 或者登陆页面,比如 Vue 中的 beforeEnter 函 ...

  8. 前端模拟API数据的两种方式

    第一种方法:使用 mock-api 1.创建一个项目 2.创建一个资源 3.拖动创建记录 点击data查看记录 4.如何访问API的数据 第一种方式:在终端中通过 curl + 地址,如图: 第二种方 ...

  9. URL传值中文乱码的解决

    使用 tomcat 时,相信大家都回遇到中文乱码的问题,具体表现为通过表单取得的中文数据为乱码. 一.初级解决方法 通过一番检索后,许多人采用了如下办法,首先对取得字符串按照 iso8859-1 进行 ...

  10. <简明>Markdown指南

    什么是Markdown?Markdown是一种轻量级的「标记语言」,通常为程序员群体所用,目前它已是全球最大的技术分享网站 GitHub 和技术问答网站 StackOverFlow 的御用书写格式. ...