SpringMVC常用注解

本文详细介绍了SpringMVC框架中的常用注解,包括@Controller、@RequestMapping、@RequestParam、@RequestBody等,以及它们在处理HTTP请求、JSON数据处理和RESTful URL映射中的应用,适合深入理解Spring MVC架构的开发者。
摘要由CSDN通过智能技术生成

SpringMVC常用注解

1. 基础注解

1.1 @Controller

1.1.1 注解分析
/**
 * 用于修饰表现层控制器的注解
 */
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
    /**
     * 用于指定存入IOC容器是Bean的唯一标识
     */
    @AliasFor(annotation = Component.class)
    String value() default "";
}
1.1.2 示例
/**
 * @author 刘淳
 */
@Controller
public class HelloController {
}

1.2 @RequestMapping

1.2.1 注解分析
/**
 * 作用:
 * 	用于建立请求URL和处理请求方法之间的对应关系。
 * 注意:
 * 	属性只要出现2个或以上时,他们的关系是与的关系。表示必须同时满足条件。
 * 出现位置:
 * 	写在类上:
 * 		请求URL的第一级访问目录。此处不写的话,就相当于应用的根目录。
 * 		它出现的目的是为了使我们的URL可以按照模块化管理,使我们的URL更加精细:
 * 	方法上:
 * 		请求URL的第二级访问目录。
 */
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
    /**
    * name:给请求URL提供一个名称。
    */
    String name() default "";
    /**
    * value:用于指定请求的URL。它和path属性的作用是一样的。
    * 细节:
    * 在配置此属性时,写不写/都是可以的。
    */
    @AliasFor("path")
    String[] value() default {};
    /**
    * 它是4.2版本中加入的注解,和value属性是一样的。
    * @since 4.2
    */
    @AliasFor("value")
    String[] path() default {};
    /**
    * method:用于指定请求的方式。它支持以下这些类型:
    * GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE.
    * 这些值是通过RequestMethod枚举指定的。
    */
    RequestMethod[] method() default {};
    /**
    * params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的key和value必须和配置的一模一样。
    * 例如:
    * params = {"accountName"},表示请求参数必须有accountName
    * params = {"moeny!100"},表示请求参数中money不能是100。
    */
    String[] params() default {};
    /**
    * headers:用于指定限制请求消息头的条件。
    * 例如:
    * RequestMapping(value = "/something", headers = "content-type=text/*")
    */
    String[] headers() default {};
    /**
    * consumes:用于指定可以接收的请求正文类型(MIME类型)
    * 例如:
    * consumes = "text/plain"
    * consumes = {"text/plain", "application/*"}
    */
    String[] consumes() default {};
    /**
    * produces:用于指定可以生成的响应正文类型。(MIME类型)
    * 例如:
    * produces = "text/plain"
    * produces = {"text/plain", "application/*"}
    * produces = MediaType.APPLICATION_JSON_UTF8_VALUE
    */
    String[] produces() default {};
}
1.2.2 示例
/**
* @author 刘淳
*/
@Controller
@RequestMapping("springmvc")
public class RequestMappingController {
    /**
     * 控制器方法
     */
    @RequestMapping(value = "hello",method = RequestMethod.GET,name = "SpringMVC的第一个请求")
    public String useRequestMapping(){
    	return "success";
	}
1.2.3 衍生注解
@GetMapping		@PostMapping	@PutMapping		@DeleteMapping

1.3 @RequestParam

1.3.1 注解分析
/**
 * 此注解是从请求正文中获取请求参数,给控制器方法形参赋值的。
 * 当请求参数的名称和控制器方法形参变量名称一致时,无须使用此注解。
 * 同时,当没有获取到请求参数时,此注解还可以给控制器方法形参提供默认值。
 * 注意:
 * 它只能出现在方法的参数上
 */
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {
    /**
     * 用于指定获取请求参数的名称。它和name属性的作用是一样的,
     */
    @AliasFor("name")
    String value() default "";
    /**
     * 它是在4.2版本中加入的。和value属性互为引用。
     * @since 4.2
     */
    @AliasFor("value")
    String name() default "";
    /**
     * 指定参数是否必须有值。当为true时,参数没有值会报错。
     */
    boolean required() default true;
    /**
     * 在参数没有值时的默认值。
     */
    String defaultValue() default ValueConstants.DEFAULT_NONE;
}
1.3.2 示例
/**
 * @author 刘淳
 */
@Controller
public class RequestParamController {
    /**
    * 处理请求的控制器方法
    */
    @RequestMapping("useRequestParam")
    public String useRequestParam(@RequestParam(value = "username",required =false) String name, Integer age) {
        System.out.println("控制器方法执行了" + name + "," + age);
        return "success";
    }
}

1.4 @InitBinder

1.4.1 注解分析
/**
 * 用于初始化表单请求参数的数据绑定器。
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface InitBinder {
    /**
     * 指定给哪些参数进行绑定操作。
     */
    String[] value() default {};
}
1.4.2 示例
/**
* @author 刘淳
*/
@Controller
public class InitBinderController {
    
