前面聊过了SpringMVC,以及通过实例演示了SpringMVC如何搭建,如果对环境搭建不太了解的话,可以看一下前面的文章(下面演示的例子,环境都是通过上面的例子进行演示的):传送阵
在使用javaweb项目原生是servlet中,对应请求地址,返回的数据的页面之前都是在web.xml,新版本可以通过注解进行配置了。需要了解servlet可以看一下前面的文章:传送阵
RequestMapping
自然无论如何配置,spring自然需要有个配置一下路径,不然如何将地址和处理地址的方法关联起来呢。所以就需要聊一下注解RequestMapping。
前面说了环境之间使用了前面一篇文章,所以不再赘述。
注解位置
首先前面说下这个注解刻意放的位置,对于这个很简单的,直接看源码即可:
可以看出其可以放在方法和类上。
注解在方法上
在例子中,使用的是在方法上进行注解的,如下:
@Controller
public class controller {
@RequestMapping("/a")
public String test(){
return "index";
}
}
这个直接在方法上进行注解的, 会直接调用地址的时候:http://localhost:8080/testSpringMVC_war/a
直接回返回页面
方法上还好理解,毕竟是放在方法上而已,然后再大胆一点,再一个方法上来两个url配置
@Controller
public class controller {
@RequestMapping({"/a","/b"})
public String test(){
return "index";
}
}
访问http://localhost:8080/testSpringMVC_war/a或者http://localhost:8080/testSpringMVC_war/b可以。为什么呢看一下源码:
value可以省略不写,而且人家默认就是一个数组,只不过写一个时候可以不带**{}**罢了。
当然配置一个url不可以在两个方法,比如这样就会报错。
// 错误示范
@RequestMapping("/a" )
public String test(HttpServletRequest request){
......
}
@RequestMapping("/a" )
public String test1(HttpServletRequest request){
......
}
注解在类上
@Controller
@RequestMapping("/a")
public class controller {
public String test(HttpServletRequest request){
return "index";
}
}
然后访问地址http://localhost:8080/testSpringMVC_war/a
直接报错,其不是这样用到,仔细想一下就明白,毕竟注解在类上面,而类可能会很多方法,作用是这样:
@Controller
@RequestMapping("/test")
public class controller {
@RequestMapping("/a")
public String test(){
return "index";
}
@RequestMapping("/b")
public String test1(){
return "index";
}
}
访问地址变为:
http://localhost:8080/testSpringMVC_war/test/a
http://localhost:8080/testSpringMVC_war/test/b
可以看出在方法上注解,可以作为一个根url目标,让方法的配置的时候路径直接将其补充在前面。
前面配置的url对应是value属性,所以可以不写。还有几个属性简单聊一下。
name属性
简单的说就是一个方法的注释方便用户理解。
@Controller
@RequestMapping(value = "/test" )
public class controller {
@RequestMapping(value = "/a",name="这个就是一个测试方法")
public String test(){
return "index";
}
}
method 属性
除了匹配到 Path 还要 请求方式相同,取值是个枚举量。
演示一个例子:
@Controller
@RequestMapping(value = "/test" )
public class controller {
@RequestMapping(value = "/a",method = RequestMethod.POST)
public String test(){
return "index";
}
}
访问地址:http://localhost:8080/testSpringMVC_war/test/a
可以看出报错,请求方式是GET方法,但是注解限制只能是POST,所以无法访问到资源。
path属性
这个属性值其实与value同义,path(value)(path 和 value 互相引用,参见RequestMapping接口源码,也就是截图图片看一下,节省篇幅不再截图)
path属性,和1中的value属性使用一致,两者都是用来作为映射使用的。
@Controller
@RequestMapping(value = "/test" )
public class controller {
@RequestMapping(path ="/a" ,name="ddd")
public String test(){
return "index";
}
}
访问地址:http://localhost:8080/testSpringMVC_war/test/a 也可以得到返回请求,不再截图。
Params 属性
对参数进行限制,可以要求必须携带某些参数,或者是某些参数必须是某个值,或者是某些参数不是某个值
格式如下“
如果只有一个参数,可以不带花括号
1:必须带有某个参数 Params="必须带某参数"
2:必须不带某个参数 Params="!必须不带某参数"
3:当然还可以限定某个参数值必须是某值:Params="参数=必须等于的值" 也可以 Params="参数!=必须等于的值"
当然可以单独用,也可以分开用,现在来一个整体用演示:
@Controller
@RequestMapping(value = "/test" )
public class controller {
@RequestMapping(path ="/a" ,params = {"username","!password"})
public String test(){
return "index";
}
}
访问地址:http://localhost:8080/testSpringMVC_war/test/a
因为不含有参数username所以报错
然后访问:http://localhost:8080/testSpringMVC_war/test/a?username=jok
然后访问:http://localhost:8080/testSpringMVC_war/test/a?username=jok&password=111
因为限制不能有参数password,而url中含有了,所以报错了。
然后再来一个必须等于的值:
@Controller
@RequestMapping(value = "/test" )
public class controller {
@RequestMapping(path ="/a" ,params = {"username=zz","!password"})
public String test(){
return "index";
}
}
如果访问:http://localhost:8080/testSpringMVC_war/test/a?username=jok会报错
如果访问:http://localhost:8080/testSpringMVC_war/test/a?username=zz
headers 属性
设置请求头当中必须包含 或 必须不包含 某个键。虽然代表的意义不一样但是其用法和Param属性用法格式几乎一样。
如果只有一个参数,可以不带花括号
1:必须带有某个参数 headers ="必须带某参数"
2:必须不带某个参数 headers ="!必须不带某参数"
3:当然还可以限定某个参数值必须是某值:headers ="参数=必须等于的值" 也可以 headers ="参数!=必须等于的值"
不再演示了,如果不了解header属性,可以看另一篇文章:传送阵
consumes 属性
指定处理请求的提交内容类型(Content-Type),例如:application/json、text/html,multipart/form-data等时,才能够让该方法处理请求。
如果只有一个参数,可以不带花括号
1:必须带有某个内容类型 consumes ="内容类型"
2:必须不能是内容类型 headers ="!内容类型"
来一个例子:
@Controller
@RequestMapping(value = "/test" )
public class controller {
@RequestMapping(path ="/a", method = Request.POST, consumes = "text/html")
public String test(){
return "index";
}
}
produces 属性
指定返回的内容类型,返回的内容类型必须是request请求头(Accept)中所包含的类型。
来一个例子:
@Controller
@RequestMapping(value = "/test" )
public class controller {
@RequestMapping(path ="/a", method = Request.POST, produces = "application/json")
public String test(){
return "index";
}
}
补充
路径中的占位符
参数也作为路径的一部分,其实就是 支持RESTful,如果不了解可看下:传送阵
这个会在请求路径变化如下
原始方式:/a/id=1
Restful : /a/1
这个需要用到一个注解@PathVariable,这个注解使用在方法参数中。现在演示一个:
public class controller {
@RequestMapping("/a/{username}")
public String test(@PathVariable("username") String username ){
System.out.println(" 方法1 username==="+username);
return "index";
}
@RequestMapping(path ="/a/{username}/{password}" )
public String test1(@PathVariable("username") String username ,@PathVariable("password") String password ){
System.out.println("方法2 username==="+username+" password==="+password);
return "index";
}
}
访问地址:http://localhost:8080/testSpringMVC_war/test/a/aa
访问地址:
http://localhost:8080/testSpringMVC_war/test/a/aa/bbb
有时候未来方便表示出那个url是干什么的不用@RequestMapping,而是需要@PostMapping,@GetMapping,@DeleteMapping和@PutMapping来配置url。
- @GetMapping : 是一个组合注解, 通常用来处理get请求,常用于执行查询操作。是@RequestMapping(value=“这里写的是请求的路径”,method = RequestMethod.GET)的缩写。
- @PostMapping:是一个组合注解, 通常用来处理post请求,常用于执行添加操作。是@RequestMapping(value=“这里写的是请求的路径”,method = RequestMethod.POST)的缩写
- @PutMapping:是一个组合注解,通常用来处理put请求,常用于执行更新操作是@RequestMapping(value=“这里写的是请求的路径”,method = RequestMethod.PUT)的缩写
- @DeleteMapping:是一个组合注解。通常用来处理delete请求,常用于执行删除操作。是@RequestMapping(value=“这里写的是请求的路径”,method = RequestMethod.DELETE)的缩写。
先不说其它而是看某个注解的源码就明白为什么是组合注解了:
其实这四种用法和@RequestMapping一样, 只不过注意请求的方法是被限定了。
Ant 风格路径
即请求路径当中可以放置一些特殊字符来表示特殊含义,其实有点像是正则表达式。
符号 | 描述 |
---|---|
? | 表示单个任意字符 例子: @RequestMapping(path =“/a?a/b”) 通过路径为"/aaa/b" 或者"/aba/b"等都可以跳到这个注解的方法 |
* | 表示0或者多个字符 例子:@RequestMapping(path =“/a*a/b”)通过路径为"/aa/b" 或者"/aaa/b" 或者"/aba/b"等都可以跳到这个注解的方法 |
** | 表示任意层数的任意目录 ,不过其格式只能是: /**/url最后不同 例子:只能类似这样写 /**/a/b 或者 /**/a |