文章目录

  • @Controller
  • @ResponseBody
  • @RestController
  • @RequestMapping
  • @RequestBody——获取请求参数中的json字符串
  • @RequestParam——获取传入参数的值
  • @PathVariable—— 获取定义在路径中的参数值
  • @MatrixVariable——使用矩阵变量绑定参数
  • @RequestHeader——请求报文头的值
  • @CookieValue——请求中Cookie的值


@Controller

注解位置: 标记在POJO上(类上)
作用: 通过<context:component-scan/>扫描相应的类包,即可使POJO称为一个能处理HTTP请求的控制器
解释:

@Controller
public class UserController {
}

@ResponseBody

注解位置: 标注在类上或者方法上
作用: 将返回值的转化为JSON格式,如果该该注解放在类上,它是继承的,每个方法都就有了该注解。不需要再添加到方法上了。
解释:

@Controller
@ResponseBody
public class TestController {
}

@Controller
public class TestController {
  @RequestMapping(value = "/updateUser", method = RequestMethod.POST)
  @ResponseBody
  public Object getUser() {
      return null;
  }
}

@RestController

注解位置: 标记在POJO上(类上)
作用: @Controller+@ResponseBody 的结合体
解释:

@RestController
public class TestController {
    // 同上效果
    @RequestMapping(value = "/updateUser", method = RequestMethod.POST)
    public Object getUser() {
        return null;
    }
}

@RequestMapping

注解位置: 控制器的类上或者方法上
作用: 用于映射请求的路径与对应的方法。
解释: 在控制器的类上以及方法上定义出都可以标注@RequestMapping,类定义处的@RequsetMapping提供初步的请求映射信息,方法定义出的@RequsetMapping提供进一步的戏份映射信息,DispatcherServlet截取请求后,就是通过控制器上的@RequestMapping提供的映射信息对清求所对应的处理方法。
参数:

public @interface RequestMapping {

    @AliasFor("path")
    String[] value() default {};
	//请求的URL
    @AliasFor("value")
    String[] path() default {};
	//请求的方法
    RequestMethod[] method() default {};
    //请求参数
    String[] params() default {};
	//报文头
    String[] headers() default {};

}

params、headers支持简单的映射表达式,
params表达式为例 : headers参照params

params="param1" :表示请求需要包含param1的请求参数
    params="!param1" :请求不能包含param1的请求参数
    params="param1!=val": 表示请求包含param1的请求参数,但是值不能为val
    params={"param1=val","param2"}:表示必须包含param1和param2的两个请求参数。切param1值为val,

例:

@RestController
public class TestController {
    @RequestMapping(value = "/updateUser",params = {"a=1","b"},method = RequestMethod.GET)
    public Object getUser(@RequestParam("a") String a ,@RequestParam("b") String b) {
        return a+"------"+b;
    }
    // 请求 /updateUser?a=2&b  报错 400 Parameter conditions "a=1, b" not met for actual request parameters:  表示不满足a=1,b 参数,说明必须要有a、b两个参数,切a=1
    // 请求 /updateUser?a=1&b=2 OK  1------2
}

以下注解都是根据对请求做处理的注解,他们都在形式参数位置

@RequestBody——获取请求参数中的json字符串
@RequestParam——获取传入参数的值

作用: 指定参数名获取传入参数的值,如果方法参数是Map<String、String>、MultiValueMap<String、String>或HttpHeaders,则映射将填充所有头部名称和值。
参数:

//同name()方法
  	 @AliasFor("name")
    String value() default "";
    //绑定到的请求参数的名称。
    @AliasFor("value") 
    String name() default "";
	//参数是否必须  默认是true,如果请求不存在该参数,则抛出异常;如果为false,如果请求不存在该参数,形参为null ,
    boolean required() default true;

    String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";

例子

@RequestMapping(value = "/test")
public Object test(@RequestParam(value = "name",required = false) String name
,@RequestParam(value = "id") String id) {
        return id+"-----"+name;
    }
//get   /test?name=sjy&id=1    输出  1-----sjy
//get   /test?id=1			 输出  1-----null
//get   /test?name=sjy         输出 400 – 错误的请求
@PathVariable—— 获取定义在路径中的参数值

**作用:**用来映射URL中的占位符到目标方法的参数中
参数:

//要绑定到的路径变量的名称。
 String value() default "";

例:

@RequestMapping(value = "/test1/{id}/test1/{name}")
public Object test1(@PathVariable(value = "id") String id,
    @PathVariable(value = "name") String name) {
        return id+"-----"+name;
    }
//请求   /test1/11/test1/211    输出   11-----211
@MatrixVariable——使用矩阵变量绑定参数

