SpringMVC 坑路3 -> 注解1 -> RequestMapping 中 value 的用法

@Controller:用于标识是处理器类
@RequestMapping:请求到处理器功能方法的映射规则
@RequestParam:请求参数到处理器功能处理方法的方法参数上的绑定
@ModelAttribute:请求参数到命令对象的绑定
@SessionAttributes:用于声明 session 级别存储的属性,放置在处理器类上,通常列出模型属性(如 @ModelAttribute)对应的名称,则这些属性会透明地保存在 session 中
@InitBinder:自定义数据绑定注册支持,用于将请求参数转换到命令对象属性的对应类型
@CookieValue:cookie 数据到处理器功能处理方法的方法参数上的绑定
@RequestHeader:请求头(header)数据到处理器功能处理方法参数上的绑定
@RequestBody:请求的 body 体的绑定(通过 HttpMessageConverter 进行类型转换)
@RequestStatus:定义处理器功能处理方法/异常处理器返回的状态码和原因
@ExceptionHandler:注解式声明异常处理器
@PathVariable:请求 URI 中的模版变量部分到处理器功能处理方法的方法参数上的绑定,从而支持 RESTful 架构风格的 URL

目录结构参考:SpringMVC 坑路2 -> DispatcherServler + Controller
首先上 jsp 部分的代码:

login.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    请求路径为:${path}
    <center>
        <form action="do_login" method="post">
            姓名:<input type="text" name="name" /> <br /> 
            性别:<input type="text"name="gender" /> <br /> 
            <input value="提交" type="submit" />
        </form>
    </center>
</body>
</html>

此处只谈 @RequestMapping 与 @RequestParam
@RequestMapping

查看源代码:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
    String name() default "";
    @AliasFor("path")
    String[] value() default {};
    @AliasFor("value")
    String[] path() default {};
    RequestMethod[] method() default {};
    String[] params() default {};
    String[] headers() default {};
    String[] consumes() default {};
    String[] produces() default {};
}

RequestMapping是一个用来处理请求地址映射的注解,可用于类、接口货方法上,用于类或者接口上的时候,表示类中的所有相应请求的方法都是以该地址作为父路径,基本字段有name,path(value)(path 和 value 互相引用),method,params,headers,consumes,produces

比较常用的有:

value(path)

  指定请求的实际地址,指定的地址可以是 URI Template 模式

method

  指定请求的 method 类型。例如 GET、POST、PUT、DELETE 等

consumes

  指定处理请求的提交内容类型(Content-Type),例如application/json,text/html;

produces

  指定返回的内容类型,仅当 request 请求头中的(Accept)类型中包含该指定类型才返回

params

  指定 request 中必须包含某些参数值,才让该方法处理请求。

  指定 request 中必须包含某些指定的 header 值,才能让该方法处理请求。

value 用法:

在方法上声明:

@Controller
public class LoginController {
    @RequestMapping("/to_login")
    public ModelAndView toLogin(){
        System.out.println("进入 to_login");
        ModelAndView mv = new ModelAndView();
        mv.setViewName("login");
        return mv;
    }
}

此时请求地址为 ip/项目名/to_login
这里写图片描述

在类上声明一个 @RequestMapping 注解:

@Controller
@RequestMapping("/login")
public class LoginController {
    @RequestMapping("/to_login")
    public ModelAndView toLogin(){
        System.out.println("进入 to_login");
        ModelAndView mv = new ModelAndView();
        mv.setViewName("login");
        return mv;
    }
}

则此时请求地址为 ip/项目名/login/to_login
这里写图片描述
* 普通 URL 映射:@RequestMapping({“/to_login”,”login”}):多个URL路径可以映射到同一个处理器的功能处理方法
* URI 模版模式映射

1、@RequestMapping(“/login/{userId}”):{xx} 占位符请求URL 可以是 “/login/123” 或 “/login/abc”。通过@PathVariable 可以提取 URI 模版模式中的 {xx} 中的 xx 变量的值。
2、@RequestMapping(“/login/{userId}/topic”):请求的 URL 可以是 “/login/uid/topic”
3、@RequestMapping(“/login/{userId}/topic/{topicId}”):请求的 URL 可以是 “/login/uid/topic/tid”


  • Ant 风格的 URL 路径映射

1、@RequestMapping(“/login/**”):可以匹配 “/login/abc/abc”,但 “/login/abc” 将会被 URI 模版模式映射中的 “/login/{userId}” 模式优先映射到(最长匹配优先)
2、@RequestMapping(“/login/abc?”):可匹配 “/login/abcd” 或者 “/login/abc1”,但不匹配 “/login/abc” 或 “/login/abcde”
3、@RequestMapping(“/login/abc*”):可匹配 “/login/abcd” 或 “/login/abcde”,但不匹配 “/login/abc”
代码示例:

@Controller
@RequestMapping("/login")
public class LoginController {
    @RequestMapping("/to_login")
    public ModelAndView toLogin() {
        System.out.println("进入 to_login");
        ModelAndView mv = new ModelAndView();
        mv.addObject("path", "/to_login");
        mv.setViewName("login");
        return mv;
    }

    @RequestMapping({"/to_login2","/login"})
    public ModelAndView toLogin2() {
        System.out.println("进入 to_login");
        ModelAndView mv = new ModelAndView();
        mv.addObject("path", "/to_login2,/login");
        mv.setViewName("login");
        return mv;
    }

    @RequestMapping({"/to_login/abc?"})
    public ModelAndView toLogin3() {
        System.out.println("进入 to_login");
        ModelAndView mv = new ModelAndView();
        mv.addObject("path", "/to_login/abc?");
        mv.setViewName("login");
        return mv;
    }
    @RequestMapping({"/to_login/abc*"})
    public ModelAndView toLogin4() {
        System.out.println("进入 to_login");
        ModelAndView mv = new ModelAndView();
        mv.addObject("path", "/to_login/abc*");
        mv.setViewName("login");
        return mv;
    }
    @RequestMapping("/**")
    public ModelAndView toLogin5() {
        System.out.println("进入 /**");
        ModelAndView mv = new ModelAndView();
        mv.addObject("path", "/**");
        mv.setViewName("login");
        return mv;
    }

    @RequestMapping("/to_login/**")
    public ModelAndView toLogin6() {
        System.out.println("进入 /to_login/**");
        ModelAndView mv = new ModelAndView();
        mv.addObject("path", "/to_login/**");
        mv.setViewName("login");
        return mv;
    }

    @RequestMapping("/to_login/abc")
    public ModelAndView toLogin7() {
        System.out.println("进入 /to_login/abc");
        ModelAndView mv = new ModelAndView();
        mv.addObject("path", "/to_login/abc");
        mv.setViewName("login");
        return mv;
    }

    @RequestMapping("/**/abc")
    public ModelAndView toLogin8() {
        System.out.println("进入 /**/abc");
        ModelAndView mv = new ModelAndView();
        mv.addObject("path", "/**/abc");
        mv.setViewName("login");
        return mv;
    }

    @RequestMapping("/*/*")
    public ModelAndView toLogin9() {
        System.out.println("进入 /*/*");
        ModelAndView mv = new ModelAndView();
        mv.addObject("path", "/*/*");
        mv.setViewName("login");
        return mv;
    }
}

看下各种不同请求地址所到达的方法:

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_33811662/article/details/80864784