概述
@RequestMapping是一个用来处理请求地址映射的注解,可以注解与类上,也可以注解与类中的方法上,注解与类上,表示该Controller的统一标识,通常表示一个模块的表示,注解在方法,则表示某请求又那个方法进行处理
@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:"applicationjson;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(){
......
}
}
这样一般返回applicationjson的格式数据,这个以后会再做分析
好了,到此为止,关于@RequestMapping一些常用的URL映射关系已经讲解结束了~END~
最后
以上就是朴实飞机为你收集整理的Spring MVC系列(二)之@RequestMapping和URL映射的全部内容,希望文章能够帮你解决Spring MVC系列(二)之@RequestMapping和URL映射所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复