文章目录

  • 1. SpringMVC的数据响应
  • 1.1 SpringMVC的数据响应方式
  • 1.2 页面跳转
  • 1.3 回写数据
  • 1.4 知识要点



🚴大家好!我是近视的脚踏实地,后边这系列是自己自学Spring框架的学习笔记,这篇文章学习关于SpringMVC 的数据响应的 相关知识
     唯有行动  才能解除你所有的不安

1. SpringMVC的数据响应

1.1 SpringMVC的数据响应方式

(那么数据响应的方式有两种,一种是页面跳转,那么页面跳转就是我们在访问服务端的时候,访问web层SpringMVC的时候,这个controller内部进行相应的操作之后往往要进行一个视图展示,就意味这我们要进行一个页面跳转。除了页面跳转之外,有些需求我们在访问时,它可能会直接给我们回写一个数据。比如在之前的web基础,如果最终web层,帮我们进行相应的操作之后,我们就要进行一个页面的展示,此时就可能要进行一个转发和重定向,如果是转发,就是通过request.getrequestdispatcher.forward的方式进行转发,如果是重定向,就通过response.sendRedirect进行重定向,现在学的SpringMVC,可以发现它是比较简单的。除了页面跳转之外,在web阶段也有回写数据,比如访问服务器端,可能要给客户端返回一些字符串,或回写一个数字等等,然后把字符和数字在页面进行相应的展示。 )
1) 页面跳转
    ● 直接返回字符串
(这个方式在做快速入门的时候也遇到过,比如说访问controller中的一个方法,这个方法最终给我们返回一个success.jsp ,就意味着我们要转发到success.jsp这个页面,这是直接返回字符串的形式)
    ● 通过ModelAndView对象返回
(ModelAndView在我们学习SpringMVC组件的时候,其中有一步就是最终返回的就是ModelAndView,然后对这个ModelAndView通过内部资源解析器来进行解析,然后解析出一个view对象,然后在进行渲染,最后返回给客户端)
2) 回写数据
    ● 直接返回字符串
(这种方式就相当于我们在web阶段的response.getWriter.print。就是将字符串直接回写给页面)
    ● 返回对象或集合
(返回对象或集合是有对应的应用场景的,比如说在之前web阶段如果ajax去访问服务端的话,一般服务端回写的是json格式的字符串。java操作一般是对象或者集合,如果是回写字符串的话,就是通过一个json转换的工具,比如说jackson,先转换成一个json格式的字符串,再response.getWriter.print回写。因为这种操作是比较频繁的,所以这个SpringMVC,它帮我们集成了一些东西,集成完之后,我们直接在方法上返回一个对象或者集合,只要加上一个@ResponseBody的注解,那么最终SpringMVC就会帮我们把对象的集合转成json串,直接给我们回写,还是非常方便的)

1.2 页面跳转

1. 返回字符串形式

直接返回字符串:此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转。

springdoc响应状态码 springmvc数据响应_MVC


返回带有前缀的字符串:

转发:forward:/WEB-INF/views/index.jsp 重定向:redirect:/index.jsp

(转发前边的forward:可以省略,主要是下边的重定向是代表客户端再次访问,再次请求,而/WEB-INF属于一个受保护的一个目录,外界是不能直接访问到/WEB-INF的,所以你重定向的资源必须处在一个可以有权限被访问的位置)2. 返回ModelAndView对象

(这个ModelAndView中Model代表模型,View代表视图,我们可以在我们的业务方法当中的返回值,不返回字符串,而是返回一个ModelAndView ,那么可能在返回视图给页面的时候不携带数据,也是有可能的,如果想只给页面一个视图,那么就可以来设置视图)

springdoc响应状态码 springmvc数据响应_字符串_02


把项目运行起来,发现同样是可以的👇:

springdoc响应状态码 springmvc数据响应_字符串_03


那么我们创建的ModelAndView设置完了视图,但是Model还是空的,那么我们也可以给Model设置一些数据,利用addObject方法,参数也是键值对的形式,设置完这个数据就相当于放到request域中了👇:

springdoc响应状态码 springmvc数据响应_数据_04


