文档章节

Spring MVC学习路(五)RequestMapping

minidai
 minidai
发布于 2015/11/30 22:57
字数 1793
阅读 302
收藏 2
@Controller  
@RequestMapping("/user")                 //1处理器的通用映射前缀  
public class HelloWorldController2 {  
    @RequestMapping("/hello2")        //2相对于1处的映射进行窄化  
    public ModelAndView helloWorld() {  
         System.out.print("hello!");
         ..以下省略
    }  
}

此时访问localhost:8888/demo/hello2 在控制台内是无法打印出“hello!”的

值能访问localhost:8888/demo/user/hello2 才能访问次方法,堪称方法级别的RequestMapping

同时也叫窄化请求映射

多个URL路径可以映射到同一个处理器的功能处理方法

@Controller  
public class HelloWorldController2 {  
    @RequestMapping("/hello2","/testhello")        //多URL映射同一处理方法
    public ModelAndView helloWorld() {  
         System.out.print("hello!");
         ..以下省略
    }  
}

URI模板模式映射

@Controller  
public class HelloWorldController2 {  
    @RequestMapping("/hello2/{fid}")   //fid是占位符        
    public ModelAndView helloWorld() {  
         System.out.print("hello!");
         ..以下省略
    }  
}

通过这种占位符的方式可以通过/hello2/123444或者/hello/abc的映射访问该处理器,通过@PathVariable可以提取URI模板模式中的{×××}中的×××变量。当然修改/hello2/{fid}为/hello2/{fid}/test同理

Ant风格的URL路径映射


@RequestMapping("/users/**"):可以匹配“/users/abc/abc”,但“/users/123”将会被【URI模板模式映射中的“/users/{userId}”模式优先映射到

 @RequestMapping("/product?"):可匹配“/product1”或“/producta”,但不匹配“/product”或“/productaa”;

@RequestMapping("/product*"):可匹配“/productabc”或“/product”,但不匹配“/productabc/abc”;

@RequestMapping("/product/*"):可匹配“/product/abc”,但不匹配“/productabc”;

@RequestMapping("/products/**/{productId}"):可匹配“/products/abc/abc/123”或“/products/123”

也就是Ant风格和URI模板变量风格可混用;


通过@PathVariable取值

使用@PathVariable取值时,必须使用基本类型定义变量

@Controller
public class Test {
	@RequestMapping("test/{fid}")
	public void test1(@PathVariable("fid") String fid,
			@RequestParam("a")String a,HttpServletResponse res) throws IOException{
		System.out.println(fid);
		System.out.println(a);
		res.getWriter().print(a);
	}
}

此时访问http://localhost:8888/SpringMVCTest/test/12334?a=333

在控制台会打印出12334和333两个参数

但如果访问http://localhost:8888/SpringMVCTest/test?a=333

则会报404错误

正则表达式风格的URL路径映射

@RequestMapping(value="/products/{categoryCode:\\d+}-{pageNumber:\\d+}"):可以匹配“/products/123-1”,但不能匹配“/products/abc-1”,这样可以设计更加严格的规则。

规定请求的方法指定映射

@Controller
public class Test {
	@RequestMapping(value="test/{fid}",method = RequestMethod.POST)
	public void test1(@PathVariable("fid") String fid,
			@RequestParam("a")String a,HttpServletResponse res) throws IOException{
		System.out.println(fid);
		System.out.println(a);
		res.getWriter().print(a);
	}
}

如果此时直接通过浏览器访问http://localhost:8888/SpringMVCTest/test/12334?a=333则会报

HTTP Status 405 - Request method 'GET' not supported

错误,必须使用POST请求才能指定到该映射,而将

method = RequestMethod.POST

改为

method = RequestMethod.GET

即可直接通过网页访问

注意:此时因为@requestMapping内存在多个参数,

@RequestMapping(value="test/{fid}",method = RequestMethod.POST)

所以不可再简写为

@RequestMapping("test/{fid}")

