Spring Web MVC(2)

响应

Http响应的结果可以是数据也可以是静态页面可以针对响应设置状态码 Header信息

返回静态页面注解@RestController和@Controller

我们创建一个前端页面

java 复制代码
package com.example.demo.demos.web.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ReturnController {
    @RequestMapping("index")
    public Object index(){
        return "index.html";
    }
}

当我们发起请求时发现页面返回的是一个字符串而不是刚刚的html静态界面

这时我们需要把注解@RestController 改成 注解@Controller就能正确返回想要显示的静态界面了

@Responsebody返回数据:定义返回的数据格式为⾮视图,返回⼀个text/html信息

@Controlle返回试图:定义⼀个控制器,Spring框架启动时加载,把这个对象交给Spring管理

@RestController=@Controlle+@Responsebody

但是随着MVC的概念发生变化View不再返回视图而是返回显示试图时需要的数据

我们可以查看@RestController的源码

java 复制代码
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
    @AliasFor(
        annotation = Controller.class
    )
    String value() default "";
}

其中这三个是元注解

@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME)

@Documented

@Target这个注解的作用是表示注解修饰的对象

@Retention表示注解的生命周期

@Documented表示在使用 javadoc 工具为类生成帮助文档时是否要保留其注解信息。

@Controller

@ResponseBody

这表示注解@RestController由这两个注解组成

返回数据注解@ResponseBody

可以修饰类也可以修饰方法

修饰类的时候表示这个类下的所有方法返回的都是数据

修饰方法时表示该方法返回的是数据

java 复制代码
@RequestMapping("/return")
@Controller
public class ReturnController {
    @RequestMapping("/index")
    public Object index(){
        return "index.html";
    }

    @RequestMapping("/returnData")
    @ResponseBody
    public String returnData(){
        return "返回数据";
    }


}

也可以返回Html片段

java 复制代码
@RequestMapping("/return")
@Controller
public class ReturnController {
    @RequestMapping("/index")
    public Object index(){
        return "index.html";
    }

    @RequestMapping("/returnData")
    @ResponseBody
    public String returnData(){
        return "返回数据";
    }
    @RequestMapping("/returnHtml")
    @ResponseBody
    public String returnHtml(){
        return "<h1>返回Html代码片段<h1>";
    }

}

返回JSON

当我们返回接口的是String是conten-Type就是text/html

当我们返回接口时对象时这个注解就会自动设置为application/json Map

java 复制代码
@RequestMapping("/returnJson")
    @ResponseBody
    public Person returnJson(){
        Person person = new Person();
        person.setAge(18);
        person.setId(2021);
        person.setName("张三");
        return person;
    }
java 复制代码
@RequestMapping("returnMap")
    @ResponseBody
    public Map<String,String> returnMap(){
        Map<String,String> kv = new HashMap<>();
        kv.put("k1","k1");
        kv.put("k2","k2");
        kv.put("k3","k3");
        return kv;
    }

可以看到回自动定义为json格式



设置状态码

java 复制代码
@RequestMapping("setStatus")
    @ResponseBody
    public String setStatus(HttpServletResponse response){
        response.setStatus(401);
        return "设置状态码";
    }

通常是200但是这里设置为401

状态码不影响页面显示

设置Header

我们可以通过@RequestMapping注解来实现http报头传递一些附加信息

比如

我们查看@RequestMapping的源码

java 复制代码
@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 {};
}

value: 指定映射的URL method:指定请求的method类型,如GET,POST等

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

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

Params:设置request(响应)中必须包含某些参数值时,才让该⽅法处理

headers:

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

设置其他Header

java 复制代码
@RequestMapping(value = "/r1" , produces = "application/json;charset=utf-8")
    @ResponseBody
    public String r1(HttpServletResponse response){
        //设置header
        response.setHeader("myhead","myhead");
        return "{'OK':1}";
    }


相关推荐
EndingCoder11 分钟前
React从基础入门到高级实战:React 实战项目 - 项目一:在线待办事项应用
前端·javascript·react.js·前端框架
lyc23333312 分钟前
鸿蒙提醒管理:让通知「聪明又贴心」的3个技巧📢
前端
PasserbyX13 分钟前
cookie与广告追踪!
前端
lyc23333313 分钟前
鸿蒙断点适配:让应用「随屏而变」的终极指南📱💻
前端
JacksonGao14 分钟前
React Fiber的优先级系统你知道多少?
前端·react.js
PasserbyX16 分钟前
图说CSRF攻击
前端
lyc23333317 分钟前
鸿蒙文件分享:安全交换的「双车道」指南📤
前端
月下点灯33 分钟前
使用Set集合新特性,快速实现一个商品SKU(单品)规格选择器
前端·javascript·vue.js
大侠Luffy34 分钟前
做了这些SEO动作,独立开发的网站开始被搜索引擎逐量收录
前端·seo
四棱子41 分钟前
炫酷!18.5kb实现流体动画,这个开源项目让个人主页瞬间高大上!
前端·开源