接着就可以在success.jsp中使用EL表达式取出来,

springdoc响应状态码 springmvc数据响应_springdoc响应状态码_05


重新启动服务器后访问,发现是可以获取到数据的👇:

springdoc响应状态码 springmvc数据响应_MVC_06

返回ModelAndView对象,除了刚刚写的那种方式,还有第2种方式。传参的方式👇:

springdoc响应状态码 springmvc数据响应_MVC_07


重新启动服务器后访问,发现同样也是可以的👇:

springdoc响应状态码 springmvc数据响应_springdoc响应状态码_08


(那么这种方式的意思就是,SpringMVC它对它对应的方法的参数可以帮你进行相应的注入,比如现在写的ModelAndView,它在解析这个方法的时候发现有一个ModelAndView需要我SpringMVC框架提供,那这个SpringMVC就为你提供一个ModelAndView对象,那么自然就是可以直接用了)那么还有第三种方式就是,返回值仍然改为String,然后直接返回视图的字符串名称,然后参数加一个Model,就可以利用Model对象机进行数据的封装👇:

springdoc响应状态码 springmvc数据响应_MVC_09


重新启动服务器后访问,发现同样也是可以的👇:

springdoc响应状态码 springmvc数据响应_springdoc响应状态码_10

3. 向request域存储数据
在进行转发时,往往要向request域中存储数据,在jsp页面中显示,那么Controller中怎样向request域中存储数据呢?
(那么前边玩了两种参数的形式,里边的save方法最终都是SpringMVC帮我们调用的,你在参数中写的是Model形参的话,那么SpringMVC在调用这个方法时,就会给你传个实际的Model对象,然后内部就可以使用了,如果形参是ModelAndView,那么SpringMVC在调用这个方法时,就给你传递一个ModelAndView对象给我们使用。那么如果现在我们想用原始的方式,往域当中存数据,就是使用request对象,然后使用request.setAttribute就可以往request域中存数据。同样的道理,可以直接把这个对象的参数写上,Spring在调用的时候就会帮忙注入,我们直接使用就可以了)

1️⃣:通过SpringMVC框架注入的request对象setAttribute()方法设置

(这种方式和那种Model方式差不多,Model是SpringMVC帮我们封装好的对象,这个request就是javaWeb原生的,Tomcat帮产生的,这种方式也可以,但是这种方式不常用,既然用框架了,就应该尽可能使用框架为我们提供的对象。可以更好的解耦。所以这种方式了解即可)

springdoc响应状态码 springmvc数据响应_MVC_11


重新启动服务器后访问,发现同样也是可以的👇:

springdoc响应状态码 springmvc数据响应_springdoc响应状态码_12

2️⃣:通过ModelAndView的addObject()方法设置(前边的就是)

1.3 回写数据

1. 直接返回字符串

Web基础阶段,客户端访问服务器端,如果想直接回写字符串作为响应体返回的话,只需要使用response.getWriter().print(“hello world”) 即可,那么在Controller中想直接回写字符串该怎样呢?

1️⃣:通过SpringMVC框架注入的response对象,使用response.getWriter().print(“hello world”) 回写数据,此时不需要视图跳转,业务方法返回值为void。

springdoc响应状态码 springmvc数据响应_springdoc响应状态码_13


重新启动服务器后访问,结果如下👇:

springdoc响应状态码 springmvc数据响应_MVC_14

2️⃣:将需要回写的字符串直接返回,但此时需要通过 @ResponseBody 注解告知SpringMVC框架,方法返回的字符串不是跳转是直接在http响应体中返回

(加上@ResponseBody注解就意味着就告知SpringMVC框架,不要进行页面跳转,而是直接数据回写,和之前那个直接return “success” 加以区分,不加这个这个注解就会默认去跟前缀和后缀拼接成一个资源名)

springdoc响应状态码 springmvc数据响应_数据_15


重新启动服务器后访问,结果如下👇:

springdoc响应状态码 springmvc数据响应_字符串_16


在异步项目中,客户端与服务器端往往要进行json格式字符串交互,此时我们可以手动拼接json字符串返回。

