SpringMVC中的返回值类型

文章目录

      • 4.处理器方法的返回值
        • 4.1 返回ModelAndView
        • 4.2 返回String
        • 4.3 返回void
        • 4.4 返回对象Object
        • 4.5 拓展(直接返回string数据)

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。
    
        <dependency>
            <groupId>com.fasterxml.jackson.coregroupId>
            <artifactId>jackson-coreartifactId>
            <version>2.9.8version>
        dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.coregroupId>
            <artifactId>jackson-databindartifactId>
            <version>2.9.8version>
        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中每个类的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就是数据,反之就是视图
     * 

* 默认使用“text/plain;charset=ISO-8859-1”作为contentType,导致中文有乱码, * 解决方案:给RequestMapping增加一个属性 produces, 使用这个属性指定新的contentType. * 返回对象框架的处理流程: * 1. 框架会把返回String类型,调用框架的中ArrayList中每个类的canWrite()方法 * 检查那个HttpMessageConverter接口的实现类能处理String类型的数据--StringHttpMessageConverter *

* 2.框架会调用实现类的write(), StringHttpMessageConverter的write()方法 * 把字符按照指定的编码处理 text/plain;charset=ISO-8859-1 *

* 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 返回对象,表示数据"; }

你可能感兴趣的:(mvc,springmvc)