    @RequestMapping("/saveUser")
    public String saveUser(User user){
        System.out.println("User is "+user);
        return "success";
    }
    
    @InitBinder("user")
    public void dateBinder(WebDataBinder dataBinder){
        dataBinder.addCustomFormatter(new DateFormatter("yyyy-MM-dd"));
    }
}
1.4.3 扩展:@DateTimeFormat
/**
* 用户实体类
* @author 刘淳
*/
public class User implements Serializable {
    private Integer id;
    private String username;
    private String password;
    private Integer age;
    private String gender;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date birthday;
}

1.5 @ControllerAdvice

1.5.1 注解分析
/**
 * 用于给控制器提供一个增强的通知。
 * 以保证可以在多个控制器之间实现增强共享。
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface ControllerAdvice {
    /**
     * 用于指定对哪些包下的控制器进行增强
     */
    @AliasFor("basePackages")
    String[] value() default {};
    /**
     * 它是4.0版本新加入的属性,作用和value是一样的。
     * @since 4.0
     */
    @AliasFor("value")
    String[] basePackages() default {};
    /**
     * 它是4.0新加入的注解,可以通过指定类的字节码的方式来指定增强作用范围。
     * @since 4.0
     */
    Class<?>[] basePackageClasses() default {};
    /**
     * 它是4.0新加入的注解,用于指定特定的类型提供增强。
     * @since 4.0
     */
    Class<?>[] assignableTypes() default {};
    /**
     * 它是4.0新加入的注解,用于指定给特定注解提供增强。
     * @since 4.0
     */
    Class<? extends Annotation>[] annotations() default {};
}
1.5.2 示例
/**
* @author 刘淳
*/
@ControllerAdvice(basePackageClasses=InitBinderController.class)
public class InitBinderAdvice {
    
    @InitBinder("user")
    public void dateBinder(WebDataBinder dataBinder){
    	dataBinder.addCustomFormatter(new DateFormatter("yyyy-MM-dd"));
    }
    
}

1.6 @RequestHeader

1.6.1 注解分析
/**
 * 此注解是从请求消息头中获取消息头的值,并把值赋给控制器方法形参。
 * 注意:
 * 它只能出现在方法的参数上
 */
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestHeader {
    /**
     * 用于指定请求消息头的名称。它和name属性作用一样。
     */
    @AliasFor("name")
    String value() default "";
    /**
     * 它是4.2版本引入的。和value属性互为引用。
     * @since 4.2
     */
    @AliasFor("value")
    String name() default "";
    /**
     * 用于指定是否必须有此消息头。当取默认值时,没有此消息头会报错。
     */
    boolean required() default true;
    /**
     * 用于指定消息头的默认值。
     */
    String defaultValue() default ValueConstants.DEFAULT_NONE;
}
1.6.2 示例
/**
* @author 刘淳
*/
@Controller
public class RequestHeaderController {
    @RequestMapping("/useRequestHeader")
    public String useRequestHeader(@RequestHeader(value="Accept-Language",required=false)String requestHeader){
        System.out.println(requestHeader);
        return "success";
    }
}

1.7 @CookieValue

