文档章节

SpringMVC(三):@RequestMapping 注解

LevelCoder
 LevelCoder
发布于 2017/06/01 17:31
字数 2265
阅读 4
收藏 0
点赞 0
评论 0

RequestMapping:将Web请求映射到特定的处理程序类和/或处理程序方法的注释。在servlet和Portlet环境之间提供一致的风格,用语义适应具体环境。

RequestMapping源码

package org.springframework.web.bind.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.concurrent.Callable;


@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {


	/**
	 * 
	 * @return
	 */
	String name() default "";


	/**
	 * 支持URL路径映射模式
	 * 支持Ant占位符匹配映射
	 * 支持portlet环境映射的Portlet模式
	 * 支持类级别及方法级别上的映射支持,当类级别进行映射支持时,所有子方法都继承主映射,缩小处理方法
	 * @return
	 */
	String[] value() default {};


	/**
	 * HTTP请求方法映射,缩小主映射,支持 GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE
	 * @return
	 */
	RequestMethod[] method() default {};


	/**
	 * 映射请求参数,缩小主映射
	 * 支持表达式匹配模式进行参数请求映射
	 * 支持类级别映射,当为类级别映射时,所有子方法都继承主映射参数限制
	 * @return
	 */
	String[] params() default {};


	/**
	 * 映射请求头
	 * 指定request中必须包含某些指定的header值,才能让该方法处理请求。
	 * @return
	 */
	String[] headers() default {};

	/**
	 * 指定处理请求的提交内容类型(Content-Type)
	 * @return
	 */
	String[] consumes() default {};


	/**
	 *  指定返回的内容类型
	 * @return
	 */
	String[] produces() default {};

}

 

通过RequestMapping源码中不难看到 RequestMapping 基于Mapping注解,我们看下Mapping注解的源码

package org.springframework.web.bind.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 表示web映射注释的元注释
 */
