接上一篇文章继续:IDEA搭建SpringMVC入门程序(1) – 每天进步一点点
本文代码下载链接:
demo10_SpringMVC的注解属性映射方式.zip(访问密码: 3726): https://url47.ctfile.com/f/64055047-1504300936-f62d08?p=3726
1.注解
(1)标注在方法上的注解
上文中已经使用过@Controller注解和@RequestMapping注解
我们在FirstController新增一个
@RequestMapping("/dog")
//设置当前方法返回值类型为 String,用于指定请求完成后跳转的页面
public void sayHello2() {
System.out.println("访问到 sayHello2!");
}

那么如果想访问sayHello2这个方法访问路径就是下面这样
http://localhost:8080/demo10/dog
执行结果如下图,注意,浏览器报错404在这里是正常的,因为上面的代码中我们并没有让它返回到某个jsp文件。

(2)标注在类上的注解
除了标注在方法上,还可以直接标注在类上。比如下面这样,
我们右击Controller文件夹,选择New—>Java Class,名字为SecondController

初始代码如下:
package com.itheima.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/second")
public class SecondController {
@RequestMapping("/say1")
public void sayHello3() {
System.out.println("访问到 sayHello3!");
}
}

我们重启tomcat,在浏览器中访问下面的路径
http://localhost:8080/second/say1
就可以看到浏览器里正确打印出了信息。

2.属性
(1)value属性
value属性是RequestMapping注解的默认属性,当只有一个属性是,则可以省略value本身。下面的两种写法都是一样的。
@RequstMapping(value="/dog")
@RequestMapping("/dog")
value也可以指定多个路径,把路径封装成一个请求列表即可。
创建一个新的方法,
@RequestMapping(value = {"/addUser","/deleteUser"})
public void checkAuth() {
System.out.println("执行系统的增删校验");
}
添加后,项目代码如下:

重写运行tomcat,分别在浏览器里输入
http://localhost:8080/demo10/second/addUser
http://localhost:8080/demo10/second/deleteUser
可以看到相同的内容被打印出来,结果如下:

(2)method属性
method指的是请求方式, 一般有GET、POST、PUT、DELETE四种方式
右击controller文件夹,选择New—>Java Class
名称为MethodController,参考代码如下:
package com.itheima.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping("/method")
public class MethodController {
//处理请求为GET的方式
@RequestMapping(method = RequestMethod.GET)
public void get(){
System.out.println("get请求");
}
//处理请求为POST的方式
@RequestMapping(method = RequestMethod.POST)
public void post(){
System.out.println("post请求");
}
//处理请求为PUT的方式
@RequestMapping(method = RequestMethod.PUT)
public void put(){
System.out.println("put请求");
}
//处理请求为GET的方式
@RequestMapping(method = RequestMethod.DELETE)
public void delete(){
System.out.println("delete请求");
}
}
在浏览器里输入下面的地址(浏览器默认就是get方式)
http://localhost:8080/demo10/method
IDEA控制台会输出下面的内容

其他方式建议使用api工具进行请求。
(3) param属性
params属性中定义的值可以将请求映射的定位范围缩小。当客户端进行请求时,如果请求参数的值等于params属性定义的值,则可以正常执行到的方法,否则映射的方法不执行。
注意:实际开发中,这种方式很少使用这种方式。
右击controller文件夹,选择New—>Java Class
名字为ParamsController

参考代码如下:
package com.itheima.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class ParamsController {
@RequestMapping(value = "/params", params = "id=1")
public void findById(String id){
System.out.println("id="+id);
}
}
实现效果如下图,可以看到如果填写id=2是访问不到findById方法的

3.映射方式
(1)基于请求方式的URL路径映射
@GetMapping 对应GET方式的请求
@PostMapping 对应POST方式的请求
@PutMapping 对应PUT方式的请求
@DeleteMapping 对应DELETE方式的请求
@PatchMapping 对应PATCH放到的请求
如果使用基于请求方式的URL路径映射,则简单修改一下即可,比如
原来是下面这样:
@Controller
public class ParamsController {
@RequestMapping(value = "/dog",)
public void test(){
System.out.println("test");
}
}
现在改成下面这样
@Controller
public class ParamsController {
@GetMapping(value = "/dog",)
public void test(){
System.out.println("test");
}
}
@GetMapping是@RequestMapping(method=RequestMethod.GET)的缩写
(2)基于Ant风格的URL路径映射
?
:匹配单个字符*
:匹配任意数量字符(不包括路径分隔符/
)**
:匹配任意层级的路径(包括路径分隔符/
)
URL 模式 | 匹配的路径示例 | 说明 |
---|---|---|
/api/books/details/{id} | /api/books/details/123 | 精确匹配 + 路径变量 |
/api/books/category/* | /api/books/category/novel | 单级通配 |
/api/books/search/*/keyword | /api/books/search/java/keyword | 中间通配 |
/api/books/files/** | /api/books/files/2023/report.pdf | 多级通配(含子目录) |
/api/books/note/? | /api/books/note/a | 单字符通配 |
代码风格如下:
@RestController
@RequestMapping("/api/books")
public class BookController {
// 精确匹配 /api/books/details/123
@GetMapping("/details/{id}")
public Book getBookDetails(@PathVariable Long id) {
// ...
}
// Ant风格: 匹配 /api/books/category/novel 或 /api/books/category/tech
@GetMapping("/category/*")
public List<Book> getBooksByCategory() {
// ...
}
// Ant风格: 匹配 /api/books/search/任意内容
@GetMapping("/search/*/keyword")
public List<Book> searchBooks() {
// ...
}
// 多级路径匹配: 如 /api/books/files/2023/12/01/document.pdf
@GetMapping("/files/**")
public String getFile() {
// ...
}
// 匹配单字符: /api/books/note/a 或 /api/books/note/b
@GetMapping("/note/?")
public String getNoteByChar() {
// ...
}
}
(3)基于RESTful风格的URL路径映射
右击controller文件夹,选择New—>Java Class,名字为UserController

参考代码如下:
package com.itheima.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}/{name}")
public void getOrder(
@PathVariable String id, // 用户ID
@PathVariable String name // 用户名name
) {
System.out.println("用户ID="+id);
System.out.println("用户name="+name);
}
}
在浏览器中输入下面的地址
http://localhost:8080/demo10/users/2/tom
这里2表示的就是id,tom表示表示就是name
访问浏览器后,IDEA控制台就会出现我们的参数
