SpringMVC中的返回值类型

4.处理器方法的返回值

使用@Controller 注解的处理器的处理器方法,

其返回值常用的有四种类型:

  • 第一种:ModelAndView

  • 第二种:String

  • 第三种:无返回值 void

  • 第四种:返回自定义类型对象

4.1 返回ModelAndView

ModelAndView: 有数据和视图,对视图执行forward(转发)。

代码实例:

@RequestMapping(value = "/other.do", method = RequestMethod.POST)
    public ModelAndView doOter(@RequestParam(value = "rname") String name,
                               @RequestParam(value = "rage") Integer age) {
        ModelAndView mv = new ModelAndView();
        mv.addObject("myname", name);
        mv.addObject("myage", age);
        mv.setViewName("other");
        return mv;
    }

​ 在使用时,若该处理器方法只是进行跳转而不传递数据,或只是传递数据而并不向任何 资源跳转(如对页面的 Ajax 异步响应),此时若返回 ModelAndView,则将总是有一部分多 余:要么 Model 多余,要么 View 多余。即此时返回 ModelAndView 将不合适。

4.2 返回String

String:表示视图,可以逻辑名称,也可以是完整视图路径(返回的是一个地址)

代码实例:

 @RequestMapping(value = "/returnStrinng-view.do", method = RequestMethod.POST)
    public String doReturnString(HttpServletRequest request, String name, Integer age) {
        request.setAttribute("myname", name);
        request.setAttribute("myage", age);
        return "other";
    }


//完整视图路径(不配置视图解析器)
 @RequestMapping(value = "/returnStrinng-view2.do", method = RequestMethod.POST)
    public String doReturnString2(HttpServletRequest request, String name, Integer age) {
        request.setAttribute("myname", name);
        request.setAttribute("myage", age);
        //这样不可以配置视图解析器,否则会路径拼接错误
        return "/WEB-INF/view/other.jsp";
    }
4.3 返回void

对于处理器方法返回 void 的应用场景,AJAX 响应.
若处理器对请求处理后,无需跳转到其它任何资源,此时可以让处理器方法返回 void。

代码实例

//未使用框架进行简化
@RequestMapping(value = "/returnVoid-ajax.do", method = RequestMethod.POST)
    public void ReturnVoid(HttpServletResponse response, String name, Integer age) throws IOException {
        System.out.println(name + "  " + age);
        //处理ajax,使用json做数据的格式
        //server调用完成了
        Student student = new Student();
        student.setAge(age);
        student.setName(name);

        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();
    }

ajax实现步骤

现在做ajax, 主要使用json的数据格式。 实现步骤:
 1.加入处理json的工具库的依赖, springmvc默认使用的jackson。
    <!--Jackson依赖-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.9.8</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.8</version>
        </dependency>

 2.在sprigmvc配置文件之间加入 <mvc:annotation-driven> 注解驱动。
   json  = om.writeValueAsString(student);
     <!--添加注解驱动-->
    <mvc:annotation-driven/>
     
 3.在处理器方法的上面加入@ResponseBody注解
     response.setContentType("application/json;charset=utf-8");
     PrintWriter pw  = response.getWriter();
     pw.println(json);
4.4 返回对象Object

​ 处理器方法也可以返回 Object 对象。这个 Object 可以是 Integer,String,自定义对象, Map,List 等。但返回的对象不是作为逻辑视图出现的,而是作为直接在页面显示的数据出现的。

返回对象,需要使用@ResponseBody 注解,将转换后的 JSON 数据放入到响应体中。

代码实例

/**
* 处理器方法返回一个Student,通过框架转为json,响应ajax请求
*
* @ResponseBody 作用:把处理器方法返回对象转为json后,通过HttpServletResponse输出给浏览器
* 位置:方法定义的上面,和其他注解没有顺序的关系
* 
* 返回对象框架的处理流程:
* 1. 框架会把返回Student类型,调用框架的中ArrayList<HttpMessageConverter>中每个类的canWrite()方法
* 检查那个HttpMessageConverter接口的实现类能处理Student类型的数据--MappingJackson2HttpMessageConverter
* 
* 2.框架会调用实现类的write(), MappingJackson2HttpMessageConverter的write()方法
* 把李四同学的student对象转为json, 调用Jackson的ObjectMapper实现转为json
* contentType: application/json;charset=utf-8
* 
* 3.框架会调用@ResponseBody把2的结果数据输出到浏览器, ajax请求处理完成
*/

    @RequestMapping(value = "/returnStudentJson.do")
    @ResponseBody
    public Student ReturnStudentJson(String name, Integer age) {
        //调用service,获取请求结果数据
        Student student = new Student();
        student.setName("LH同学");
        student.setAge(age);
        return student;
    }


    @RequestMapping(value = "/returnStudentJsonList.do")
    @ResponseBody
    public List<Student> ReturnStudentJsonArray(String name, Integer age) {

        //调用service,获取请求结果数据

        List<Student> stulist = new ArrayList<>();
        Student student = new Student();
        student.setName("LH同学");
        student.setAge(age);
        stulist.add(student);

        student = new Student();
        student.setName("HSY同学");
        student.setAge(18);
        stulist.add(student);
        return stulist;
    }

4.5 拓展(直接返回string数据)

即在@RequestMapping中添加produces属性

produces = “text/plain;charset=utf-8”

对应 要在前端代码的ajax中的js部分去除 dataType: "json"

代码实例:

/**
     * 处理器方法返回的是String , String表示数据的,不是视图。
     * 区分返回值String是数据,还是视图,看有没有@ResponseBody注解
     * 如果有@ResponseBody注解,返回String就是数据,反之就是视图
     * <p>
     * 默认使用“text/plain;charset=ISO-8859-1”作为contentType,导致中文有乱码,
     * 解决方案:给RequestMapping增加一个属性 produces, 使用这个属性指定新的contentType.
     * 返回对象框架的处理流程:
     * 1. 框架会把返回String类型,调用框架的中ArrayList<HttpMessageConverter>中每个类的canWrite()方法
     * 检查那个HttpMessageConverter接口的实现类能处理String类型的数据--StringHttpMessageConverter
     * <p>
     * 2.框架会调用实现类的write(), StringHttpMessageConverter的write()方法
     * 把字符按照指定的编码处理 text/plain;charset=ISO-8859-1
     * <p>
     * 3.框架会调用@ResponseBody把2的结果数据输出到浏览器, ajax请求处理完成
     */
    @RequestMapping(value = "/returnStringData.do", produces = "text/plain;charset=utf-8")
    @ResponseBody
    public String doStringData(String name, Integer age) {
        return "Hello SpringMVC 返回对象,表示数据";
    }
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LvhaoIT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值