@Target({ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Mapping {

}

通过两个源码不难理解 所有的web映射注解都属于元注解,RequestMapping在做了进一步的划分,可缩小查找范围,具体有name(),value(),method(),params(),headers(),consumes(),produces()这几类,除了name()我们又可以把余下的做些分类,1:consumes(),produces() 2:params(),headers() 3:value(),method()

针对这些分类我们做如下案例去解释

pom.xml,web.xml,springmvc.xml配置

请参考博文: https://my.oschina.net/LevelCoder/blog/912107

value作用于类级别上,在方法体中缩小查找范围

package com.levelcoder.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * 
 * 描述:@RequestMapping 作用于类级别上
 *
 * 作者:LevelCoder
 *
 * 邮箱:LevelCoder@126.com
 *
 * 日期:2017年6月1日 下午4:44:32
 *
 * 版本:V1.0.0
 */
@Controller
@RequestMapping(value="/type")
public class RMTypeController {

	@RequestMapping(value="/testType")
	public String type(){
		return "successType";
	}
}

 

测试index页面

<%@ 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>Insert title here</title>
</head>
<body>
	<p>初识@RequestMapping</p>
	<a href="type/testType"> TYPE</a>
</body>
</html>

测试结果返回页面

<%@ 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>Spring MVC : RequestMapping Type</title>
</head>
<body>
	恭喜LevelCoder:RequestMapping Type请求模式 程序跑通了,继续学习吧
</body>
</html>

 

执行结果

通过上面案例,我们不难分析出,当请求时,首先通过类级别 @RequestMapping(value="/type") 进行第一次过滤,然后通过方法级别上@RequestMapping(value="/testType") 在次过滤确认要执行的方法是哪一个,这样做的好处是在同一个控制器下可同时存在多个请求方法,可通过类查找到指定类,在通过方法下的值过滤到指定方法上。

 

value()中Ant风格请求模式

Ant风格支持3中匹配方式

匹配文件中一个字符
* 匹配文件中任意字符
** 匹配文件中多层路径
package com.levelcoder.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * 
 * 描述::@RequestMapping注解:Ant通配符
 *
 * 作者:LevelCoder
 *
 * 邮箱:LevelCoder@126.com
 *
 * 日期:2017年6月1日 上午9:43:37
 *
 * 版本:V1.0.0
 */
@Controller
public class RMAntController {


	/**
	 * 通配符模式映射
	 * 
	 * *:匹配文件中任意字符
	 * **:匹配文件中多层路径
	 * @return
	 */
	@RequestMapping(value="/rm/?evelCoder")
	public String ant1(){
		System.out.println("通配符 '?' 模式映射成功");
		return "successAnt";
	}
	
	/**
	 * ?:匹配文件中一个字符
	 * @return
	 */
	@RequestMapping(value="/rm/*/LevelCoder")
	public String ant2(){
		System.out.println("通配符 '*' 模式映射成功");
		return "successAnt";
	}
	
	/**
	 * **:匹配文件中多层路径
	 * @return
	 */
	@RequestMapping(value="/rm/**/LevelCoder")
	public String ant3(){
		System.out.println("通配符 '**' 模式映射成功");
		return "successAnt";
	}
}

 

测试index页面

<%@ 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>Insert title here</title>
</head>
<body>
	<p>Ant风格通配符请求</p>
	<a href="rm/lc/LevelCoder">Ant风格通配符*</a>
	<a href="rm/PevelCoder">Ant风格通配符?</a>
	<a href="rm/a/b/LevelCoder">Ant风格通配符**</a>
</body>
</html>

 

测试返回界面

<%@ 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>Spring MVC : RequestMapping ANT</title>
</head>
<body>
	恭喜LevelCoder:RequestMapping Ant风格 程序跑通了,继续学习吧
</body>
</html>

 

测试结果

通过上面案例 当请求时通过@RequestMapping 值在做*匹配时,头尾保持一致,中间的请求参数可以为任意值即可访问到方法中, 在做?匹配时,只需所有参数保持一致,在?占位符位置可以替换为任意字符串即可访问到方法中,在做**匹配时,只需头尾保持一种,中间请求方法可为多层嵌套模式

 

value()还支持含某一个变量,正则表达式等请求模式,涉及@PathVariable注解,在后续博文及案例中在做讲解

 

method() 中 GET,POST方法请求模式

package com.levelcoder.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * 
 * 描述:@RequestMapping注解 GET/POST请求模式
 *
 * 作者:LevelCoder
 *
 * 邮箱:LevelCoder@126.com
 *
 * 日期:2017年5月31日 下午11:58:42
 *
 * 版本:V1.0.0
 */
@Controller
public class RMGetPostController {

	
	/**
	 * 根据请求方法进行映射 GET方式
	 * @return
	 */
	@RequestMapping(value="/rm/method",method=RequestMethod.GET)
	public String get(){
		System.out.println("GET请求方式成功");
		return "successget";
	}
	
	
	/**
	 * 根据请求方法进行映射POST方式
	 * @return
	 */
	@RequestMapping(value="/rm/method",method=RequestMethod.POST)
	public String post(){
		System.out.println("POST请求方式成功");
		return "successpost";
	}
}

测试index页面

<%@ 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>Insert title here</title>
</head>
<body>

	<p>RequestMappingMethod的请求方式</p>
		<form action="rm/method" method="POST">
		<input type="submit" value="post请求" />
	</form>
	
	<form action="rm/method" method="GET">
		<input type="submit" value="get请求" />
	</form>
	
</body>
</html>

测试返回界面GET

<%@ 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>Spring MVC : RequestMapping GET</title>
</head>
<body>
	恭喜LevelCoder:RequestMapping GET请求模式 程序跑通了,继续学习吧
</body>
</html>

测试返回界面POST

<%@ 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>Spring MVC : RequestMapping POST</title>
</head>
<body>
	恭喜LevelCoder:RequestMapping POST 程序跑通了,继续学习吧
</body>
</html>

 

测试结果

 

通过上面案例 当请求时通过@RequestMapping value=rm/method 找到执行方法,再次根据method方法进行GET/POST请求过滤确认执行方法,这样可以在同一个HTML页面中嵌套多个form表单,根据表单中请求方法及请求类型判断在控制器中所对应的执行方法

method()剩余,HEAD, PUT, PATCH, DELETE, OPTIONS, TRACE 请求模式中涉及HiddenHttpMethodFilter,REST 在后续博文及案例中做讲解

 

params():映射请求参数,缩小主映射,支持表达式匹配模式进行参数请求映射

params支持简单表达式

params  必须包含params参数
!params  不能包含params参数
params != values  必须包含params参数且params不能等于values
{"params=value" ,params2}   必须包含params,params2参数,且params参数必须等于value

 

package com.levelcoder.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * 
 * 描述::@RequestMapping注解:带参数的注解
 *
 * 作者:LevelCoder
 *
 * 邮箱:LevelCoder@126.com
 *
 * 日期:2017年6月1日 上午9:38:17
 *
 * 版本:V1.0.0
 */
@Controller
public class RMParamsController {

	/**
	 * 带参数请求方式 Paramers
	 * @return
	 */
	@RequestMapping(value="/rm/paramers", params={"name"})
	public String paramers1(){
		System.out.println("带参数请求方式成功");
		return "successParamers";
	}
	
	/**
	 * 
	 * @return
	 */
	@RequestMapping(value="/rm/paramers", params={"!name"})
	public String paramers2(){
		return "successParamers";
	}
	
	/**
	 * 
	 * @return
	 */
	@RequestMapping(value="/rm/paramers", params={"name!=1"})
	public String paramers3(){
		return "successParamers";
	}
	
	/**
	 * 
	 * @return
	 */
	@RequestMapping(value="/rm/paramers", params={"name=1","age!=10","sex"})
	public String paramers4(){
		return "successParamers";
	}
}

 

测试index页面

<%@ 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>Insert title here</title>
</head>
<body>
	<p>带参数的请求方式</p>
	<a href="rm/paramers?name=LevelCoder">name参数</a>
	<a href="rm/paramers?age=LevelCoder">!name参数</a>
	<a href="rm/paramers?name=LevelCoder">name!=1参数</a>
	<a href="rm/paramers?name=1&age=9&sex=man">"name=1","age!=10","sex"}参数</a>		
</body>
</html>

 

测试结果页面

<%@ 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>Spring MVC : RequestMapping Paramers</title>
</head>
<body>
	恭喜LevelCoder:RequestMapping 带参数请求模式 程序跑通了,继续学习吧
</body>
</html>

 

测试结果

通过上面案例 当请求时通过@RequestMapping value=rm/paramers 找到执行方法,再次根据params进行过滤确认到执行方法

 

header():过滤请求头

 

 

@RequestMapping注解我们就介绍到这里

demo地址: http://git.oschina.net/LevelCoder/demos

© 著作权归作者所有

共有 人打赏支持
LevelCoder
粉丝 7
博文 58
码字总数 33444
作品 0
房山
高级程序员
Spring MVC 解读——@RequestMapping (1)

Spring MVC 解读——@RequestMapping 为了降低文章篇幅,使得文章更目标化,简洁化,我们就不例举各种@RequestMapping的用法等内容了. 文章主要说明以下问题: Spring怎样处理@RequestMappi...

麦壳原野
2014/03/25
0
13
Spring MVC 解读——@RequestMapping (2)

Spring MVC 解读——@RequestMapping 上一篇文章中我们了解了Spring如何处理@RequestMapping注解,并将请求映射信息保存到系统中以处理客户端发送来的请求,但是Spring是怎样接受请求,并根据...

麦壳原野
2014/03/30
0
6
Spring MVC 解读——

Spring MVC 解读——mvc:annotation-driven/ 一、AnnotationDrivenBeanDefinitionParser 通常如果我们希望通过注解的方式来进行Spring MVC开发,我们都会在***-servlet.xml中加入mvc:annotat...

麦壳原野
2014/03/05
0
8
【2】springmvc 入门

springmvc都是通过其中央控制器DispatcherServlet来进行转发的,所以在web.xml文件里面需要增加相应的配置 <servlet><servlet-name>springServlet</servlet-name><servlet-class>org.spring......

dkz
2014/04/05
0
0
使用maven创建一个spring-boot项目-集成springmvc

以下是自己学习spring-boot的过程中整理的笔记。 一、spring-boot介绍 1、Spring-boot跟springframe的关系 spring framework就好比一个大型的电子元件生产公司,它生产的元件性能都很优秀,...

Prepared
06/27
0
0
Spring MVC Controller介绍

SpringMVC 框架中,DispatcherServlet负责分发请求到控制器Controller 处理。Controller把用户的请求数据经过业务层处理后封装成一个ModelAndView对象,然后再把该对象返回给对应的View进行展...

博为峰教研组
2016/11/28
13
0
Spring3 MVC 注解(一)---注解基本配置及@controller和 @Reques...

1)问题:spring项目中有多个配置文件mvc.xml dao.xml 2)解决:在web.xml中 <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/xxx/*.xml</param-value> ......

李长春
2011/10/14
0
0
Spring Boot 之 HelloWorld 与 多文件上传详解

0、用到的框架和组件如下: Spring Boot 1.4.3.RELEASE Spring 4.3.5.RELEASE Thymeleaf jQuery (webjars) Maven Embedded Tomcat 8.5.6 Google Chrome Browser (Network Inspect) 附:Sprin......

大数据之路
2012/11/23
0
0
springcloud(三):服务提供与调用

文章概述 上一篇文章我们介绍了eureka服务注册中心的搭建,这篇文章介绍一下如何使用eureka服务注册中心,搭建一个简单的服务端注册服务,客户端去调用服务使用的案例。 案例中有三个角色: ...

AHUSKY
06/12
0
0
Spring4.1.6 常用注解

常用的spring注解有如下几种: @Controller @Service @Autowired @RequestMapping @RequestParam @ModelAttribute @Cacheable @CacheFlush @Resource @PostConstruct @PreDestroy @Repositor......

大糊涂
2015/06/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSChina 周一乱弹 —— 如果是你喜欢的女同学找你借钱

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @guanglun :分享Michael Learns To Rock的单曲《Fairy Tale》 《Fairy Tale》- Michael Learns To Rock 手机党少年们想听歌,请使劲儿戳(这...

小小编辑
27分钟前
7
3
NNS域名系统之域名竞拍

0x00 前言 其实在官方文档中已经对域名竞拍的过程有详细的描述,感兴趣的可以移步http://doc.neons.name/zh_CN/latest/nns_protocol.html#id30 此处查阅。 我这里主要对轻钱包开发中会用到的...

暖冰
今天
0
0
32.filter表案例 nat表应用 (iptables)

10.15 iptables filter表案例 10.16/10.17/10.18 iptables nat表应用 10.15 iptables filter表案例: ~1. 写一个具体的iptables小案例,需求是把80端口、22端口、21 端口放行。但是,22端口我...

王鑫linux
今天
0
0
shell中的函数&shell中的数组&告警系统需求分析

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析

影夜Linux
今天
0
0
Linux网络基础、Linux防火墙

Linux网络基础 ip addr 命令 :查看网口信息 ifconfig命令:查看网口信息,要比ip addr更明了一些 centos 7默认没安装ifconfig命令,可以使用yum install -y net-tools命令来安装。 ifconfig...

李超小牛子
今天
1
0
[机器学习]回归--Decision Tree Regression

CART决策树又称分类回归树,当数据集的因变量为连续性数值时,该树算法就是一个回归树,可以用叶节点观察的均值作为预测值;当数据集的因变量为离散型数值时,该树算法就是一个分类树,可以很...

wangxuwei
昨天
1
0
Redis做分布式无锁CAS的问题

因为Redis本身是单线程的,具备原子性,所以可以用来做分布式无锁的操作,但会有一点小问题。 public interface OrderService { public String getOrderNo();} public class OrderRe...

算法之名
昨天
11
0
143. Reorder List - LeetCode

Question 143. Reorder List Solution 题目大意:给一个链表,将这个列表分成前后两部分,后半部分反转,再将这两分链表的节点交替连接成一个新的链表 思路 :先将链表分成前后两部分,将后部...

yysue
昨天
1
0
数据结构与算法1

第一个代码,描述一个被称为BankAccount的类,该类模拟了银行中的账户操作。程序建立了一个开户金额,显示金额,存款,取款并显示余额。 主要的知识点联系为类的含义,构造函数,公有和私有。...

沉迷于编程的小菜菜
昨天
1
0
从为什么别的队伍总比你的快说起

在机场候检排队的时候,大多数情况下,别的队伍都要比自己所在的队伍快,并常常懊悔当初怎么没去那个队。 其实,最快的队伍只能有一个,而排队之前并不知道那个队快。所以,如果有六个队伍你...

我是菜鸟我骄傲
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部