除了GET、POST,还有HEAD、OPTIONS、PUT、DELETE、TRACE。

DispatcherServlet默认开启对 GET、POST、PUT、DELETE、HEAD的支持

如果需要支持OPTIONS、TRACE,请添加DispatcherServlet在web.xml的初始化参数:dispatchOptionsRequest 和 dispatchTraceRequest 为true。

@RequestMappings属性之params

@Controller
public class Test {
	@RequestMapping(value="test/{fid}",method = RequestMethod.GET,params="dai")
	public void test1(@PathVariable("fid") String fid,
			@RequestParam("a")String a,HttpServletResponse res) throws IOException{
		System.out.println(fid);
		System.out.println(a);
		res.getWriter().print(a);
	}
}

此时通过访问:http://localhost:8888/SpringMVCTest/test/12334?a=333  会出现404错误

需要通过访问:http://localhost:8888/SpringMVCTest/test/12334?dai&a=333正常

如果将

params="dai"

改为

params="!dai"  访问时参数名不带dai即可访问


访问时参数名dai的值为123时可访问
params="dai=123"
访问时参数名dai的值不为123时可访问
params="dai!=123"


方法内@解释 

以下信息来源:http://jinnianshilongnian.iteye.com/blog/1705701

1、@RequestParam绑定单个请求参数值;

参数:

value:参数名字,即入参的请求参数名字,如username表示请求的参数区中的名字为username的参数的值将传入;

required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报404错误码;

defaultValue:默认值,表示如果请求中没有同名参数时的默认值,默认值可以是SpEL表达式,如“#

如果请求中有多个同名的应该如何接收呢?如给用户授权时,可能授予多个权限,首先看下如下代码:

public String test(@RequestParam(value="role") String roleList)

如果请求参数类似于url?role=admin&role=user,则实际roleList参数入参的数据为“admin,user”,即多个数据之间使用“,”分割;我们应该使用如下方式来接收多个请求参数:

public String test(@RequestParam(value="role") String[] roleList)

或者

public String test(@RequestParam(value="list") List<String> list)

2、@PathVariable绑定URI模板变量值

@PathVariable用于将请求URL中的模板变量映射到功能处理方法的参数上。

@RequestMapping(value="/users/{userId}/topics/{topicId}")  
public String test(  
       @PathVariable(value="userId") int userId,   
       @PathVariable(value="topicId") int topicId)

如请求的URL为“控制器URL/users/123/topics/456”,则自动将URL中模板变量{userId}和{topicId}绑定到通过@PathVariable注解的同名参数上,即入参后userId=123、topicId=456。代码在PathVariableTypeController中。

3、@CookieValue绑定Cookie数据值

@CookieValue用于将请求的Cookie数据映射到功能处理方法的参数上。

public String test(@CookieValue(value="JSESSIONID", defaultValue="") String sessionId)

如上配置将自动将JSESSIONID值入参到sessionId参数上,defaultValue表示Cookie中没有JSESSIONID时默认为空。

传入参数类型也可以是javax.servlet.http.Cookie类型。

 

测试代码在CookieValueTypeController中。@CookieValue也拥有和@RequestParam相同的三个参数,含义一样。

4、@RequestHeader绑定请求头数据

@RequestHeader用于将请求的头信息区数据映射到功能处理方法的参数上。

@RequestMapping(value="/header")  
public String test(  
       @RequestHeader("User-Agent") String userAgent,  
       @RequestHeader(value="Accept") String[] accepts)

如上配置将自动将请求头“User-Agent”值入参到userAgent参数上,并将“Accept”请求头值入参到accepts参数上。测试代码在HeaderValueTypeController中。

 

@RequestHeader也拥有和@RequestParam相同的三个参数,含义一样。

5、@ModelAttribute绑定参数到命令对象

@ModelAttribute一个具有如下三个作用:

①绑定请求参数到命令对象:放在功能处理方法的入参上时,用于将多个请求参数绑定到一个命令对象,从而简化绑定流程,而且自动暴露为模型数据用于视图页面展示时使用;

