美文网首页springmvc
SpringMVC-响应内容

SpringMVC-响应内容

作者: 任未然 | 来源:发表于2019-09-30 21:59 被阅读0次

一、@ResponseBody(重点)

1、作用

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

2、源码

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

3、栗子

导入包默认使用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;
    }
}

@Data
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;
}

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;
}

二、ModelAndView(了解)

1、作用

一般配合前后端不分离jsp技术中,用于封装需要响应到页面的数据和视图名字。常用使用在以下场景:

  • 实现后台与前端页面数据交互(jsp或thymeleaf)
  • 用于重定向与转发到指定页面
  • 将获取的数据存储对应的作用域中继而渲染到页面
    **注意: **一般要结合视图解析器类使用

2、核心概要

Model

Model 是一个接口, 其实现类为ExtendedModelMap,继承了ModelMap类。ModelMap又是LinkedHashMap的子类,可以用model来接收各种类型的数据,如果用来接收一组数据, 那么这个时候的model实际上是ModelMap。

view

对应视图的字符串,一般要配合ViewResolver视图转化器来使用

工作流程

当视图解释器解析ModelAndVIew是,其中model本生就是一个Map的实现类的子类。视图解析器将model中的每个元素都通过request.setAttribute(name, value);添加request请求域中。这样就可以在JSP页面中通过EL表达式来获取对应的值

3、常用api

ModelAndView

常见构造方法

构造方法 说明
ModelAndView() 无参构造方法
ModelAndView(String viewName) 不需要传递数据
ModelAndView(String viewName, Map model) 视图名称 将数据存储在Map中

常用的方法

方法返回值 说明
addAllObjects(Map map) 添加数据对象
addObject(Object modelObject) 添加数据对象
addObject(String key,Object obj) 添加键值对数据
void setViewName(String view) 设置映射的视图字符串
void setView(View view) 往ModelView中添加视图
clear() 清除此ModelAndView对象的状态。

更多api查看官方文档

Model

更多api查看官方文档

在配置文件中注册视图转化类

<bean id="ViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 视图文件的前缀 -->
    <property name="prefix" value="WEB-INF/page"></property>
     <!-- 视图文件的后缀名 -->
    <property name="suffix" value=".jsp" />
    <!-- view是用什么显示,这里是jsp,-->
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
</bean>

栗子

控制层

@Controller
public class ModelViewController {
    @RequestMapping("/index")
    public ModelAndView index() {
        ModelAndView mv = new ModelAndView();
        List<User> users = new ArrayList<>();
        User user = new User();
        // 添加集合
        mv.addObject(users);
        // 添加 pojo
        mv.addObject(user);
        mv.addObject("name", "admin");
        // 也可以通过 ModelMap
        // ModelMap modelMap = new ModelMap();
        // modelMap.addAttribute(users);
        // modelMap.addAttribute(user);
        //modelMap.addAttribute("name", "admin");
        // mv.addAllObjects(modelMap);
        return mv;
    }
}

jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<p>${requestScope.get("name")}</p>
</body>
</html>

三、字符串视图(了解)

1、说明

通过字符串返回对应的视图名字,配合@Controller
**注意: ** 不要使用@RestController,会返回字符串

2、栗子

控制层

@Controller
public class ModelViewController {
    @RequestMapping("/model")
    public String modelAndString(Model model) {
        model.addAttribute("name", "hello");
        return "hello";
    }
}

WEB-INF/jsp/hello.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<p>${requestScope.get("name")}</p>
</body>
</html>

四、重定向与转化(掌握)

1、重定向前缀(redirect:)

相当于”response.sendRedirect()”.这种方式外部特征就是浏览器地址栏最后显示的路径是转发后的新的路径

@Controller
public class ModelViewController {
    @RequestMapping("/redirect")
    public String redirect() {
        // 站内重定向
        return "redirect:/model";
        // 站内重定向带参数
        // return "redirect:/user/change/?uid=1"
        // 站外重定向
        // return "redirect:https://www.baidu.com";
        // 站外重定向带参数 后面用户名
        // return "redirect:https://api.github.com/users/zhangwei725"
        // 站外重定向带参数2
        // return "https://api.github.com/users/zhangwei725/repos?page=1&per_page=10"
    }
}

2、转发前缀(forward:)

相当于request.getRequestDispatcher().forward(request,response)。只能站内转化

@Controller
public class ModelViewController {
    @RequestMapping("/forward")
    public String testForward(Model model) {
        model.addAttribute("key", "转发");
        return "forward:index";
    }
}

相关文章

  • SpringMVC-响应内容

    一、@ResponseBody(重点) 1、作用 该注解用于将Controller的方法返回的对象,通过适当的Ht...

  • 7、SpringMVC-响应内容

    一、@ResponseBody(重点) 1、作用 该注解用于将Controller的方法返回的对象,通过适当的Ht...

  • SpringMVC

    SpringMVC-请求过程 请求离开浏览器。它会带有用户请求内容的信息,至少包含请求的URL(还可能有其他信息,...

  • python的requests库

    import requests 发送请求 传参 响应内容 二进制响应内容 JSON响应内容 原始响应内容 定制请求...

  • Requests库帮助文档快速直通车

    快速上手 发送请求 传递 URL 参数 响应内容 二进制响应内容 JSON 响应内容 原始响应内容 定制请求头 更...

  • SpringMVC-请求参数绑定原理

    控制层框架历史: Servlet->Structs1.0->Structs2.0->SpringMVC->Spri...

  • 3.2.3 响应内容

    在 HTTP 服务器与应用服务器处理完请求后, HTTP 响应会通过同一个 TCP socket 返回给客户端. ...

  • 个别请求头介绍及常用响应头介绍

    Referer请求头 响应协议 响应内容 相应协议格式如下:1、响应首行2、响应头信息3、空行4、响应体(相应内容...

  • Requests03.响应内容的几种形式(一)

    从服务端响应的内容大致可以有以下几种形式: 文本响应内容 文本响应内容在前文已经描述过,通过Response.te...

  • 【springmvc-完整篇】

    springmvc-完整篇 本文根据学习视频做的笔记,视频来源-Bilibili:尚硅谷SpringMVC实战教程...

网友评论

    本文标题:SpringMVC-响应内容

    本文链接:https://www.haomeiwen.com/subject/kmsxyctx.html