在我们使用现有的Spring框架生态做开发时,我们接触到了很多注解,比如
Service(标注业务层)、RequestMapping(标注映射路径)、RequestParam(标注参数)、Controller(标注控制层)等等。这些注解的存在在很大程度上,帮助我们简化了开发,今天我们来研究下RequestMapping注解。一、源码分析
源码分析:
Target({ElementType.TYPE,ElementType.METHOD})Retention(RetentionPolicy.RUNTIME)DocumentedMappingpublic
interfaceRequestMapping{//为映射分配一个名称。在类型级别和方法级别都支持!
Stringname()default"";
//为映射的路径起一个别名//例如
RequestMapping("foo")等价于RequestMapping(path="foo")AliasFor("path")String[]value()default{};
AliasFor("value")String[]path()default{};
//支持的HTTP请求类型,主要可以处理的请求方式有GET、POST、HEAD、OPTIONS、PUT、PATCH、DELETE、TRACE等
RequestMethod[]method()default{};
//指定request中必须包含某些参数值,才让该方法处理
String[]params()default{};
//指定request中必须包含某些指定的header值,才能让该方法处理请求
String[]headers()default{};
//指定处理请求的提交内容类型(Content-Type),例如application/json,text/html;
String[]consumes()default{};
//指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
String[]produces()default{};
}
在
Target中有两个属性,分别为ElementType.METHOD和ElementType.TYPE,表明RequestMapping可以在方法和类的声明中使用。我们还可以看到注解中的属性除了name()返回的字符串,其它的方法均返回数组,也就是可以定义多个属性值,例如value()和path()都可以同时定义多个字符串值来接收多个URL请求。
二、可标注位置说明
RequestMapping注解可标注位置情况一:
类级别
RequestMapping注解可以放在类上,也可以直接放在方法上。当
RequestMapping位于类上时,表示对应的路径映射对整个类中的方法都生效,访问类中的某个方法时,必须在其子映射路径上加上类上的映射路径。比如如下代码访问:
RestControllerRequestMapping(value="/user")publicclassLoginController{
AutowiredprivateLoginServiceloginService;
AutowiredprivateStringRedisTemplatestringRedisTemplate;
AutowiredprivateHttpServletRequestrequest;
/**
*用户登录
*
paramusername*
parampassword*
return*/
GetMapping("/login")publicResultlogin(Stringusername,Stringpassword){
//用户登录完成获取令牌
AuthTokenauthToken=loginService.login(username,password);
//获取用户登录时候的ip地址
StringipAddress=IpUtil.getIpAddress(request);
//将用户的令牌和ip地址绑定,将数据存储到redis中去
stringRedisTemplate.opsForValue().set(ipAddress,authToken.getAccessToken());
returnResult.ok(authToken);
}
}
如果我们想要访问login方法,则路径需要这样写:localhost:/user/login,在login方法的login映射路径前,加上LoginController类上指定的请求路径/user才可以。
情况二:
方法级别
当
RequestMapping注解位于方法上时,表示指明了这个方法的请求映射路径,如果类上没有使用RequestMapping注解标注相关请求路径,则可以直接访问方法上的映射路径来直接访问方法。比如如下代码访问:
RestControllerpublicclassFileController{
Value("${fileServer.url}")privateStringurl;
/**
*文件上传
*
paramfile*
return*/
PostMapping(value="/fileUpload")publicResultfileUpload(
RequestParam("file")MultipartFilefile)throwsException{//文件上传
returnResult.ok(url+FastDfsUtil.upload(file));
}
}
此时,FileController类上并没有请求路径映射,
我们可以直接通过locahost:/fileUpload来访问fileUpload文件上传方法。
三、注解作用说明
RequestMapping注解作用RequestMapping注解的作用是将请求和处理请求的控制器方法关联起来,在请求与处理方法之间,建立映射关系。四、注解属性运用说明
RequestMapping注解属性代码测试分析下面我们就通过测试代码,来看下
RequestMapping注解中的属性具体是如何进行使用的。情况一:测试value属性
//value可以省略不写的
RequestMapping(value="/testValue")publicStringtestValue(){
return"测试
RequestMapping注解属性-value";}
浏览器输入请求