②暴露表单引用对象为模型数据:放在处理器的一般方法(非功能处理方法)上时,是为表单准备要展示的表单引用对象,如注册时需要选择的所在城市等,而且在执行功能处理方法(@RequestMapping注解的方法)之前,自动添加到模型对象中,用于视图页面展示时使用;

③暴露@RequestMapping方法返回值为模型数据:放在功能处理方法的返回值上时,是暴露功能处理方法的返回值为模型数据,用于视图页面展示时使用。


6、@SessionAttributes绑定命令对象到session

有时候我们需要在多次请求之间保持数据,一般情况需要我们明确的调用HttpSession的API来存取会话数据,如多步骤提交的表单。Spring Web MVC提供了@SessionAttributes进行请求间透明的存取会话数据。

7、@RequestBody绑定请求的内容区数据并能进行自动类型转换等。

8、@RequestPart绑定“multipart/data”数据,除了能绑定@RequestParam能做到的请求参数外,还能绑定上传的文件等。


© 著作权归作者所有

共有 人打赏支持
minidai
粉丝 13
博文 16
码字总数 9503
作品 0
重庆
后端工程师
私信 提问
SpringMVC学习路 总贴 目录

因为会status2 所以学习理解起来还是比较快点,基础一般的童鞋最好还是看一些讲的很明白的博客 目录 Spring MVC学习路(一) 下载配置文件 Spring MVC学习路(二) 设置配置文件 Spring MVC...

minidai
2015/12/01
262
0
如何伪装成一个服务端开发(七)

目录 如何伪装成一个服务端开发(一) 如何伪装成一个服务端开发(二) 如何伪装成一个服务端开发(三) 如何伪装成一个服务端开发(四) 如何伪装成一个服务端开发(五) 如何伪装成一个服务端开发(六...

街角的小丑
01/04
0
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 mvc中@Requestmapping参数配置

原文标题[ Spring mvc中@Requestmapping再探] 1) 普通path路径 @RequestMapping(value = "/foos") @ResponseBody public String getFoosBySimplePath() { return "Get some Foos"; } 然后尝试......

guhai2004
2013/10/20
0
0
Spring3.0.4 学习与问题总结系列 - 2 MVC

记得在3年前使用的是 Struct2 与Spring结合的框架开发。当时是用Structs2来进行MVC管理,使用Spring对BO与DAO的Bean管理。还是一个新人的我,懵懂的做了3年。 因为很长时间已经没有接触过这样...

李长春
2011/09/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Hibernate SQLite方言

以下代码有参考过github上国外某位大佬的,在发文的最新稳定版Hibernate上是可用的,有时间再仔细分析一下 import org.hibernate.dialect.Dialect;import org.hibernate.dialect.function.S...

CHONGCHEN
今天
3
0
CentOS 7 MariaDB搭建主从服务器

本文编写环境为CentOS7。确保关闭SELinux,关闭防火墙或者防打开指定端口。具体信息如下 #master[root@promote ~]# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) [r...

白豆腐徐长卿
今天
10
0
介绍python中运算符优先级

下面这个表给出Python的运算符优先级,从最低的优先级(最松散地结合)到最高的优先级(最紧密地结合)。这意味着在一个表达式中,Python会首先计算表中较下面的运算符,然后在计算列在表上部...

问题终结者
今天
3
0
Spring Boot 2.x基础教程:快速入门

简介 在您第1次接触和学习Spring框架的时候,是否因为其繁杂的配置而退却了?在你第n次使用Spring框架的时候,是否觉得一堆反复黏贴的配置有一些厌烦?那么您就不妨来试试使用Spring Boot来让...

程序猿DD
昨天
10
0
SpringSecurity认证流程源码级详解

SpringSecurity认证流程源码级详解 认证流程说明 认证结果如何在多个请求之间共享 获取认证用户信息

chendom
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部