文章目录
- 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. 返回字符串形式
直接返回字符串:此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转。
返回带有前缀的字符串:
转发:forward:/WEB-INF/views/index.jsp
重定向:redirect:/index.jsp
(转发前边的forward:可以省略,主要是下边的重定向是代表客户端再次访问,再次请求,而/WEB-INF属于一个受保护的一个目录,外界是不能直接访问到/WEB-INF的,所以你重定向的资源必须处在一个可以有权限被访问的位置)2. 返回ModelAndView对象
(这个ModelAndView中Model代表模型,View代表视图,我们可以在我们的业务方法当中的返回值,不返回字符串,而是返回一个ModelAndView ,那么可能在返回视图给页面的时候不携带数据,也是有可能的,如果想只给页面一个视图,那么就可以来设置视图)
把项目运行起来,发现同样是可以的👇:
那么我们创建的ModelAndView设置完了视图,但是Model还是空的,那么我们也可以给Model设置一些数据,利用addObject方法,参数也是键值对的形式,设置完这个数据就相当于放到request域中了👇:
接着就可以在success.jsp中使用EL表达式取出来,
重新启动服务器后访问,发现是可以获取到数据的👇:
返回ModelAndView对象,除了刚刚写的那种方式,还有第2种方式。传参的方式👇:
重新启动服务器后访问,发现同样也是可以的👇:
(那么这种方式的意思就是,SpringMVC它对它对应的方法的参数可以帮你进行相应的注入,比如现在写的ModelAndView,它在解析这个方法的时候发现有一个ModelAndView需要我SpringMVC框架提供,那这个SpringMVC就为你提供一个ModelAndView对象,那么自然就是可以直接用了)那么还有第三种方式就是,返回值仍然改为String,然后直接返回视图的字符串名称,然后参数加一个Model,就可以利用Model对象机进行数据的封装👇:
重新启动服务器后访问,发现同样也是可以的👇:
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帮产生的,这种方式也可以,但是这种方式不常用,既然用框架了,就应该尽可能使用框架为我们提供的对象。可以更好的解耦。所以这种方式了解即可)
重新启动服务器后访问,发现同样也是可以的👇:
2️⃣:通过ModelAndView的addObject()方法设置(前边的就是)
1.3 回写数据
1. 直接返回字符串
Web基础阶段,客户端访问服务器端,如果想直接回写字符串作为响应体返回的话,只需要使用response.getWriter().print(“hello world”) 即可,那么在Controller中想直接回写字符串该怎样呢?
1️⃣:通过SpringMVC框架注入的response对象,使用response.getWriter().print(“hello world”) 回写数据,此时不需要视图跳转,业务方法返回值为void。
重新启动服务器后访问,结果如下👇:
2️⃣:将需要回写的字符串直接返回,但此时需要通过 @ResponseBody 注解告知SpringMVC框架,方法返回的字符串不是跳转是直接在http响应体中返回。
(加上@ResponseBody注解就意味着就告知SpringMVC框架,不要进行页面跳转,而是直接数据回写,和之前那个直接return “success” 加以区分,不加这个这个注解就会默认去跟前缀和后缀拼接成一个资源名)
重新启动服务器后访问,结果如下👇:
在异步项目中,客户端与服务器端往往要进行json格式字符串交互,此时我们可以手动拼接json字符串返回。
(那么我们在返回字符串时,往往不会返回这种字符串,而是返回有用的一定格式的,比如json格式的。这种应用场景非常多,ajax异步访问时,服务器端一般都要返回一个json格式的字符串)
那么首先可以用最笨的方式直接手动拼接👇:
重新启动服务器后访问,结果如下👇:
上述方式手动拼接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>
接着就可以来使用了👇:
重新启动服务器后访问,结果如下👇:
(其实上边转json的工作还是比较繁琐的,每次不管你是普通对象,还是一个集合,都得写那句创建objectMapper的语句,想这种重复的工作,SpringMVC框架肯定是帮我封装了,那么我们就不要手动去转了,直接给一个对象就可以了。我们只需要去配置即可 )
代码只需要这么写👇:
虽然我们返回的user对象,但是我们的期望是SpringMVC框架自动地将User转化成json格式的字符串。想要它自动转,那就得告诉框架,它才知道,所以要去配置,那么配谁呢,访问这个方法的时候,返回的是一个user,那么调用这个UserController的过程是其中的一个组件适配器,和之前配置内部资源解视图析器一样,可以对里边的方法进行干预然后增强
那么配置上了,只要传个user,它就能帮你转,但要@ResponseBody仍然要写的,它代表的是直接返回不进行跳转,这个对象转化后也是个字符串。所以要留着
重新启动服务器后访问,结果如下👇:
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的命名空间,所以需要进行引入👇:
接着把原先的注释掉,然后进行mvc的注解启动配置👇:
重新启动服务器后访问,结果如下👇:
1.4 知识要点
SpringMVC的数据响应方式
1) 页面跳转
● 直接返回字符串
● 通过ModelAndView对象返回
2) 回写数据
● 直接返回字符串
● 返回对象或集合