SpringMVC(三):@RequestMapping 注解

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>

 

测试结果

173058_9XSb_2296021.png

173117_hi55_2296021.png

通过上面案例 当请求时通过@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>

 

测试结果

195409_kLPO_2296021.png

195420_6hEd_2296021.png

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

 

header():过滤请求头

 

 

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

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

转载于:https://my.oschina.net/LevelCoder/blog/912726

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值