跳至主要內容

8. SpringMVC 的方法返回值/fastjson 使用/json 和 javabean 的转换

安图新大约 7 分钟

8. SpringMVC 的方法返回值/fastjson 使用/json 和 javabean 的转换

描述

我们知道,浏览器向服务器发起请求,携带数据,请求将其交给后台Controller等处理,处理完成之后,我们需要将处理结果和页面等内容返回到浏览器,但是这过程是怎么做到的呢,这篇文章描述的是后台向前台页面传输数据的方法

处理器返回值的类型

1. ModelAndView 返回数据和视图

ModelAndView是 SPringMVC 提供模型视图,在前后端不分离的情况下,这种用法是最多的,但是前后端分离后,以json数据格式为主。
  ModelAndView可以拆分理解,Model 就是数据模型,View 就是页面视图,就是同时包含模型和视图。

主要使用方法:

1、 通过addObject(key,value)设置数据,返回给前台;
2、 通过setViewName()设置逻辑视图,就是需要跳转返回到的页面路径(在 SpringMVC 中配合视图解析器使用【视图解析器自动加前后缀】,只要写名称就行);

@Controller
public class ReturnValueController {


    //public 返回值类型 方法名(参数类型 参数名){}
    //通过path访问当前方法,且请求方式为get/post方式
    @RequestMapping(path="ModelAndView.action",method = {

     RequestMethod.POST,RequestMethod.GET})
    public ModelAndView testModelAndView(){

     //
        User user= new Person(null,"striveday","123456");

        //使用ModelAndView实现请求转发
        ModelAndView mv = new ModelAndView();
        mv.addObject("user",user);
        mv.setViewName("ModelAndView");//视图解析器配置:前缀+逻辑视图名+后缀
        return mv;
    }
}

逻辑视图和物理视图概念:

物理视图 :是指真正的文件路径地址,在这里就是前缀+逻辑视图+后缀( /WEB-INF/jsp/ModelAndView.jsp)
逻辑视图: 页面的名称叫逻辑视图,并不是真正的页面地址,但是可以由视图解析器进行拼接,得到真正的页面地址,即物理视图。
物理视图 = 前缀+逻辑视图+后缀

2. String 返回逻辑视图