作用: 使用矩阵变量绑定参数,Spring4.0已经全面支持Matrix Variable,该注解似的开发人员能够将请求中的矩阵变量绑定到处理器的方法参数中。
Matrix Variable中,多个变量可以使用”;“(分号)分隔,提示: 默认Spring MVC中Matrix Variable功能是关闭的,如果要开启该功能,需要在spring-mvc配置文件中添加如下设置 <mvc:annotation-driven enable-matrix-variables=“true”/> 。

<?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xmlns:p="http://www.springframework.org/schema/p"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/mvc
           http://www.springframework.org/schema/mvc/spring-mvc.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd">
           <!--开启Matrix Variable功能-->
    <mvc:annotation-driven enable-matrix-variables="true"/>
    <context:component-scan base-package="com.sjy"/>
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/views/"
          p:suffix=".jsp"/>
</beans>

如果在spring boot 想要使用该功能需要如下配置,重写WebMvcConfigurer接口的configurePathMatch方法即可

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        UrlPathHelper urlPathHelper=new UrlPathHelper();
        urlPathHelper.setRemoveSemicolonContent(false);
        configurer.setUrlPathHelper(urlPathHelper);
    }
}

例如: /test2;id=1;name=sjy
参数:

// 同name()方法
	@AliasFor("name") 
    String value() default "";
	// 矩阵变量的名称。如果方法参数是Map<String、String>、MultiValueMap<String、String>或HttpHeaders,则映射将填充所有头部名称和值。
    @AliasFor("value")
    String name() default "";
	//如果需要消除歧义,矩阵变量所在的URI路径变量的名称 看下面例子理解
    String pathVar() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
	//是否需要矩阵变量。 
    boolean required() default true;

例子:

@RequestMapping(value="test2/{id}/p/{name}")
public Object test2(@MatrixVariable(pathVar = "id") Map<String, String[]> id,
@MatrixVariable(pathVar = "name") Map<String, String[]> name){
    return id+"-----"+name;
    }
    
//请求  /test2/1s;a=1,2,3;b=a;c=cc/p/sjy;s=2;j=3;y=3;d=a,b,c,d   
//输出响应  {a=[1, 2, 3], b=[a], c=[cc]}-----{s=[2], j=[3], y=[3], d=[a, b, c, d]}
//如果将@MatrixVariable注解中的pathVar属性去掉
//相同的请求
//输出响应  {a=[1, 2, 3], b=[a], c=[cc], s=[2], j=[3], y=[3], d=[a, b, c, d]}-----{a=[1, 2, 3], b=[a], c=[cc], s=[2], j=[3], y=[3], d=[a, b, c, d]}

//完整性测试
@RequestMapping(value = "/test3/{ownerId}/test3/{petId}", method = RequestMethod.GET)
    public Object findPet(
    @PathVariable(value = "ownerId") Integer ownerId ,
    @PathVariable(value = "petId") Integer petId ,
    @MatrixVariable(value = "q", pathVar = "ownerId") String q,
    @MatrixVariable(pathVar = "ownerId") Map<String, String> matrixVars,
    @MatrixVariable(pathVar = "petId") Map<String, String> petMatrixVars) {
      return "ownerId: " + ownerId + "----petId:" + petId + "----q: " + q + 
                "----matrixVars: " + matrixVars + "---petMatrixVars: " + petMatrixVars;
    }
	// 请求   /test3/1;q=1,2,3;b=a;c=cc/test3/12;s=2;j=3;y=3;d=a,b,c,d
    // 输出响应 ownerId: 1----petId: 12----q: 1,2,3----matrixVars: {q=[1, 2, 3], b=[a], c=[cc]}---petMatrixVars: {s=[2], j=[3], y=[3], d=[a, b, c, d]}
@RequestHeader——请求报文头的值

**作用:**指定报文头参数名获取传入参数的值,如果方法参数是Map<String、String>、MultiValueMap<String、String>或HttpHeaders,则映射将填充所有头部名称和值。
参数:

@AliasFor("name")
    String value() default "";
	//要绑定到的请求头的名称
    @AliasFor("value")
    String name() default "";
	//是否需要该参数
    boolean required() default true;

例:

@RequestMapping("/test4")
    public Object test4(@RequestHeader Map<String, String> map){
        return map.toString();
    }

controller中注入reuqest对象_请求参数

@CookieValue——请求中Cookie的值

与@RequestHeader同理,不过是获取的Cookie中的值。


当然在形参那里可以使用ServletAPI最想作为入参,如HttpServletRequest、HttpServletResponse等,也可以使用I/O作为入参如,OutPutStream等


如有不当之处,欢迎指正