描述

  我们知道,浏览器向服务器发起请求,携带数据,请求将其交给后台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来进行数据传输。关于请求转发实现可以看这个:请求转发和重定向代码实现

@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数据转换

  好了,不打广告了哈哈哈,我们今天用的不是自带的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;
    }


GitHub 加速计划 / fastj / fastjson
25.69 K
6.51 K
下载
FASTJSON 2.0.x has been released, faster and more secure, recommend you upgrade.
最近提交(Master分支:3 个月前 )
c942c834 - 1 年前
5bc4709b - 1 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