Spring MVC温故而知新 – 请求映射RequestMapping
RequestMapping注解说明
@RequestMapping注解的作用将Web请求映射到特定处理程序类和/或处理程序方法,这个注解可以用于类或者方法上,并通过属性value指定请求路径。用在Controller类上表示提供初步的URL请求映射信息,相对于Web应用的根目录,这是一个前置请求路径。用在Controller中方法上,表示提供详细的URL映射。如果Controller类上没有加RequestMapping注解,则方法上注解标记的URL则是相对于Web应用的根目录。
@RequestMapping注解提供以下几个属性:
name:用于指定映射器名称
value:用于指定映射路径,同path
path:用于指定映射路径,同value
method:用于指定请求类型:GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE
params:指定请求的参数
headers:指定请求头部,源码示例:RequestMapping(value = "/something", headers = "content-type=text/*")
consumes:指定处理请求提交的内容类型(Content-Type),例如application/json, text/html,只有在Content-Type匹配这些媒体类型之一时才会映射请求
produces:指定请求返回的内容类型 例如:produces = "application/json; charset=UTF-8"
通过value属性指定映射路径
Controller类上使用RequestMapping注解
- @Controller
- @RequestMapping("order")
- public class OrderInfoController {
- //示例1
- @RequestMapping("orderinfo")
- public ModelAndView OrderInfo1() {
- return new ModelAndView("order/info", "message", "OrderInfo");
- }
- }
在OrderController类上添加了注解RequestMapping("order"),表示所有对的请求必须是以“根目录/order” 开始
示例1的请求路径为:http://localhost:8080/springMvcNext/order/orderinfo
示例1 如果注释掉Controller上的@RequestMapping("order"),则对应的请求路径为:http://localhost:8080/springMvcNext /orderinfo
Controller方法上使用RequestMapping注解
1.常用基础用法
- @Controller
- @RequestMapping("order")
- public class OrderInfoController {
- //示例1
- @RequestMapping("orderinfo")
- public ModelAndView OrderInfo1() {
- return new ModelAndView("order/info", "message", "OrderInfo");
- }
- //示例2 :处理多个url映射
- @RequestMapping({"info","index"}) //或者@RequestMapping(value={"info","index"})
- public ModelAndView OrderInfo2() {
- return new ModelAndView("order/info","message", "OrderInfo2");
- }
- //示例3
- @RequestMapping
- public ModelAndView OrderInfo3() {
- return new ModelAndView("order/info","message", "OrderInfo3");
- }
- }
RequestMapping只配置value属性,不显示配置其他属性的情况下,value省略,直接填写URL映射信息即可,指定其他属性的情况下value属性必须明确填写
上例示例1的访问路径为: http://localhost:8080/springMvcNext/order/orderinfo
示例2:RequestMapping接口中value属性是一个数组,所有也支持传一个数组 示例2的访问路径:http://localhost:8080/springMvcNext/order/index 或者 http://localhost:8080/springMvcNext/order/info
示例3:当value为空时,表示该方法为类下默认的Action,示例3的访问路径为:http://localhost:8080/springMvcNext/order
2.URL模板映射
在RequestMapping注解中声明URI变量,并通过@PathVariable
注解的方式
访从实际请求URL中获取值,示例如下:
- @Controller
- public class OrderInfoController {
- // 示例10 带占位符的URL
- @RequestMapping(value = "user/{userId}/order/{orderNumber}", method = RequestMethod.GET)
- public ModelAndView OrderInfo4(@PathVariable int userId,@PathVariable String orderNumber) {
- return new ModelAndView("order/info", "message", "userid:"+userId+" orderNumber:"+orderNumber);
- }
- }
示例10请求URL: http://localhost:8080/springMvcNext/user/12/order/333 当通过此URL发起请求时,SpringMVC将通过@PathVariable可以提取URL模板中的{×××}中的×××变量, URL变量会自动转换为对应的类型,无法转换的则返回错误,比如尝试用以下url访问:http://localhost:8080/springMvcNext/user/xxx/order/333 其中参数Userid=xxx,则发生错误:
3.Ant风格的URL路径映射
Ant风格通配符如下:
?
匹配一个字符*
匹配路径段中的零个或多个字符**
匹配零个或多个路径段
示例:
- @Controller
- public class OrderInfoController {
- // 示例11 带占位符的URL
- @RequestMapping(value = "order*", method = RequestMethod.GET)
- //@RequestMapping(value = "order?", method = RequestMethod.GET)
- //@RequestMapping(value = "order/**", method = RequestMethod.GET)
- public ModelAndView OrderInfo5(String orderNumber) {
- return new ModelAndView("order/info", "message", "OrderInfo5");
- }
}
示例11请求URL: http://localhost:8080/springMvcNext/order/orderdexx?orderNumber=12 可以匹配http://localhost:8080/springMvcNext/order/orderXXXXX?orderNumber=yyyy的所有请求
@RequestMapping(value = "order?", method = RequestMethod.GET)可以匹配诸如 “…/ordera?orderNumber….” “…/orders?orderNumber….”
@RequestMapping(value = "order/**", method = RequestMethod.GET)可以匹配诸如 “…/order/aaa?orderNumber….” “…/order/bbb/ccc?orderNumber….”
另外 RequestMapping还支持正则表达式风格的URL路径映射,此处略过
通过method属性指定请求类型
RequestMapping提供的method属性请求谓词的类型,如下示例示例只接受GET请求
- // 示例4
- @RequestMapping(value="detail",method=RequestMethod.GET) //也可直接使用 @GetMapping("detail")
- public ModelAndView Info() {
- return new ModelAndView("order/info", "message", "Info");
- }
对于每种请求类型,SpringMVC还提供了专用的注解:
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
通过params指定参数名或参数值约束
params属性可以限定请求参数包含特定的参数,也可限定参数值的约束,如下代码所示:
- // 示例5 params 限定参数包含orderNumber
- @RequestMapping(value = "detail2", params = "orderNumber")
- public ModelAndView Detail2(String orderNumber) {
- return new ModelAndView("order/info", "message", orderNumber);
- }
- // 示例6 params 限定参数值
- @RequestMapping(value = "detail3", params = "orderNumber!=1222")
- public ModelAndView Detail3(String orderNumber) {
- return new ModelAndView("order/info", "message", orderNumber);
- }
示例5限定请求参数必须包含参数orderNumber,如果不包含名为orderNumber的参数,则拒绝访问:访问路径:http://localhost:8080/springMvcNext/order/detail2?orderNumber=12
示例6限定请求参数必须包含参数orderNumber并且参数值不能为1222 访问路径:http://localhost:8080/springMvcNext/order/detail3?orderNumber=1222 时报错
通过headers指定参数名或参数值约束
RequestMapping提供的method属性可以指定请求头类型,只有请求数据头部类型符合指定的值时,才能正常访问
- // 示例7 params 限定参数值
- @RequestMapping(value = "headtest",headers = "apikey=23131313")
- //@RequestMapping(value = "headtest",headers= {"Accept=application/json"})
- public ModelAndView Header() {
- return new ModelAndView("order/info", "message", "Header");
- }
示例7限定请求头必须包含apikey:23131313才可以正常返回,直接访问,返回错误:
添加添加header信息apikey:23131313访问成功:
通过consumes指定请求提交的内容类型(Content-Type)
- // 示例8 consumes
- @RequestMapping(value = "consumes", method = RequestMethod.POST, consumes = "application/json")
- public ModelAndView Consumes(String orderNumber) {
- return new ModelAndView("order/info", "message", orderNumber);
- }
示例限定请求参数类型为application/json,表示该方法只处理请求Content-Type为application/json的请求:
下面通过抛postman测试:
设置请求参数格式为application/json,可以正常访问:
设置参数格式为x-form-urlencoded,返回错误,Http Status 415
通过produces指定返回的内容类型(Content-Type)
produces属性用于设定返回内容类型,并且满足以下条件:接受请求header中包含Accept的值与produces设定的值相同,或者接受的请求使用不显示设置accept值
- // 示例8 produces 限定返回数据application/json
- @RequestMapping(value = "produces", method = RequestMethod.GET, produces = "application/json")
- public ModelAndView Produces(String orderNumber) {
- return new ModelAndView("order/info", "message", orderNumber);
- }
示例8 表示返回内容格式application/json ,当客户端设置的accept格式为text/json时,运行报错,Http status 406
当客户端设置的accept格式为application/json或者不设置accept值时,可以正常运行
Spring MVC温故而知新 – 请求映射RequestMapping的更多相关文章
- 0054 Spring MVC的@Controller和@RequestMapping注解
@Controller注解 该注解用来指示一个类是一个控制器,在Spring的配置xml文件中开启注解扫描 <context:conponent-scan base-package=" ...
- spring MVC处理请求过程及配置详解
本文主要梳理下Spring MVC处理http请求的过程,以及配置servlet及业务application需要的常用标签,及其包含的意义. spring MVC处理请求过程 首先看一个整体图 简单说 ...
- spring MVC处理请求过程
spring MVC处理请求过程 首先看一个整体图 简单说下各步骤: handlerMapping handlerMapping将请求映射到处理器,即图中的HandlerExecutionChain. ...
- spring mvc get请求也可以接受DTO对象
spring mvc get请求也可以接受DTO对象,比如:url上面你还是将参数&符号连接起来,并自动封装进一个DTO对象里. 只有@RequestBody注解spring mvc才会从ht ...
- Spring MVC 基础注解之@RequestMapping、@Controller、(二)
我现在学的是spring4.2 今天主要学习了Spring MVC注解 引入注解可以减少我们的代码量,优化我们的代码. @Controller:用于标识是处理器类: @RequestMapping:请 ...
- Spring MVC温故而知新-从零开始
Spring MVC简介 Spring MVC是一款基于MVC架构模式的轻量级Web框架,目的是将Web开发模块化,对整体架构进行解耦. Spring MVC有一下优点: 作为Spring框架的一部分 ...
- Spring MVC 之请求参数和路径变量
请求参数和路径变量都可以用于发送值给服务器.二者都是URL的一部分.请求参数采用key=value形式,并用“&”分隔. 例如,下面的URL带有一个名为productId的请求参数,其值为3: ...
- Spring MVC http请求地址映射(三)
Spring MVC框架通过扫描将带有@Controller的类中的@RequestMapping的方法进行映射,然后调用映射的方法处理请求,这个分发过程默认是由DispaterServlet处理的. ...
- Spring MVC温故而知新 – 参数绑定、转发与重定向、异常处理、拦截器
请求参数绑定 当用户发送请求时,根据Spring MVC的请求处理流程,前端控制器会请求处理器映射器返回一个处理器,然后请求处理器适配器之心相应的处理器,此时处理器映射器会调用Spring Mvc 提 ...
随机推荐
- 使用schemaExport自动生成表结构
一.Hibernate原生状态 ? 1 2 3 4 5 Configuration cfg = new Configuration().configure(); SchemaExport expo ...
- search a 2D matrix(在二维数组中搜索一个元素)
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...
- vue项目通过webpack打包生成的dist文件放到express环境里运行(vue+webpack+express)
1.首先需要的原料肯定是vue打包生成的dist文件 在vue项目目录下运行:npm run build,等待运行结束,会在项目目录下生成一个dist文件夹,里面会生成一些文件(如下图示) 小的项目文 ...
- lua函数随记
在大多数Lua语法分析中可以获得这些标准Lua函数. 无可争辩, 我们可以查阅Lua网站, 但是一些少了的函数被Blizzard进行了调整. 下面列出了所有Lua函数. WoW API中的Lua注意在 ...
- cannot import name '_imaging' 与No module named PIL解决方法
今天学习廖雪峰的python 第三方模块pillow一章. 直接使用from PIL import Image 会报"No module named PIL",显然这是没有安装pi ...
- Kali Linux Live USB初始化+使用日记
1.Live USB制作官方guide:Making a Kali Bootable USB Drive:https://docs.kali.org/downloading/kali-linux-li ...
- Drupal7.8的安装注意的问题
首先推荐在安装之前,首先阅读一下官方的Installation guide ,说实话话,这玩意安装没有Joomla安装那么平滑,大多数问题,guide都会提到.我是先安装后看的这个guide,比较折腾 ...
- 比较Fink, macports 跟 homebrew
http://www.myexception.cn/brew/412107.html 比较Fink, macports 和 homebrew 如果你有Linux/Unix背景,那么在Mac上你一定想安 ...
- Java 8 基础教程 - Predicate
在Java 8中,Predicate是一个函数式接口,可以被应用于lambda表达式和方法引用.其抽象方法非常简单: /** * Evaluates this predicate on the giv ...
- jsp文件放在webcontent子目录下提交表单给servlet报404错误解决办法
新版的web项目已经不需要配置web.xml了,并且eclipse neon版本里面新建web项目时候,默认不会生成web.xml文件.我们也不需要手动添加该文件,因为内部为我们提供了最新的处理方式, ...