Spring MVC系列(二)之@RequestMapping和URL映射
2016-03-31 09:40
866 查看
@RequestMapping是一个用来处理请求地址映射的注解,可以注解与类上,也可以注解与类中的方法上,注解与类上,表示该Controller的统一标识,通常表示一个模块的表示,注解在方法,则表示某请求又那个方法进行处理
@RequestMapping有几个属性
一:value属性
value表示URI的路径标识,例如
对应的路径就是IP:端口号/项目名/mapping/test,对应我们上节中的例子就是localhost:8080/mapping/test,这样的url就会映射到我们test的方法的处理
1)注意,这样的映射路径要唯一,例如如下
意思是/mapping/test已经被方法test映射到处理,但你的test1的URI依旧是/mapping/test,所以报错,其实很好理解,如果两个方法对应同一个URL那么真实请求过来后,到底是由谁去处理?
2)关于value的值可以有如下几种类型
①某一普通的具体值,例如/test
②某一统一变量,通常用{}符号标识,例如/{id}
③正则表达式,通常用{}符号标识,例如{method:\\w+}
④以上几种类型的集合
①的例子就不举例了,我们举个②的例子
localhost:8080/spring-mvc/mapping/1
localhost:8080/spring-mvc/mapping/2
localhost:8080/spring-mvc/mapping/234
localhost:8080/spring-mvc/mapping/12dsfsa2
都能准确的被test1方法映射到,并处理
③正则表达的例子
http://localhost:8080/spring-mvc/mapping/1 http://localhost:8080/spring-mvc/mapping/2 http://localhost:8080/spring-mvc/mapping/3 http://localhost:8080/spring-mvc/mapping/4
都能正确跳转到
但是如果你的URL是
http://localhost:8080/spring-mvc/mapping/d http://localhost:8080/spring-mvc/mapping/44
正则表达“\d”是匹配一个数字字符。等价于[0-9]。“d”,“44”则会无法匹配正则,所以该方法不进行该url的处理
④综合的例子
http://localhost:8080/spring-mvc/mapping/4/user/abc/detail
这样依旧可以映射到
二:method属性
method的值是用来处理用户请求的属性的,是Get请求,还是post请求,还是PUT请求,等等,spring MVC都可以进行精细的管理,由于Mehtod的值是固定的,所以spring mvc用枚举进行管理
我们举个例子证明一下:
我们修改代码,将请求改成post
提示不支持GET请求
三:headers
headers指定request中必须包含某些指定的header值,才能让该方法处理请求,我们平时一般用不到该属性,我们还是做一个例子吧
我们用普通的浏览器访问
说明spring不进行处理,我们选用一个第三方工具测试一下RESTClient
当我们加入请求headers时,发现能正常返回提示200,且能返回Body
四:consumer 表示指定处理请求的提交内容类型(Content-Type),例如application/json, text/html等等
我们还是举例说明吧
报错了,415错误,415错误是指 对于当前请求的方法和所请求的资源,请求中提交的实体并不是服务器中所支持的格式,因此请求被拒绝
好了,我们用工具去访问
请求成功
五:produces指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回
举例说明:
好了,到此为止,关于@RequestMapping一些常用的URL映射关系已经讲解结束了~END~
@RequestMapping有几个属性
一:value属性
value表示URI的路径标识,例如
对应的路径就是IP:端口号/项目名/mapping/test,对应我们上节中的例子就是localhost:8080/mapping/test,这样的url就会映射到我们test的方法的处理
1)注意,这样的映射路径要唯一,例如如下
package org.study.lyncc.web.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller @RequestMapping(value="/mapping") public class RequestMappingController { @RequestMapping(value="/test") public ModelAndView test(){ return new ModelAndView("test"); } @RequestMapping(value="/test") public ModelAndView test1(){ return new ModelAndView("test1"); } }如果是这样的代码,方法test和test1的映射路径的URI都是/mapping/test,spring mvc启动的时候就会报错
意思是/mapping/test已经被方法test映射到处理,但你的test1的URI依旧是/mapping/test,所以报错,其实很好理解,如果两个方法对应同一个URL那么真实请求过来后,到底是由谁去处理?
2)关于value的值可以有如下几种类型
①某一普通的具体值,例如/test
②某一统一变量,通常用{}符号标识,例如/{id}
③正则表达式,通常用{}符号标识,例如{method:\\w+}
④以上几种类型的集合
①的例子就不举例了,我们举个②的例子
package org.study.lyncc.web.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller @RequestMapping(value="/mapping") public class RequestMappingController { @RequestMapping(value="/{id}") public ModelAndView test1(){ ModelAndView mav = new ModelAndView("test"); return mav; } }当我们的URL如下都可以映射到
localhost:8080/spring-mvc/mapping/1
localhost:8080/spring-mvc/mapping/2
localhost:8080/spring-mvc/mapping/234
localhost:8080/spring-mvc/mapping/12dsfsa2
都能准确的被test1方法映射到,并处理
③正则表达的例子
package org.study.lyncc.web.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller @RequestMapping(value="/mapping") public class RequestMappingController { @RequestMapping(value="/{:\\d}") public ModelAndView reg(){ ModelAndView mav = new ModelAndView("test"); return mav; } }与之对应我们在WEB-INF/jsp文件夹下新建test.jsp
<%@ 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>hello</title> </head> <body> test requestMapping </body> </html>当我们在浏览器中输入如下URL:
http://localhost:8080/spring-mvc/mapping/1 http://localhost:8080/spring-mvc/mapping/2 http://localhost:8080/spring-mvc/mapping/3 http://localhost:8080/spring-mvc/mapping/4
都能正确跳转到
但是如果你的URL是
http://localhost:8080/spring-mvc/mapping/d http://localhost:8080/spring-mvc/mapping/44
正则表达“\d”是匹配一个数字字符。等价于[0-9]。“d”,“44”则会无法匹配正则,所以该方法不进行该url的处理
④综合的例子
package org.study.lyncc.web.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller @RequestMapping(value="/mapping") public class RequestMappingController { @RequestMapping(value="/{:\\d}/user/{id}/detail") public ModelAndView comprehensiveDemo(){ ModelAndView mav = new ModelAndView("test"); return mav; } }那么URL可以输入:
http://localhost:8080/spring-mvc/mapping/4/user/abc/detail
这样依旧可以映射到
二:method属性
method的值是用来处理用户请求的属性的,是Get请求,还是post请求,还是PUT请求,等等,spring MVC都可以进行精细的管理,由于Mehtod的值是固定的,所以spring mvc用枚举进行管理
package org.springframework.web.bind.annotation; public enum RequestMethod { GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE }
我们举个例子证明一下:
package org.study.lyncc.web.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; @Controller @RequestMapping(value="/mapping") public class RequestMappingController { @RequestMapping(value = "/detail",method = RequestMethod.GET) public ModelAndView methodTestDemo(){ ModelAndView mav = new ModelAndView("test"); return mav; } }浏览器url是http://localhost:8080/spring-mvc/mapping/detail,因为浏览器默认是GET请求
我们修改代码,将请求改成post
package org.study.lyncc.web.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; @Controller @RequestMapping(value="/mapping") public class RequestMappingController { @RequestMapping(value = "/detail",method = RequestMethod.POST) public ModelAndView methodTestDemo(){ ModelAndView mav = new ModelAndView("test"); return mav; } },我们再次同一url请求
提示不支持GET请求
三:headers
headers指定request中必须包含某些指定的header值,才能让该方法处理请求,我们平时一般用不到该属性,我们还是做一个例子吧
package org.study.lyncc.web.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller @RequestMapping(value="/mapping") public class RequestMappingController { @RequestMapping(value = "/detail",headers="location=www.tuniu.com") public ModelAndView HeadersDemo(){ ModelAndView mav = new ModelAndView("test"); return mav; } }这边我们指定请求中headers需要有key/Value的键值对,key是location,value是www.tuniu.com
我们用普通的浏览器访问
说明spring不进行处理,我们选用一个第三方工具测试一下RESTClient
当我们加入请求headers时,发现能正常返回提示200,且能返回Body
四:consumer 表示指定处理请求的提交内容类型(Content-Type),例如application/json, text/html等等
我们还是举例说明吧
package org.study.lyncc.web.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller @RequestMapping(value="/mapping") public class RequestMappingController { @RequestMapping(value = "/detail",consumes="application/json") public ModelAndView HeadersDemo(){ ModelAndView mav = new ModelAndView("test"); return mav; } }表示我们请求体Content-Type:"application\json;charset=utf-8"才会响应,如果我们浏览器直接访问
报错了,415错误,415错误是指 对于当前请求的方法和所请求的资源,请求中提交的实体并不是服务器中所支持的格式,因此请求被拒绝
好了,我们用工具去访问
请求成功
五:produces指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回
举例说明:
package org.study.lyncc.web.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller @RequestMapping(value="/mapping") public class RequestMappingController { @RequestMapping(value = "/detail",produces="application/json") public Object HeadersDemo(){ ...... } }这样一般返回application\json的格式数据,这个以后会再做分析
好了,到此为止,关于@RequestMapping一些常用的URL映射关系已经讲解结束了~END~
相关文章推荐
- @RequestMapping 细节影响访问路径是否可以访问
- Spring mvc中@RequestMapping 用法小结
- SpringMVC注解...@controller和@RequestMapping
- 针对spring中@ResponseBody返回中文乱码的解决
- Spring @RequestMapping的用法
- @RequestMapping 用法详解之地址映射
- Spring4.0MVC学习资料,Controller中的方法详解和使用(四)
- SpringMVC 基于注解的Controller @RequestMapping @RequestParam..
- [@Controller]2 详解@RequestMapping
- @RequestMapping 用法详解之地址映射
- Spring的@RequestMapping 用法详解之地址映射
- Spring注解@Controller @RequestMapping详解
- @RequestMapping地址映射
- SpringMVC 流程(6)-- 常用注解
- SpringMVC 注解配置
- Spring中Controller和RequestMapping的详解
- Spring3.0 入门进阶(4):注解式控制器简介
- 关于RequestMapping
- SpringMVC3,使用RequestMappint的Param参数,实现一个url绑定多个方法
- RequestMapping中produces属性作用