Bootstrap

SpringMVC接收数据

一、访问路径设置:

@RequestMapping注解的作用就是将请求的URL地址和处理请求的方式(handler方法)关联起来,建立映射关系;SpringMVC接收到指定的请求,就会来找到在映射关系中对应的方法来处理这个请求

1.精准路径匹配:

在@RequestMapping注解指定URL地址时,不使用任何通配符,按照请求地址进行精确匹配

@Controller
public class UserController {

    /**
     * 精准设置访问地址 /user/login
     */
    @RequestMapping(value = {"/user/login"})
    @ResponseBody
    public String login(){
        System.out.println("UserController.login");
        return "login success!!";
    }

    /**
     * 精准设置访问地址 /user/register
     */
    @RequestMapping(value = {"/user/register"})
    @ResponseBody
    public String register(){
        System.out.println("UserController.register");
        return "register success!!";
    }
    
}

2.模糊路径匹配:

在@RequestMapping注解指定URL地址时,通过使用通配符,匹配多个类似的地址

@Controller
public class ProductController {

    /**
     *  路径设置为 /product/*  
     *    /* 为单层任意字符串  /product/a  /product/aaa 可以访问此handler  
     *    /product/a/a 不可以
     *  路径设置为 /product/** 
     *   /** 为任意层任意字符串  /product/a  /product/aaa 可以访问此handler  
     *   /product/a/a 也可以访问
     */
    @RequestMapping("/product/*")
    @ResponseBody
    public String show(){
        System.out.println("ProductController.show");
        return "product show!";
    }
}

单层匹配和多层匹配:

/*:只能匹配URL地址中的一层,如果想准确匹配两层,那么就写“/*/*”以此类推。

/**:可以匹配URL地址中的多层。

其中所谓的一层或多层是指一个URL地址字符串被“/”划分出来的各个层次。这个知识点虽然对于@RequestMapping注解来说实用性不大,但是将来配置拦截器的时候也遵循这个规则。

3.类和方法级别区别:

@RequestMapping注解可以用于类级别和方法级别,它们之间的区别如下:

(1).设置到类级别:@RequestMapping注解可以设置在控制器类上,用于映射整个控制器的通用请求路径。这样,如果控制器中的多个方法都需要映射同一请求路径,就不需要在每个方法上都添加映射路径。

(2).设置到方法级别:@RequestMapping注解也可以单独设置在控制器方法上,用于更细粒度地映射请求路径和处理方法。当多个方法处理同一个路径的不同操作时,可以使用方法级别的 @RequestMapping注解进行更精细的映射。

//1.标记到handler方法
@RequestMapping("/user/login")
@RequestMapping("/user/register")
@RequestMapping("/user/logout")

//2.优化标记类+handler方法
//类上
@RequestMapping("/user")
//handler方法上
@RequestMapping("/login")
@RequestMapping("/register")
@RequestMapping("/logout")

4.附带请求方式限制:

HTTP协议定义了八种请求方式,在SpringMVC中封装到了下面这个枚举类:

public enum RequestMethod {
  GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
}

默认情况下:@RequestMapping("/logout")任何请求方式都可以访问

如果需要特定指定:违背请求方式,会出现405异常

@Controller
public class UserController {

    /**
     * 精准设置访问地址 /user/login
     * method = RequestMethod.POST 可以指定单个或者多个请求方式!
     * 注意:违背请求方式会出现405异常!
     */
    @RequestMapping(value = {"/user/login"} , method = RequestMethod.POST)
    @ResponseBody
    public String login(){
        System.out.println("UserController.login");
        return "login success!!";
    }

    /**
     * 精准设置访问地址 /user/register
     */
    @RequestMapping(value = {"/user/register"},method = {RequestMethod.POST,RequestMethod.GET})
    @ResponseBody
    public String register(){
        System.out.println("UserController.register");
        return "register success!!";
    }

}

5.进阶注解:

还有@RequestMapping的HTTP方法特定快捷方式变体:@GetMapping、@PostMapping、@PutMapping、@DeleteMapping、@PatchMapping

@RequestMapping(value="/login",method=RequestMethod.GET)
||
@GetMapping(value="/login")

进阶注解只能添加到handler方法上,无法添加到类上

6.常见配置问题:

出现原因:多个handler方法映射了同一个地址,导致SpringMVC在接收到这个地址的请求时该找哪个handler方法处理

二、接收参数:

1.param和json比较:

在HTTP请求中,可以选择不同的参数类型,如param类型和JSON类型。下面对这两种参数类型进行区别和对比:

(1).参数编码:param类型的参数会被编码为ASCII码。例如,假设name=john doe,则会被编码为 name=john%20doe。而JSON类型的参数会被编码为UTF-8。

(2).参数顺序:param类型的参数没有顺序限制。但是,JSON类型的参数是有序的。JSON采用键值对的形式进行传递,其中键值对是有序排列的。

(3).数据类型:param类型的参数仅支持字符串类型、数值类型和布尔类型等简单数据类型。而 JSON类型的参数则支持更复杂的数据类型,如数组、对象等。

(4).嵌套性:param类型的参数不支持嵌套。但是,JSON类型的参数支持嵌套,可以传递更为复杂的数据结构。

(5).可读性:param类型的参数格式比JSON类型的参数更加简单、易读。但是,JSON格式在传递嵌套数据结构时更加清晰易懂。

总的来说,param类型的参数适用于单一的数据传递,而JSON类型的参数则更适用于更复杂的数据结构传递。根据具体的业务需求,需要选择合适的参数类型。在实际开发中,常见的做法是在 GET 请求中采用param类型的参数,而在POST请求中采用JSON类型的参数传递。

;