1.7.1 注解分析
/**
 * 此注解是从请求消息头中获取Cookie的值,并把值赋给控制器方法形参。
 * 注意:
 * 它只能出现在方法的参数上
 */
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CookieValue {
    /**
     * 用于指定cookie的名称
     */
    @AliasFor("name")
    String value() default "";
    /**
     * 它是4.2版本引入的。和value属性互为引用。
     * @since 4.2
     */
    @AliasFor("value")
    String name() default "";
    /**
     * 用于指定是否必须有此消息头。当取默认值时,没有此消息头会报错。
     */
    boolean required() default true;
    /**
     * 用于指定消息头的默认值。
     */
    String defaultValue() default ValueConstants.DEFAULT_NONE;
}
1.7.2 示例
/**
 * @author 刘淳
 */
@Controller
public class CookieValueController {
    @RequestMapping("/useCookieValue")
    public String useCookieValue(@CookieValue(value="JSESSIONID",required=false) String cookieValue){
        System.out.println(cookieValue);
        return "success";
    }
}

1.8 @ModelAttribute

1.8.1 注解分析
/**
 * 它可以用于修饰方法,或者是参数。
 * 当修饰方法时,表示执行控制器方法之前,被此注解修饰的方法都会执行。
 * 当修饰参数时,用于获取指定的数据给参数赋值。。
 */
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ModelAttribute {
    /**
     * 当注解写在方法上,则表示存入时的名称。(值是方法的返回值)
     * 当注解写在参数上,可以从ModelMap,Model,Map中的获取数据。(前提是之前存入过)
     * 指定的是存入时的key。
     */
    @AliasFor("name")
    String value() default "";
    /**
     * 它和value的作用是一样的。
     */
    @AliasFor("value")
    String name() default "";
    /**
     * 用于指定是否支持数据绑定。它是4.3版本中新加入的属性。
     * @since 4.3
     */
    boolean binding() default true;
}
1.8.2 示例
/**
 * @author 刘淳
 */
@Controller
public class ModelAttributeController {
    /**
     * 被ModelAttribute修饰的方法
     */
    @ModelAttribute
    public void showModel(String username) {
    	System.out.println("执行了showModel方法"+username);
    }
    /**
     * 接收请求的方法
     */
    @RequestMapping("/testModelAttribute")
    public String testModelAttribute(String username) {
        System.out.println("执行了控制器的方法"+username);
        return "success";
    }
}

1.9 @SessionAttribute与@SessionAttributes

1.9.1 注解分析
/**
 * 此注解是用于让开发者和ServletAPI进行解耦。
 * 让开发者可以无需使用HttpSession的getAttribute方法即可从会话域中获取数据。
 */
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SessionAttribute {
    /**
     * 用于指定在会话域中数据的名称。
     */
    @AliasFor("name")
    String value() default "";
    /**
     * 它和value属性互为引用
     */
    @AliasFor("value")
    String name() default "";
    /**
     * 用于指定是否必须从会话域中获取到数据。默认值是true,表示如果指定名称不存在会报错。
     */
    boolean required() default true;
}
/**
 * 此注解是用于让开发者和ServletAPI进行解耦。
 * 通过此注解即可实现把数据存入会话域,而无需在使用HttpSession的setAttribute方法。
 * 当我们在控制器方法形参中加入Model或者ModelMap类型参数时,默认是存入请求域的。
 * 但当控制器上使用了此注解,就会往会话域中添加数据。
 */
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface SessionAttributes {
    /**
     * 指定存入会话域中的名称。
     */
    @AliasFor("names")
    String[] value() default {};
    /**
     * 它是4.2版本中加入的属性。作用和value是一样的。
     * @since 4.2
     */
    @AliasFor("value")
    String[] names() default {};
    /**
     * 指定可以存入会话域中的数据类型。
     */
    Class<?>[] types() default {};
}
1.9.2 示例
/**
* @author 刘淳
*/
@Controller
@SessionAttributes(value ={"username","password"},types={Integer.class})
public class SessionAttributesController {
    /**
     * 把数据存入SessionAttribute
     * Model是spring提供的一个接口,该接口有一个实现类ExtendedModelMap
     * 该类继承了ModelMap,而ModelMap就是LinkedHashMap子类
     */
    @RequestMapping("/testPut")
    public String testPut(Model model){
        model.addAttribute("username", "泰斯特");
        model.addAttribute("password","123456");
        model.addAttribute("age", 31);
        //跳转之前将数据保存到username、password和age中,因为注解@SessionAttribute中有这几个参数
        return "success";
    }
    
