springmvc

Spring-mvc常用注解

2019-08-16  本文已影响0人  任未然

一、@RestController

作用

负责注册一个bean 到spring 上下文中

源码

@Target(ElementType.TYPE)//修饰类
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
    @AliasFor(annotation = Controller.class)
    String value() default "";
}

栗子

@RestController  
public class UserController{
}  

二、@RequestMapping(重点)

作用

这个注解主要作用其实就是一个路径.专业名字叫关系映射.他一般用于 Controller 的类与某个方法中

源码

@Target({ElementType.TYPE, ElementType.METHOD})
@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 {};
}

参数说明

参数 说明
String[] value() (重点)指定请求的实际地址,指定的地址可以是URI Template 模式 等同path
RequestMethod[] method() (重点)指定请求的method类型, RequestMethod.GET、RequestMethod.POST、RequestMethod.PUT、RequestMethod.DELETE等;
String[]consumes 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
String[] produces 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
String[] params() (掌握)指定限制请求参数的条件。支持简单的表达式。就是请求地址上的key=value
String[] headers() 指定request中必须包含某些指定的header值,才能让该方法处理请求;

http中八种请求

请求方式 说明
GET 请求指定的页面信息,并返回实体主体。
HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT 从客户端向服务器传送的数据取代指定的文档的内容。
DELETE 请求服务器删除指定的页面。
OPTIONS 允许客户端查看服务器的性能。
TRACE 回显服务器收到的请求,主要用于测试或诊断。
PATCH 实体中包含一个表,表中说明与该URI所表示的原内容的区别

使用说明

如果使用在上。就相当于应用的根路径。他的主要作用是为了使我们的 URL 可以按照模块化管理(restful):

商品模块
/shop/add
/shop/update
...
/order/list
/order/add

如果使用在方法上。相当于二级请求地址

栗子

在类和方法上使用

@RestController
@RequestMapping("/account")
public class AccountController {
    //  访问地址  /account/login
    @RequestMapping("/login")
    public String login() {
        return "登录";
    }
}

method属性

@RestController
@RequestMapping("/account")
public class AccountController {
    // 只允许post请求访问
    @RequestMapping(value = "/register", method =RequestMethod.POST)
    public String register() {
        return "注册";
    }
        // 允许 GET请求 POST请求访问
    @RequestMapping(value = "/register", method = {RequestMethod.GET,RequestMethod.POST})
    public String register1() {
        return "注册";
    }
}

params属性

@RestController
@RequestMapping("/account")
public class AccountController {
    // 参数中必须包含 id,balance 并且 余额大于0.00
    @RequestMapping(value = "/update", method = RequestMethod.POST, params = {"id", "balance>0.00"})
    public String update() {
        return "修改成功";
    }
}

三、@RequestBody

作用

该注解用于读取Request请求的body部分数据(get请求没有请求体,所以不能使用)

源码

@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface RequestBody {
    boolean required() default true;
}

属性

参数 说明
boolean required() 是否必须有请求体。默认值是:true。当取值为 true 时,

栗子

@RestController
@RequestMapping("/body")
public class RequestBodyController {
    @RequestMapping(value = "/test1", method = RequestMethod.POST)
    public String method1(@RequestBody String name) {
        System.out.println(name);
        return "请求体参数";
    }
}

四、@ResponseBody

作用

该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后

源码

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ResponseBody {
}

属性

栗子

导入包默认使用jackson转化

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.9.5</version>
</dependency>

集成fastjson

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.58</version>
</dependency>

配置转化器

<!-- 设置配置方案 -->
  <mvc:annotation-driven>
        <!-- 消息转化器  -->
        <mvc:message-converters register-defaults="false">
            <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <!-- 加入支持的媒体类型:返回contentType -->
                <property name="supportedMediaTypes">
                    <list>
                        <!-- 这里顺序不能反,一定先写text/html,不然IE下会出现下载提示 -->
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json;charset=UTF-8</value>
                    </list>
                </property>
                <property name="fastJsonConfig">
                    <bean class="com.alibaba.fastjson.support.config.FastJsonConfig">
                        <property name="features">
                            <list>
                                <value>AllowArbitraryCommas</value>
                                <value>AllowUnQuotedFieldNames</value>
                                <value>DisableCircularReferenceDetect</value>
                            </list>
                        </property>
                        <!--配置特定的日期格式-->
                        <property name="dateFormat" value="yyyy-MM-dd HH:mm:ss"/>
                    </bean>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