(那么我们在返回字符串时,往往不会返回这种字符串,而是返回有用的一定格式的,比如json格式的。这种应用场景非常多,ajax异步访问时,服务器端一般都要返回一个json格式的字符串)

那么首先可以用最笨的方式直接手动拼接👇:

springdoc响应状态码 springmvc数据响应_字符串_17


重新启动服务器后访问,结果如下👇:

springdoc响应状态码 springmvc数据响应_字符串_18


上述方式手动拼接json格式字符串的方式很麻烦,开发中往往要将复杂的java对象转换成json格式的字符串,我们可以使用web阶段学习过的json转换工具jackson进行转换,导入jackson坐标。

那么明显这种方式捞得不能再捞了,那么我们可以通过第三方转化工具,jackson。那么先创建一个User 实体类👇:

public class User implements Serializable {

    private String username;
    private int age;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", age=" + age +
                '}';
    }
}

接着来导入jackson坐标。

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

接着就可以来使用了👇:

springdoc响应状态码 springmvc数据响应_MVC_19


重新启动服务器后访问,结果如下👇:

springdoc响应状态码 springmvc数据响应_字符串_20

(其实上边转json的工作还是比较繁琐的,每次不管你是普通对象,还是一个集合,都得写那句创建objectMapper的语句,想这种重复的工作,SpringMVC框架肯定是帮我封装了,那么我们就不要手动去转了,直接给一个对象就可以了。我们只需要去配置即可 )

代码只需要这么写👇:

springdoc响应状态码 springmvc数据响应_MVC_21

虽然我们返回的user对象,但是我们的期望是SpringMVC框架自动地将User转化成json格式的字符串。想要它自动转,那就得告诉框架,它才知道,所以要去配置,那么配谁呢,访问这个方法的时候,返回的是一个user,那么调用这个UserController的过程是其中的一个组件适配器,和之前配置内部资源解视图析器一样,可以对里边的方法进行干预然后增强

springdoc响应状态码 springmvc数据响应_springdoc响应状态码_22

那么配置上了,只要传个user,它就能帮你转,但要@ResponseBody仍然要写的,它代表的是直接返回不进行跳转,这个对象转化后也是个字符串。所以要留着

重新启动服务器后访问,结果如下👇:

springdoc响应状态码 springmvc数据响应_字符串_23


2. 返回对象或集合

(返回对象或集合还有一个细节点,刚刚在spring-mvc配置文件中配置了处理器的映射器,主要配的参数,注入jackson的转换器,然后在返回对象或者集合的时候,就不需要我们去把对象或集合转换成json数据格式,但是这种配置相对而言还是比较繁琐的,比较麻烦的。那么我可以通过mvc的一个注解可以帮忙我们进行配置,就是写了那面那个配置,那么刚才那段繁琐的配置就不用再配了。)

在方法上添加@ResponseBody就可以返回json格式的字符串,但是这样配置比较麻烦,配置的代码比较多,因此,我们可以使用mvc的注解驱动代替上述配置。

<!--mvc的注解驱动-->
<mvc:annotation-driven/>

在 SpringMVC 的各个组件中,处理器映射器处理器适配器视图解析器称为 SpringMVC 的三大组件。
使用<mvc:annotation-driven>自动加载 RequestMappingHandlerMapping(处理映射器)和RequestMappingHandlerAdapter( 处 理 适 配 器 ),可用在Spring-xml.xml配置文件中使用
<mvc:annotation-driven>替代注解处理器和适配器的配置。
同时使用<mvc:annotation-driven>默认底层就会集成jackson进行对象或集合的json格式字符串的转换。

首先需要用到mvc的命名空间,所以需要进行引入👇:

springdoc响应状态码 springmvc数据响应_字符串_24


接着把原先的注释掉,然后进行mvc的注解启动配置👇:

springdoc响应状态码 springmvc数据响应_MVC_25

重新启动服务器后访问,结果如下👇:

springdoc响应状态码 springmvc数据响应_springdoc响应状态码_26

1.4 知识要点

SpringMVC的数据响应方式
1) 页面跳转
    ● 直接返回字符串
    ● 通过ModelAndView对象返回

2) 回写数据
    ● 直接返回字符串
    ● 返回对象或集合