1.概述
*一个客户端请求会导致后台调用一个控制器(每个控制器的方法可以认为是一个控制器),RequestMapping就是这样的作用,
帮助请求和控制直接的配对.然而需要精确的匹配就需要更多精细的参数的匹配.我们知道,一个请求包括:请求行,请求头,和请求体(不了解的可以先了解HTTP),
我们可以根据这三部分来指定请求和控制器的匹配.RequestMapping中的配置参数起过滤的作用.
*这里的参数都有{}表示可以配置多个参数,当仅配置单个参数的时候,我们直接使用字符串也可以,可以不用{}包裹
(2)method:请求方式,也就是GET,POST等动词
(3)params:请求路径URL path路径参数(不是HTTP请求的body带的参数),也就是使用&分隔符分隔的参数键值对,例如myParam=myValue
(4)headers:标准HTTP请求头,例如content-type=text/*
(5)consumes:互联网媒体类型,一般就是我们所说的MIME类型,用来确定请求的内容类型或响应的内容类型。
根据Content-Type来匹配
(6)produces:表示将功能处理方法将生产什么样格式的响应数据,此时根据请求头中的Accept进行匹配
例如:produces = "application/json",表示将功能处理方法将生产json格式的数据,此时根据请求头中的Accept进行匹配,
如请求头“Accept:application/json”时即可匹配
3.使用
@RequestMapping可以在两个地方配置,
(1)在控制器类中,它的作用域是整个控制器的所有方法
(2)在控制器的方法,仅对使用的控制器方法有效
例如:@Controller
@RequestMapping("/mapping")
public class RequestMappingController {
@RequestMapping(value = {"path1", "path2"})
public String multiMapping(HttpServletRequest req, Model model) {
model.addAttribute("path", req.getRequestURL());
return "request/multiMapping";
}
//code
结果
结果
*一个客户端请求会导致后台调用一个控制器(每个控制器的方法可以认为是一个控制器),RequestMapping就是这样的作用,
帮助请求和控制直接的配对.然而需要精确的匹配就需要更多精细的参数的匹配.我们知道,一个请求包括:请求行,请求头,和请求体(不了解的可以先了解HTTP),
我们可以根据这三部分来指定请求和控制器的匹配.RequestMapping中的配置参数起过滤的作用.
*这里的参数都有{}表示可以配置多个参数,当仅配置单个参数的时候,我们直接使用字符串也可以,可以不用{}包裹
2.配置参数
@RequestMapping(value={}, method={}, params={}, headers={}, consumes={}, produces={} )
(2)method:请求方式,也就是GET,POST等动词
(3)params:请求路径URL path路径参数(不是HTTP请求的body带的参数),也就是使用&分隔符分隔的参数键值对,例如myParam=myValue
(4)headers:标准HTTP请求头,例如content-type=text/*
(5)consumes:互联网媒体类型,一般就是我们所说的MIME类型,用来确定请求的内容类型或响应的内容类型。
根据Content-Type来匹配
(6)produces:表示将功能处理方法将生产什么样格式的响应数据,此时根据请求头中的Accept进行匹配
例如:produces = "application/json",表示将功能处理方法将生产json格式的数据,此时根据请求头中的Accept进行匹配,
如请求头“Accept:application/json”时即可匹配
3.使用
@RequestMapping可以在两个地方配置,
(1)在控制器类中,它的作用域是整个控制器的所有方法
(2)在控制器的方法,仅对使用的控制器方法有效
例如:@Controller
@RequestMapping("/mapping")
public class RequestMappingController {
@RequestMapping(value = {"path1", "path2"})
public String multiMapping(HttpServletRequest req, Model model) {
model.addAttribute("path", req.getRequestURL());
return "request/multiMapping";
}
//code
}
4.example
(1)value的测试
代码
@RequestMapping(value = {"path1", "path2"})
public String multiMapping(HttpServletRequest req, Model model) {
model.addAttribute("path", req.getRequestURL());
return "request/multiMapping";
}
我们配置了
多个value值,也就是该控制器方法对应对个请求路径
测试结果
当非/path1 和/path2的指,会出现404
(2)methods
代码
@RequestMapping(value = "methods", method = { RequestMethod.GET, RequestMethod.POST })
public String methodsMapping(HttpServletRequest req, Model model) {
model.addAttribute("method", req.getMethod());
return "request/methodsMapping";
}
结果
可以换非GET和POST测试请求将会失败
(3)params
代码
@RequestMapping(value = "params", params = { "id=007", "name" })
public String paramsMapping(HttpServletRequest req, Model model) {
model.addAttribute("id", req.getParameter("id"));
model.addAttribute("name", req.getParameter("name"));
return "request/paramsMapping";
}
该配置表示请求URL需要带有id=007的参数,并且需要一个name的参数,name的参数值没有限定,可以有也可以没有
结果
此时的后台抛出来的异常
(4)headers
代码
@RequestMapping(value = "headers", headers = { "content-type=text/html" })
public String headersMapping(HttpServletRequest req, Model model) {
model.addAttribute("contentType", req.getHeader("content-type"));
return "request/headersMapping";
}
结果
当请求头中没有Content-Type="text/html"的时候
此时后台抛出异常
然后我们使用浏览器的开发工具重新编辑请求,加入Content-Type, 然后重新发送请求.
然后我们就可以得到200的成功请求