@Controller
public class ResponseBodyController {
    @RequestMapping("/body")
    @ResponseBody
    public Shop testResponseBody() {
        Shop shop = new Shop();
        shop.setShopId(1);
        shop.setName("娃娃");
        shop.setTitle("白天么么哒,晚上怕怕怕");
        return shop;
    }
}
public class Shop implements Serializable {
    private Integer shopId;
    private String name;
    @JSONField
    private String title;
    @JSONField(format = "yyyy-MM-dd HH:mm:ss")
    private Date createDate;

    public Integer getShopId() {
        return shopId;
    }

    public void setShopId(Integer shopId) {
        this.shopId = shopId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public Date getCreateDate() {
        return createDate;
    }

    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }
}

JSONField

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER })
public @interface JSONField {
// 配置序列化和反序列化的顺序,1.1.42版本之后才⽀持
int ordinal() default 0;
// 指定序列化字段的名称
String name() default "";
// 指定字段的格式,对⽇期格式有⽤
String format() default "";
// 是否序列化
boolean serialize() default true;
// 是否反序列化
boolean deserialize() default true;
}

五、@RequestParam

作用

在处理方法入参处使用 @RequestParam 可以把请求参数传递给请求方法

源码

@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {
    @AliasFor("name")
    String value() default "";
    @AliasFor("value")
    String name() default "";
    boolean required() default true;
    String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}

属性

属性 说明
String value() 请求参数中的名称
boolean required() 请求参数中是否必须提供此参数。默认值:true。表示必须提供,如果不提供将报错。
String defaultValue() 提供默认值

栗子

给参数起别名

@Controller
@RequestMapping("/params")
public class RequestParamController {
    @RequestMapping("/test1")
    public String method1(@RequestParam(value = "name") String username) {
        System.out.println(username);
        return "参数别名"
    }
}
//请求地址 /params/test1?name='乔碧萝殿下'

使用默认值参数

@RestController
@RequestMapping("/params")
public class RequestParamController {
    // 请求地址  /params/test2?page=1 或者/params/test2?page=1&size=10
    @RequestMapping("/test2")
    public String method2(@RequestParam(value = "page", defaultValue = "1") int page ,
                          @RequestParam(value = "size",required = false,defaultValue = "10") int size) {
        System.out.println(page);
        System.out.println(size);
        return "使用默认值参数+可选参数";
    }
}

六、@PathVariable

作用

用于绑定 url 中的占位符。例如:请求 url 中 /list/{page},这个{page}就是 url 占位符。url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志。

源码

@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface PathVariable {
    @AliasFor("name")
    String value() default "";
    @AliasFor("value")
    String name() default "";
    boolean required() default true;
}

属性

属性 说明
String value() 用于指定 url 中占位符名称。
boolean required() 是否必须提供占位符。

栗子

@Controller
public class PathController {
    @RequestMapping("/path/{page}/{size}")
    public String pathTest(@PathVariable(value = "page") int page, @PathVariable String size) {
        System.out.println(page);
        System.out.println(size);
        return "动态路径匹配";
    }
}

七、@ModelAttribute

作用

在方法定义上使用 @ModelAttribute 注解:Spring MVC 在调用目标处理方法前,会先逐个调用在方法级上标注了@ModelAttribute 的方法

在方法的入参前使用 @ModelAttribute 注解:可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数 –绑定到对象中,再传入入参将方法入参对象添加到模型中

、InitBinder

绑定时间格式

、@RestController

作用

是@Controller和@ResponseBody的合集

、@GetMapping:

作用

是@RequestMapping(method = RequestMethod.GET)的缩写。不支持@RequestMapping的自定义属性。

、@PostMapping

作用

是@RequestMapping(method = RequestMethod.POST)的缩写。不支持@RequestMapping的自定义属性。

上一篇下一篇

猜你喜欢

热点阅读