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" %>
<html>
<head>
    <title>Title</title>
    <script type="text/javascript" src="js/jquery-3.5.1.js"></script>
    <script>
        $(function () {
                $("button").click(function () {
                    //alert("button click!")
                    $.ajax({
                        url:"returnVoid-ajax.do",
                        data:{
                            name:"zhangsan",
                            age:20
                        },
                        type:"post",
                        dataType:"json",
                        success:function (resp) {
                            alert(resp.name+"    "+resp.age);
                        }
                    })
                })
            })
    </script>
</head>
<body>
        <p>处理器返回string,表示视图名称</p>

        <form action="returnString-view.do" method="post">
            姓名:<input type="text" name="name">
            年龄:<input type="text" name="age">
            <input type="submit" value="提交参数">
        </form>
        <br>
        <button id="btn">发起ajax请求</button>
</body>
</html>
控制方法
@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返回状态码 springmvc处理返回值_java

ajax我都没学过。。。。这个部分我也很懵,将就着看吧

四、Object

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

实现步骤
  1. 加入处理json的工具库依赖,springmvc默认使用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>
  1. 在springmvc配置文件中加入<mvc:annotation-driven>注解驱动
这一步相当完成了json=om.writeValueAsString(student);<mvc:annotation-driven> 所实现的功能是:完成java对象到json,xml,text和二进制等数据格式的转换;其中HttpMessageConveter接口(消息转换器)定义了java转为json,xml等数据格式的方法,这个接口有很多实现类,这些实现类完成了上面所说的转换。<mvc:annotation-driven>被加入配置文件后会自动创建HttpMessageConveter接口的7个实现类对象,包括MappingJackson2HttpMessageConverter(使用jackson工具库中的ObjectMapper实现java对象转为json字符串)
  1. 在处理器方法上加入注解@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<HttpMessageConverter>中每个类的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<Student> doReturnViewAjaxArray(String name, Integer age){

        List<Student> s=new ArrayList<Student>();
        //调用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(部分)
<script>
        $(function () {
                $("button").click(function () {
                    //alert("button click!")
                    $.ajax({
                        //url:"returnVoid-ajax.do",
                        url:"returnStudentJsonArray.do",
                        data:{
                            name:"zhangsan",
                            age:20
                        },
                        type:"post",
                        dataType:"json",
                        success:function (resp) {
                            //alert(resp.name+"    "+resp.age);
                            $.each(resp,function (i,n) {
                                alert(n.name+"    "+n.age)
                            })
                        }
                    })
                })
            })
    </script>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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或者把这句给注释掉,不然无法转换,会报错

<script>
        $(function () {
                $("button").click(function () {
                    $.ajax({
                        url:"StringData.do",
                        data:{
                            name:"zhangsan",
                            age:20
                        },
                        type:"post",
                        //dataType:"text",
                        success:function (resp) {
                            alert("返回String文本数据"+resp)
                        }
                    })
                })
            })
    </script>

springmvc返回状态码 springmvc处理返回值_springmvc返回状态码_02


这里出现中文乱码,原因是使用了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返回状态码 springmvc处理返回值_springmvc返回状态码_03

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