接上一篇文章继续: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控制台就会出现我们的参数