springmvc---处理器类方法的返回值---学习记录

返回值是 ModelAndView

有数据和视图,对视图执行forward ,处理器方法处理完,需要跳转到其他资源,且又要在跳转的资源传递数据

例:

@RequestMapping(value = "/receiceobject.do")
    public ModelAndView doSome1(Student myStudent){

        ModelAndView mv=new ModelAndView();

        mv.addObject("myname",myStudent.getName());
        mv.addObject("myage",myStudent.getAge());
        mv.addObject("myStudent",myStudent);

        mv.setViewName("show");

        //返回mv
        return mv;

    }

返回值是 String(表示视图)

表示视图,可以逻辑名称,也可以是完整视图路径,这个就是返回View部分,可以使用视图解析器,访问路径拼接

例:

@RequestMapping(value = "/returnString-view.do")
    public String doReturnView(HttpServletRequest request,String name, Integer age){

        //可以手动添加数据到request作用域
        request.setAttribute("myname",name);
        request.setAttribute("myage",age);
        //show : 逻辑视图名称,项目中配置了视图解析器
        //框架对视图执行forward转发操作
        return "show";
    }

返回值是 Void

不能表示数据,也不能表示视图

在处理ajax的时候,可以使用void返回值。 通过HttpServletResponse输出数据,响应ajax请求。
ajax请求服务器端返回的就是数据,和视图无关。

处理器代码:

@RequestMapping(value = "/returnVoid-ajax.do")
    public void doReturnView(HttpServletResponse response, String name, Integer age) throws IOException {

        //处理ajax,使用json做数据的格式
        //service调用完成了,使用Student表示处理结果
        Student student =new Student();
        student.setName(name);
        student.setAge(age);

        String json="";
        //把结果的对象转为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();

    }

网页代码:


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script type="text/javascript" src="js/jQuery3.6.0.js"></script>
    <script type="text/javascript">
        $(function(){
            $("button").click(function(){
                //alert("button click")
                $.ajax({
                    url:"returnVoid-ajax.do",
                    data:{
                        name:"zhangsan",
                        age:20
                    },
                    type:"post",
                    dataType:"json",
                    success:function(resp){
                        //resp从服务器端返回的是json格式的字符串{"name:"+"zhangsan","age"+20}
                        //jquery会把字符串转为json对象,赋值给resp形参
                        alert(resp.name+"   "+resp.age)

                    }
                })
            })
        })
    </script>
</head>
<body>
    <p>处理器方法返回String表示视图名称</p>
    <form action="test/returnString-view.do" method="post">
        姓名:<input type="text" name="name"> <br/>
        年龄:<input type="text" name="age">  <br/>
        <input type="submit" value="提交参数">
    </form>
    <br>
    <button id="btn">发起ajax请求</button>
</body>
</html>

现在做ajax,主要使用json格式,主要步骤:

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

<!--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>

2.在springmvc配置文件之间加入注解驱动<mvc:annotation-driven />

等同于 json=om.writeValuesAsString(student);

注意:注解驱动有重名的 选择后缀是mvc的

3.在处理器方法的上面加入@ResponseBody注解

@ResponseBody
放在处理器方法的上面,通过HttpServletResponse输出数据,响应ajax请求

等同于

//response.setContextType("application/json;charset=utf-8");
PrintWriter pw=response.getWriter();
pw.println(json);

返回值是Object

对象有属性,属性就是数据,所以返回Object表示数据,和视图无关
可以使用对象表示数据,响应ajax请求

springmvc处理器方法返回Object,可以转为json输出到浏览器,响应ajax的内部原理:

1.<mvc:annotation-driven /> 注解驱动
注解驱动实现的功能是 完成java对象到json,xml,text,二进制等数据格式的转换

<mvc:annotation-driven /> 在加入到springmvc配置文件后,会自动创建HttpMessageConveter接口的7个实现类对象,其中MappingJackson2HMappingttpMessageConverter,使用jackson工具库中的ObjectMapper实现java对象转为json

HttpMessageConveter 接口:消息转换器
功能:定义了java转为json,xml等数据格式的方法

2.@ResponseBody注解

放在处理器方法的上面,通过HttpServletResponse输出数据,响应ajax请求的

作用:把处理器方法返回对象转为json后,通过HttpServletResponse输出给浏览器

****和其他注解没有顺序关系

返回对象的处理流程:

1.框架会把返回Student类型,调用框架中的ArrayList<HttpMessageConverter>中每个类的canWrite()方法,检查每个HttpMessageConverter接口的实现类能处理Student类型的数据–MappingJackson2HMappingttpMessageConverter

2.框架会调用实现类的write(),MappingJackson2HMappingttpMessageConverter的write()方法
把student对象转为json,调用jackson的ObjectMapper实现类转为json

3.框架会调用@ResponseBody把 2 的结果数据输出到浏览器,ajax请求处理完成

处理器代码:

/*
    * 处理器方法返回一个Student,通过框架转为json,响应ajax请求
    * */
    @RequestMapping(value = "/returnStudentJson.do")
    @ResponseBody
    public Student doStudentJsonObject(String name, Integer age) {

        //调用service,获取请求结果数据,Student对象表示结果数据
        Student student =new Student();
        student.setName("李四同学");
        student.setAge(20);
        return student;

    }

网页代码:

<script type="text/javascript">
        $(function(){
            $("button").click(function(){
                //alert("button click")
                $.ajax({
                    
                    url:"returnStudentJson.do",
                    data:{
                        name:"zhangsan",
                        age:20
                    },
                    type:"post",
                    dataType:"json",
                    success:function(resp){
                        //alert(resp)
                        //resp从服务器端返回的是json格式的字符串{"name:"+"zhangsan","age"+20}
                        //jquery会把字符串转为json对象,赋值给resp形参
                        alert(resp.name+"   "+resp.age)
                     
                    }
                })
            })
        })
    </script>

返回值是String(表示数据的)

区分返回值String是数据,还是视图,看有没有@ResponseBody注解
如果有@ResponseBody注解,返回String就是数据,反之就是视图

处理器代码:

 @RequestMapping(value = "/returnStringData.do" , produces = "text/plain;charset=utf-8")
    @ResponseBody
    public String doStringData(String name,Integer age){
        return "hello springmvc 返回对象,表示数据";
    }

响应结果中文乱码

在@RequestMapping中加入produces = "text/plain;charset=utf-8"

@RequestMapping(value = "/returnStringData.do" , produces = "text/plain;charset=utf-8")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值