    @RequestMapping("/testGet")
    public String testGet(ModelMap model){
        System.out.println(model.get("username")+";"+model.get("password")+";"+model.get("age"));
        return "success";
    }
    
    @RequestMapping("/testClean")
    public String complete(SessionStatus sessionStatus){
        sessionStatus.setComplete();
        return "success";
    }
    
    @RequestMapping("/testSessionAttribute")
    public String testSessionAttribute(@SessionAttribute("username")String
    username){
        System.out.println("username is "+username);
        return "success";
    }
}

1.10 @ExceptionHandler

1.10.1 注解分析
/**
 * 用于注释方法,表明当前方法是控制器执行产生异常后的处理方法
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ExceptionHandler {
    /**
     * 指定用于需要捕获的异常类型
     */
    Class<? extends Throwable>[] value() default {};
}

2. JSON数据交互相关注解

2.1 @RequestBody

2.1.1 注解分析
/**
 * 用于获取全部的请求体
 */
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestBody {
    /**
     * 用于指定是否必须有请求体。
     */
    boolean required() default true;
}
2.1.2 示例
/**
 * @author 刘淳
 */
@Controller
public class RequestBodyController {
    /**
     * RequestBody注解
     */
    @RequestMapping("/useRequestBody")
    public String useRequestBody(@RequestBody(required=false) String body){
        System.out.println(body);
        return "success";
    }
}

2.2 @ResponseBody

2.2.1 注解分析
/**
 * 用于用流输出响应正文
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ResponseBody {
}
2.2.2 示例
/**
 * @author 刘淳
 */
@Controller
public class ResponseBodyController {
    /**
     * 控制器方法
     */
    @RequestMapping("useResponseBody")
    @ResponseBody
    public String useResponseBody(String name){
        return "success";
    }
}

2.3 @RestController

2.3.1 注解分析
/**
 * 它具备@Controller注解的全部功能,同时多了一个@ResponseBody注解的功能
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
    /**
     * 用于指定存入ioc容器时bean的唯一标识。
     * @since 4.0.1
     */
    @AliasFor(annotation = Controller.class)
    String value() default "";
}

2.4 @RestControllerAdvice

2.4.1 注解分析
/**
 * 它和@ControllerAdvice注解的作用一样,并且支持@ResponseBody的功能
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@ControllerAdvice
@ResponseBody
public @interface RestControllerAdvice {
    @AliasFor("basePackages")
    String[] value() default {};
    
    @AliasFor("value")
    String[] basePackages() default {};
    
    Class<?>[] basePackageClasses() default {};
    
    Class<?>[] assignableTypes() default {};
    
    Class<? extends Annotation>[] annotations() default {};
}

3. Rest风格URL请求相关注解

3.1 @PathVariable

3.1.1 说明
/**
 * 它是springmvc框架支持rest风格url的标识。
 * 它可以用于获取请求url映射中占位符对应的值。
 */
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface PathVariable {
    /**
     * 指定url映射中占位符的名称
     */
    @AliasFor("name")
    String value() default "";
    /**
     * 它是4.3.3版本新加入的属性。作用和value是一样的。
     * @since 4.3.3
     */
    @AliasFor("value")
    String name() default "";
    /**
     * 它是4.3.3版本新加入的属性,用于指定是否必须有此占位符。当取默认值时,没有会报错。
     * @since 4.3.3
     */
    boolean required() default true;
}
3.1.2 示例
/**
 * @author 刘淳
 */
@Controller
public class PathVariableController {
    /**
     * PathVariable注解
     * @return
     */
    @RequestMapping("/usePathVariable/{id}")
    public String usePathVariable(@PathVariable("id") Integer id){
        System.out.println(id);
        return "success";
    }
}

4.跨域访问

4.1 @CrossOrigin

4.1.1 作用
用于指定是否支持跨域访问
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@未安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值