spring-web注解

1. @ControllerAdvice
  • 和@ExceptionHandler,@InitBinder,@ModelAttribute配合使用来处理相应的流程;
  • 如果被标注的类实现了ResponseBodyAdvice接口,则可以拦截@ResponseBody处理流程,自定义处理返回值
  • 如果被标注的类实现了RequestBodyAdvice接口,则可以拦截@RequestBody处理流程,自定义处理请求参数

属性说明

属性名说明
basePackages只有在指定包下的Controller才能被拦截,为空则不限制
assignableTypes只有继承了指定Class的Controller才能被拦截,为空则不限制
annotations只有标注了指定注解的Controller才能被拦截,为空则不限制

示例

@ControllerAdvice
public class ExceptionControllerAdvice implements ResponseBodyAdvice<Response<Object>>, 
RequestBodyAdvice{
     //.........
}


2. @ExceptionHandler
  • 直接用在Controller 中用于异常处理
  • 和@ControllerAdvice配合使用用于全局异常拦截,并处理

属性说明

属性名说明
value只处理指定的异常类型

示例

@ControllerAdvice
public class ExceptionControllerAdvice {

    /**
     * 处理所有不可知的异常。
     */
    @ExceptionHandler(Exception.class)
    public Response<Error> handleException(Exception ex) {
        Throwable rootCause = ExceptionUtils.getRootCause(ex);
        Throwable handleEx = rootCause != null ? rootCause : ex;
        log.error(handleEx.getMessage(), handleEx);

        // 2 未知错误处理
        return Response.fail(handleEx);
    }

}
3. @InitBinder

用于处理web请求参数绑定到bean中的流程

  • 直接用在Controller 中用于参数绑定
  • 和@ControllerAdvice配合使用用于全局参数绑定

示例

@ControllerAdvice
public class ExceptionControllerAdvice {

//特定格式日期绑定
@InitBinder
public void initBinder(WebDataBinder binder) {
	DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	CustomDateEditor dateEditor = new CustomDateEditor(df, true);
	binder.registerCustomEditor(Date.class, dateEditor);
}

}
4. @ModelAttribute

可以修改model中的属性值,用于页面渲染

  • 直接用在Controller 中
  • 和@ControllerAdvice配合使用用于全局配置
  • 对于前后端分离的情况没有使用价值

示例

@ControllerAdvice
public class ExceptionControllerAdvice {

//特定格式日期绑定
@ModelAttribute 
public void modelAttribute(String val, Model model) { 
         //可以从页面上获取key
         model.addAttribute("key",val); 
} 

}
4. @CookieValue
  • 请求参数在cookie中,从cookie中获取值

属性说明

属性名说明
valuecookie中的key

示例


@RestController
@RequestMapping("/spring")
public class SpringController {

	@GetMapping("/testCookie") 
	public void testCookie(@CookieValue("key") String val) {
	     System.out.println(val);
	}
}
4. @CrossOrigin

用于Controller如何响应跨域请求

属性说明

属性名说明
value允许访问的其他域
origins同value
allowedHeaders允许的请求头
exposedHeaders跨域请求下客户端只能获取部分响应头。像自定义的响应头需在此设置,客户端才能获取到
methods允许的http 方法,如get,post
allowCredentials是否允许发送cookie,证书等
maxAge预检请求的有效期时间,对于相同的预检请求,在有效期内不需要重复发送

示例


@RestController
@RequestMapping("/spring")
public class SpringController {

    //该请求允许跨域,而且没有任何其他域名、请求头等限制
    @CrossOrigin
	@GetMapping("/testCrossOrigin") 
	public void testCrossOrigin( String val) {
	     System.out.println(val);
	}
}
5. @MatrixVariable

获取矩阵变量的值

  • 矩阵变量:类似这种请求 /info;a=2;b=1,以;相隔的变量

属性说明

属性名说明
value请求参数名
name同value
pathVar路径变量值

示例


@RestController
@RequestMapping("/spring")
public class SpringController {
    /**
     /testMatrixVariabletest;key=3 结果为3
     /testMatrixVariable/abc;key=3 结果为空,因为pathVar不满足
    */ 
	@GetMapping("/testMatrixVariable/{path}") 
	public void testMatrixVariable(@MatrixVariable(name="key",pathVar="test") String val) {
	     System.out.println(val);
	}
}
6. @PathVariable

获取路径变量的值

  • 路径变量:类似这种请求 /a/{info},{}中为路径变量,key为info

属性说明

属性名说明
value请求参数名
name同value

示例


@RestController
@RequestMapping("/spring")
public class SpringController {
    /**
     /testPathVariable/test 结果为test
    */ 
	@GetMapping("/testPathVariable/{path}") 
	public void testPathVariable(@PathVariable("path") String val) {
	     System.out.println(val);
	}
}
7. @RequestAttribute

获取reqeust属性中的值

  • 主要用于在转发中传递属性

属性说明

属性名说明
value请求参数名
name同value

示例


@RestController
@RequestMapping("/spring")
public class SpringController {
    /**
      设置id属性
    */ 
	@GetMapping("/testRequestAttribute/setAttr") 
	public String testRequestAttributeSet(HttpServletRequest request) {
	     request.setAttribute("id", 001); 
         return "forward:/spring/testCookie/getAttr";
	}
    
    /**
      获取id属性
    */ 
	@GetMapping("/testCookie/getAttr") 
	public void testRequestAttributeGet(@RequestAttribute("id") String val) {
	     System.out.println(val);
	}
}
8. @RequestPart

获取Content-Type:multipart/form-data请求方式中的数据

  • multipart/form-data 是一种复合的请求方式,请求的数据可以按规则来分隔为几部分,每部分都有自己的Content-Type,该注解通过Content-Type来处理每部分的数据

属性说明

属性名说明
value请求参数名
name同value

示例

类似如下请求,----WebKitFormBoundaryrHKCBY7qhFd3TeeD 为每部分的分隔符

POST http://localhost/spring/testCookie/part HTTP/1.1
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrHKCBY7qhFd3TeeD
------WebKitFormBoundaryrHKCBY7qhFd3TeeD
Content-Disposition: form-data; name="name"
title
------WebKitFormBoundaryrHKCBY7qhFd3TeeD
Content-Disposition: form-data; name="file"; filename="chrome.png"
Content-Type: image/png
PNG ... content of chrome.png ...
------WebKitFormBoundaryrHKCBY7qhFd3TeeD--

@RestController
@RequestMapping("/spring")
public class SpringController {
   
	@PostMapping("/testRequestPart/part") 
	public void testRequestPart(@RequestPart("file") MultipartFile file,@RequestPart("name") String name) {
	     System.out.println(name);
	}
    
}
9. @ResponseStatus

主要用设置异常响应时的状态码和描述

属性说明

属性名说明
value响应码
code同value
reason响应的提示

示例


@RestController
@RequestMapping("/spring")
public class SpringController {
  //响应码将从200 变为500
   @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
	@GetMapping("/testResponseStatus/test") 
	public void testResponseStatus( String val) {
	     System.out.println(val);
	}
}
10. @SessionAttribute
  • 从session中获取值

属性说明

属性名说明
valuesession中的key

示例


@RestController
@RequestMapping("/spring")
public class SpringController {

	@GetMapping("/testSessionAttribute") 
	public void testSessionAttribute(@SessionAttribute("key") String val) {
	     System.out.println(val);
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值