返回页面名称,也就是需要返回的页面路径(逻辑名)。
用这种方式也是可以进行携带数据(Model
  Model 可以用来向页面传递参数,通过在方法参数上注入Model,来实现携带数据。

model.addAttribute(“key”, value);

案例:

  @RequestMapping(path="testString.action",method = {

     RequestMethod.GET,RequestMethod.POST})
    public String testString(Model model){


        //Model 可以设置数据,自动由视图解析器带到页面
        model.addAttribute("data","String返回值");
        return "StringSuccess"; //逻辑视图 文件名
    }

  • 在 Spring MVC 框架中,控制器类中处理方法的return 语句默认就是请求转发实现,实现的是转发到视图。
  • ModelAndView 这些都是通过请求转发实现的。
String 返回可以设置请求转发和重定向

forward:指令,用于请求转发
redirect :指令,用于重定向

forward 指令:后面接物理视图
redirect 指令:后面接项目访问路径+物理视图

【注意 1***】forward:指令和redirect :指令,视图解析器是不对指令后面的内容拼接前缀和后缀的
【注意 2】指令也可以访问控制器方法

2.1 String 返回值,通过 forward 请求转发
@RequestMapping(path="testForward .action",method = {

     RequestMethod.GET,RequestMethod.POST})
    public String testForward (Model model){


        //Model 可以设置数据,自动由视图解析器带到页面
        model.addAttribute("data","wHelloWord");
        return "forward:/WEB-INF/jsp/success.jsp"; //
    }

2.2 String 返回值,通过 redirect 重定向

重定向是不能访问 WEB-INF

@RequestMapping(path="testRedirect.action",method = {

     RequestMethod.GET,RequestMethod.POST})
    public String testRedirect(Model model){


        //Model 可以设置数据,自动由视图解析器带到页面
        model.addAttribute("data","wHelloWord");
        //return "redirect:http://www.taobao.com"; //访问淘宝
        //return "redirect:success.jsp"; //重定向访问
        return "redirect:testForward .action"; //访问上面那个重定向方法,指令可以访问控制器方法
    }

3. void 返回值,不返回【springmvc 不推荐使用】

void返回值,进行页面跳转就是用以前的请求转发和重定向。只是以前重定向无法传输数据,现在可以通过Model来进行数据传输。关于请求转发实现可以看这个:请求转发和重定向代码实现
open in new window

@RequestMapping(path="testVoid.action",method = {

     RequestMethod.GET,RequestMethod.POST})
    public void testVoid(HttpServletRequest req, HttpServletResponse resp)throws Exception{


        //请求转发
        req.setAttribute("name","请求转发");
        req.getRequestDispatcher("testVoid.jsp").forward(req,resp);
        //response.sendRedirect(request.getContextPath()+"/testVoid.jsp");//重定向
    }

4. json 返回值为 json 数据,fastjson 使用【****】

现在都要求前后端分离,而前后端分离的关键是使用ajax请求,那么ajax请求基本都用json进行数据传递。
  SpringMVC 默认使用Jackson进行数据转换,这个我前面有写过,想了解的看这个:
===》 Jackson 使用,json 数据转换open in new window

好了,不打广告了哈哈哈,我们今天用的不是自带的Jackson哦,所以好好看吧。
   今天介绍的是阿里巴巴的fastjson,进行数据与 json 数据格式之间的转换。

=============== 分隔线 =====》》》》》》》》》
接下来对的是重点!!!
这里有两个很重要的注解:@ResponseBody@RequestBody
fastjson中我们需要用到这两个注解

@ResponseBody 和@RequestBody
  1. @ResponseBody注解,用于方法返回值转 json 数据格式

注解加在方法上,SpringMVC 可以【自动地】将方法的返回对象转为 json 数据,发送给页面进行展示。
看关键字自动的,敲黑板,很重要,这就是我们使用它的原因,毕竟,谁喜欢写代码弄来弄去还有 bug 呢,自动完成,赞!

  1. @RequestBody注解,用于方法参数转 json 数据格式

在方法形参的前边加上@RequestBody注解,该注解可以自动解析页面发送过来的json格式数据,解析完之后,自动的将 json 中的数据封装到方法形参对象里面(set 方法)。

好了来实战吧

4.1 环境准备(依赖)
     <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>fastjson</artifactId>
          <version>1.2.74</version>
      </dependency>

4.2 基础测试 fastjson

拿别人的东西总要先测试测试吧,万一有 bug 呢,虽然这是阿里巴巴的并且有贼多人使用,但是养成这个习惯,准没错!【学会没嘿嘿】
先创建一个小对象(我也想)

public class Person {


    private int id;
    private String username;
    private String password;
    //省略set/get方法,但是需要有
}

创建测试类,测试javabean转json和json转javabean

4.2.1 测试 javabean 对象转 json 数据格式

JSON.toJSONString(javabean对象):实现将 javabean 对象转 json 数据格式。

import com.alibaba.fastjson.JSON;
public class TestFastJson {


    @Test
    public void  test01(){


        Person p = new Person(1,"striveday","GF123456");
        String json  =  JSON.toJSONString(p);//调用静态方法toJSONString,参数传入对象 ,将对象转成json
        System.out.println(json);
    }
}

运行结果:
{“id”:1,“password”:“GF123456”,“username”:“striveday”}
转换成功!

4.2.2 测试 json 数据格式转 javabean 对象

JSON.parseObject(json数据, javabean的class):实现将 json 数据格式转换为 javabean 对象。

@Test
    public void  test02(){


        String json = "{\"id\":1,\"password\":\"GF123456\",\"username\":\"striveday\"}";//copy刚刚运行结果哈
        //json转javaBean,参1:json  参2:对象class类
        Person p = JSON.parseObject(json,Person.class);
        System.out.println(p);
    }

运行结果
Person{id=1, username=‘striveday’, password=‘GF123456’, city=‘null’, birthday=null, birthday2=null}
这里需要重写 javabean 的 toString()方法,不然输出的是哈希值哟。

好的,妥妥的没问题,测一下也不花多少时间嘛,这个习惯总时好的!

4.3 @ResponseBody 注解

@ResponseBody注解用于方法返回值转 json 数据格式
该注解加在方法上,SpringMVC 可以【自动地】将方法的返回对象转为 json 数据,发送给页面进行展示。

@ResponseBody注解用于将 Controller 的方法返回的对象,通过适当的 HttpMessageConverter 转换为指定要求格式后,写入到 Response 对象的 body 数据区。(一般是 json、xml 等数据格式)

 @RequestMapping(path = "testResponseBody.action",method = {

     RequestMethod.POST,RequestMethod.GET})
    @ResponseBody
    public Object testResponseBody(){


        Person p1 = new Person(1,"striveday","GF123456");
        Person p2 = new Person(2,"studyday","GF123456");
        List<Person> list = new ArrayList<Person>();
        list.add(p1);
        list.add(p2);
        return list; //springmvc自动地将list使用ObjectMapper转成json
    }

4.4 @RequestBody 注解

@RequestBody注解,用于方法参数转 json 数据格式
在方法形参的前边加上@RequestBody注解,该注解可以自动解析页面发送过来的json格式数据,解析完之后,自动的将 json 中的数据封装到方法形参对象里面(set 方法)

其实 @RequestBody注解就是读取 request 请求中的 body 数据,然后使用系统默认配置的HttpMessageConverter进行解析,再把相应的数据绑定到请求作用域中传递给后台 controller 方法,然后参数自动绑定到 Controller 方法的参数上(实现方法返回值对象转 json 数据格式,所以页面 name 值和 controller 形式参数名称要相同)

 @RequestMapping(path = "testRequestBody.action",method = {

     RequestMethod.POST,RequestMethod.GET})
    public ModelAndView  testRequestBody(@RequestBody  Person person){

     //
       System.out.println("object:"+person);
       return null;
    }

上次编辑于:
贡献者: Andy