SpringMVC学习笔记4——关于返回值

4.1 返回值

一、ModelAndView

当处理器处理完后,需要返回数据和跳转页面,用ModelAndView是最合适的,相关用法我们笔记3中有使用到,这样不再赘述了

二、String


控制方法
@RequestMapping(value = "/returnString-view.do" )
    public String doReturnView(HttpServletRequest request,String name,Integer age){
        request.setAttribute("name",name);
        request.setAttribute("age",age);
        //show:逻辑视图名称,项目中需要配置视图解析器
        //框架对视图执行forward转发操作
        return "show";
    }

处理器方法返回String–表示逻辑视图名称,需要配置视图解析器;如果我们用的是完整的视图路径的话,记得要把视图解析器的配置给去掉,不然路径会重叠,到时候就会报404了


三、void(少用,了解即可)

void不能表示数据,也不能表示视图;在成功优酷ajax时可以使用viod返回值,通过HttpServletResponse输出数据,相应ajax请求;ajax请求服务端返回的就是数据,和视图无关

先在项目中加入jquery

index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title
    
    


        

处理器返回string,表示视图名称

姓名: 年龄:

控制方法
@RequestMapping(value = "/returnVoid-ajax.do" )
    public void doReturnViewAjax(HttpServletResponse response,String name,Integer age) throws IOException {
        System.out.println("doReturnViewAjax,name="+name+",age="+name);
        //处理ajax,使用json做数据的格式
        //service调用完成了,使用Student表示处理结果
        Student student=new Student();
        student.setName(name);
        student.setAge(age);

        String json="";
        //b啊结果的对象转为json格式的数据
        if(student != null){
            ObjectMapper om=new ObjectMapper();
            json=om.writeValueAsString(student);
            System.out.println("student转换的json===="+json);
        }

        //输出数据,相应ajax的请求
        response.setContentType("application/json;charset=:utf-8");
        PrintWriter pw=response.getWriter();
        pw.println(json);
        pw.flush();
        pw.close();


    }
测试结果

SpringMVC学习笔记4——关于返回值_第1张图片
ajax我都没学过。。。。这个部分我也很懵,将就着看吧

四、Object

处理器方法也可以返回Object对象。这个Object可以是Integer,String,自定义对象,Map,List等。但返回的对象不是作为逻辑视图出现的,而是作为直接在页面显示的数据出现的。返回对象,需要使用@ResponseBody 注解,将转换后的 JSON 数据放入到响应体中。springmvc处理器方法返回object,可以转为json输出到浏览器,相应ajax的内部原理

实现步骤
  1. 加入处理json的工具库依赖,springmvc默认使用jackson

    
    com.fasterxml.jackson.core
    jackson-core
    2.9.0
    
    
    com.fasterxml.jackson.core
    jackson-databind
    2.9.0
    
    
  2. 在springmvc配置文件中加入注解驱动

    这一步相当完成了json=om.writeValueAsString(student); 所实现的功能是:完成java对象到json,xml,text和二进制等数据格式的转换;其中HttpMessageConveter接口(消息转换器)定义了java转为json,xml等数据格式的方法,这个接口有很多实现类,这些实现类完成了上面所说的转换。被加入配置文件后会自动创建HttpMessageConveter接口的7个实现类对象,包括MappingJackson2HttpMessageConverter(使用jackson工具库中的ObjectMapper实现java对象转为json字符串)

  3. 在处理器方法上加入注解@ResponseBody
    这一步相当完成了

    response.setContentType("application/json;charset=:utf-8");
    PrintWriter pw=response.getWriter();
    pw.println(json);
    
通过一个例子实现

处理器方法返回一个student,通过框架转为json,响应ajax请求

@RequestMapping(value = "/returnStudentJson.do" )
    @ResponseBody
    public Student doReturnViewAjax(String name,Integer age){
        //调用service,获取请求结果数据,student对象表示结果数据
        Student student=new Student();
        student.setName("tiaotiao");
        student.setAge(20);
        //会被框架转为json
        return student;

    }

@ResponseBody:把处理器方法返回对象转为json后,通过HttpServletResponse输出给浏览器;位置:方法定义的上面,和其他注解没有顺序的关系

然后把index.jsp中的url改成url:"returnStudentJson.do"即可

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fMIWyWj2-1595768985087)(https://i1.100024.xyz/i/2020/07/26/kp218x.png)]

处理流程
  1. 框架会把返回student类型,调用框架中的ArrayList中每个类的canWrite()方法,检查那个HttpMessageConverter接口的实现类能处理Student类型的数据–MappingJackson2HttpMessageConverter
  2. 框架会调用实现类的write()MappingJackson2HttpMessageConverterwrite()方法,把tiaotiao的student对象转为json,调用Jackson的ObjectMapper实现转为json;contentType:application/json;charset=utf-8
  3. 框架会调用@ResponseBody把2的结果数据输出到浏览器,ajax请求处理完成

返回List

处理器方法返回List

@RequestMapping(value = "/returnStudentJsonArray.do" )
    @ResponseBody
    public List doReturnViewAjaxArray(String name, Integer age){

        List s=new ArrayList();
        //调用service,获取请求结果数据,student对象表示结果数据
        Student student=new Student();
        student.setName("tiaotiao");
        student.setAge(20);

        s.add(student);
        student=new Student();
        student.setName("pipi");
        student.setAge(19);
        s.add(student);
        //会被框架转为json
        return s;
    }
index.jsp(部分)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1yISDtZv-1595768985092)(https://pic.imgdb.cn/item/5f1d1a0b14195aa5948276b1.jpg)]


返回String(文本)

String表示文本,不是视图;区分返回值String是数据还是视图,就看有没有@ResponseBody注解,有的话是数据,反之为视图

控制器方法
@RequestMapping("/StringData.do")
    @ResponseBody
    public String doStringData(String name,Integer age){
        return "返回String文本数据";
    }
index.jsp(部分)

这样除了要把url改了,还要把dataType的类型改成text或者把这句给注释掉,不然无法转换,会报错


SpringMVC学习笔记4——关于返回值_第2张图片
这里出现中文乱码,原因是使用了text/plain;charset=ISO-8859-1作为Context-Type,解决办法:给@RequestMapping加上一个属性produces

@RequestMapping(value = "/StringData.do",produces = "text/plain;charset=utf-8")
    @ResponseBody
    public String doStringData(String name,Integer age){
        return "返回String文本数据";
    }

SpringMVC学习笔记4——关于返回值_第3张图片

处理流程
  1. 框架会把返回student类型,调用框架中的ArrayList中每个类的canWrite()方法,检查那个HttpMessageConverter接口的实现类能处理Student类型的数据–StringHttpMessageConverter
  2. 框架会调用实现类的write()StringHttpMessageConverterwrite()方法,把字符按照指定的编码处理 application/json;charset=ISO-8859-1`
  3. 框架会调用@ResponseBody把2的结果数据输出到浏览器,ajax请求处理完成

条条:该学习笔记是记录了我的学习过程,学习自动力节点,有不对的地方欢迎指出

你可能感兴趣的:(自学,初学,java,js,python,spring,ajax)