SpringMVC——控制器方法的返回值类型(ModelAndView、String、void、Object)

本文详细介绍了SpringMVC中控制器方法的四种常见返回值类型:ModelAndView、String(视图)、void(响应Ajax请求)和Object(JSON数据)。通过实例展示了如何在不同场景下使用这些返回值,包括视图解析器的配置、Ajax响应以及对象转换为JSON等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录:

1.控制器controller方法的返回值

1.1 返回值类型:ModelAndView 

1.2 返回值类型:String(这里的String是视图) 

1.2.1 控制器类 

1.2.2 springmvc配置文件

1.2.3 index.jsp

1.2.4 web.xml

1.2.5 运行结果

1.3 返回值类型:void

1.3.1 控制器类

1.3.2 springmvc配置文件与之前的例子相同

1.3.3 index.jsp 

1.3.4 web.xml与之间的例子相同

1.3.5 运行结果 

1.4 返回值类型:Object(可以是自定义Student类、List集合、Map集合等等)

1.4.1 控制器类 

1.4.2 springmvc配置文件

1.4.3 index.jsp 

1.4.4 web.xml与之前的例子相同

1.4.5 运行结果

1.5 返回值类型:String(这里的String是数据) 

1.5.1 控制器类 

1.5.2 springmvc配置文件

1.5.3 index.jsp

1.5.4 web.xml与之前的例子相同

1.5.5 运行结果 

2.控制器类中的方法返回对象转为json的步骤


1.控制器controller方法的返回值

使用@Controller 注解的处理器的处理器方法,其返回值常用的有四种类型:

  1. 第一种:ModelAndView
  2. String
  3. void
  4. 返回自定义类型对象

1.1 返回值类型:ModelAndView 

参考我的这篇文章即可:SpringMVC——@RequestMapping定义请求规则,控制器接收请求参数的三种方式_@requestmapping post-CSDN博客

若处理器方法处理完后,需要跳转到其它资源,且又要在跳转的资源间传递数据,此时处理器方法返回 ModelAndView 比较好。当然,若要返回 ModelAndView,则处理器方法中需要定义 ModelAndView 对象。

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

1.2 返回值类型:String(这里的String是视图) 

处理器方法返回的字符串可以指定逻辑视图名,通过视图解析器解析可以将其转换为物理视图地址。

1.2.1 控制器类 

package com.songzihao.controller;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.songzihao.entity.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@Controller
public class MyController {

    /**
     *  控制器方法返回String,表示逻辑名称,需要项目中配置视图解析器
     */
    @RequestMapping(value = {"/return-string-view.do"})
    public String doReturnStringView1(HttpServletRequest request,String name, Integer age) {
        System.out.println("执行了MyController的doReturnStringView1方法,name=" + name + ",age=" + age);
        //处理数据
        request.setAttribute("myName",name);
        request.setAttribute("myAge",age);
        //使用视图解析器,返回结果,forward,转发到show.jsp
        return "show";
        //如果不使用视图解析器,则需要写成下面这样
        //return "/WEB-INF/view/show.jsp";
    }

}

1.2.2 springmvc配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- springmvc的配置文件 -->
    <!-- 声明组件扫描器 -->
    <context:component-scan base-package="com.songzihao.controller" />

    <!-- 声明视图解析器,帮助处理视图 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 前缀:指定试图文件的路径 -->
        <property name="prefix" value="/WEB-INF/view/" />
        <!-- 后缀:试图文件的扩展名 -->
        <property name="suffix" value=".jsp" />
    </bean>

</beans>

1.2.3 index.jsp

<%@ page contentType="text/html;charset=utf-8" language="java" %>
<html>
<head>
    <title>接受请求参数</title>
</head>
<body>
    <p>控制器返回String-逻辑视图名称</p>
    <form action="return-string-view.do" method="post">
        姓名:<input type="text" name="name"><br/>
        年龄:<input type="text" name="age"><br/>
        <input type="submit" value="提交参数">
    </form>
</body>
</html>

1.2.4 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!-- 声明springmvc的核心对象 -->
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 自定义配置文件的位置 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <!-- tomcat服务器创建对象的顺序,数值(大于等于0)越小,创建对象的时间就越早 -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <!--
            把一些请求交给指定的servlet处理
            1.使用扩展名方式,格式:*.xxx, xxx是自定义的扩展名
              例如:*.do  *.action  *.mvc , 不能使用 *.jsp!!!
            2.使用斜杠 "/"
        -->
        <!-- 意思是将 *.do 的请求交给 DispatcherServlet 处理 -->
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
    
    <!-- 声明过滤器,框架提供的,解决post请求中乱码的问题 -->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <!-- 给过滤器属性赋值 -->
        <init-param>
            <!-- 项目使用的字符集编码 -->
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
        <init-param>
            <!-- 强制请求对象request使用encoding的编码方式 -->
            <param-name>forceRequestEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <!-- 强制响应对象response使用encoding的编码方式 -->
            <param-name>forceResponseEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <!-- 强制所有请求,先经过过滤器处理 -->
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

1.2.5 运行结果

1.3 返回值类型:void

1.3.1 控制器类

package com.songzihao.controller;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.songzihao.entity.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@Controller
public class MyController {

    /**
     *  控制器方法返回void,响应ajax请求,使用HttpServletResponse输出数据
     */
    @RequestMapping(value = {"/return-void-ajax.do"})
    public void returnVoidAjax(HttpServletResponse response,String name, Integer age) throws IOException {
        System.out.println("处理void返回类型:name=" + name + ",age=" + age);
        Student student=new Student();
        student.setName(name);
        student.setAge(age);

        //把对象转为json
        ObjectMapper om=new ObjectMapper();
        String json=om.writeValueAsString(student);
        System.out.println("服务器对象转为json===" + json);

        //输出json,响应ajax
        response.setContentType("application/json;charset=utf-8");
        PrintWriter pw=response.getWriter();
        pw.println(json);
        pw.flush();
        pw.close();
    }

}

1.3.2 springmvc配置文件与之前的例子相同

1.3.3 index.jsp 

<%@ page contentType="text/html;charset=utf-8" language="java" %>
<html>
<head>
    <title>接受请求参数</title>
    <script type="text/javascript" src="js/jquery-3.6.0.js"></script>
    <script type="text/javascript">
        $(function () {
            $("#myButton").on("click",function () {
                $.ajax({
                    url: "return-void-ajax.do",
                    //url: "doStudentJson.do",
                    //url: "doStringData.do",
                    data: {
                      name: "张起灵",
                      age: 20
                    },
                    dataType: "json",
                    //dataType: "text",
                    success: function (resp) {
                        // resp=XMLHttpRequest.responseText;
                        alert("name===" + resp.name + ",age===" + resp.age);
                        //alert(resp);
                    }
                })
            })
        })
    </script>
</head>
<body>
    <p>控制器返回String-逻辑视图名称</p>
    <form action="return-string-view.do" method="post">
        姓名:<input type="text" name="name"><br/>
        年龄:<input type="text" name="age"><br/>
        <input type="submit" value="提交参数">
    </form>
    <br/><br/>
    <button id="myButton">提交ajax请求</button>
</body>
</html>

1.3.4 web.xml与之间的例子相同

1.3.5 运行结果 

1.4 返回值类型:Object(可以是自定义Student类、List集合、Map集合等等)

1.4.1 控制器类 

package com.songzihao.controller;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.songzihao.entity.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@Controller
public class MyController {

    /**
     *  控制器方法返回Student-----json
     *
     *  框架处理模式:
     *  1. 框架根据控制器方法的返回值类型,找到HttpMessageConverter接口的实现类,
     *     最后找到的是MappingJackson2HttpMessageConverter
     *
     *  2. 使用实现类MappingJackson2HttpMessageConverter,执行它的write()方法,
     *     把Student对象转为了json格式的数据
     *
     *  3. 框架使用@ResponseBody注解,把2中的json数据输出给了浏览器
     *     设置了content-type: application/json;charset=utf-8
     */
    @RequestMapping(value = "/doStudentJson.do")
    @ResponseBody
    public Student doAjaxJson(String name,Integer age) {
        System.out.println("控制器方法返回自定义对象Student,转为Json:" + name + "," + age);

        Student student=new Student();
        student.setName(name);
        student.setAge(age);

        return student;
    }

}

1.4.2 springmvc配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- springmvc的配置文件 -->
    <!-- 声明组件扫描器 -->
    <context:component-scan base-package="com.songzihao.controller" />

    <!-- 声明视图解析器,帮助处理视图 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 前缀:指定试图文件的路径 -->
        <property name="prefix" value="/WEB-INF/view/" />
        <!-- 后缀:试图文件的扩展名 -->
        <property name="suffix" value=".jsp" />
    </bean>

    <!-- 声明注解驱动,创建HttpMessageConverter接口的7个实现类对象 -->
    <mvc:annotation-driven />

</beans>

1.4.3 index.jsp 

<%@ page contentType="text/html;charset=utf-8" language="java" %>
<html>
<head>
    <title>接受请求参数</title>
    <script type="text/javascript" src="js/jquery-3.6.0.js"></script>
    <script type="text/javascript">
        $(function () {
            $("#myButton").on("click",function () {
                $.ajax({
                    //url: "return-void-ajax.do",
                    url: "doStudentJson.do",
                    //url: "doStringData.do",
                    data: {
                      name: "张起灵",
                      age: 20
                    },
                    dataType: "json",
                    //dataType: "text",
                    success: function (resp) {
                        // resp=XMLHttpRequest.responseText;
                        alert("name===" + resp.name + ",age===" + resp.age);
                        //alert(resp);
                    }
                })
            })
        })
    </script>
</head>
<body>
    <p>控制器返回String-逻辑视图名称</p>
    <form action="return-string-view.do" method="post">
        姓名:<input type="text" name="name"><br/>
        年龄:<input type="text" name="age"><br/>
        <input type="submit" value="提交参数">
    </form>
    <br/><br/>
    <button id="myButton">提交ajax请求</button>
</body>
</html>

1.4.4 web.xml与之前的例子相同

1.4.5 运行结果

1.5 返回值类型:String(这里的String是数据) 

1.5.1 控制器类 

package com.songzihao.controller;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.songzihao.entity.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@Controller
public class MyController {

    /**
     *  控制器方法返回String,这里是数据
     *
     *  区分返回值String是数据还是视图
     *  1.方法上面有 @ResponseBody 注解,就是数据
     *  2.方法上面没有 @ResponseBody 注解,就是视图
     *
     *  框架处理String返回值
     *  1.框架使用StringHttpMessageConverter
     *  2.StringHttpMessageConverter默认的字符集编码是ISO_8859_1
     *  3.使用 @RequestMapping 注解中的produces属性进行修改:produces = "text/plain;charset=utf-8"
     */
    @RequestMapping(value = {"/doStringData.do"},produces = "text/plain;charset=utf-8")
    @ResponseBody
    public String doStringData(String name,Integer age) {
        System.out.println("控制器方法返回String,是数据");
        return "Hello SpringMVC注解式开发";
    }

}

1.5.2 springmvc配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- springmvc的配置文件 -->
    <!-- 声明组件扫描器 -->
    <context:component-scan base-package="com.songzihao.controller" />

    <!-- 声明视图解析器,帮助处理视图 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 前缀:指定试图文件的路径 -->
        <property name="prefix" value="/WEB-INF/view/" />
        <!-- 后缀:试图文件的扩展名 -->
        <property name="suffix" value=".jsp" />
    </bean>

    <!-- 声明注解驱动,创建HttpMessageConverter接口的7个实现类对象 -->
    <mvc:annotation-driven />

</beans>

1.5.3 index.jsp

<%@ page contentType="text/html;charset=utf-8" language="java" %>
<html>
<head>
    <title>接受请求参数</title>
    <script type="text/javascript" src="js/jquery-3.6.0.js"></script>
    <script type="text/javascript">
        $(function () {
            $("#myButton").on("click",function () {
                $.ajax({
                    //url: "return-void-ajax.do",
                    //url: "doStudentJson.do",
                    url: "doStringData.do",
                    data: {
                      name: "张起灵",
                      age: 20
                    },
                    //dataType: "json",
                    dataType: "text",
                    success: function (resp) {
                        // resp=XMLHttpRequest.responseText;
                        //alert("name===" + resp.name + ",age===" + resp.age);
                        alert(resp);
                    }
                })
            })
        })
    </script>
</head>
<body>
    <p>控制器返回String-逻辑视图名称</p>
    <form action="return-string-view.do" method="post">
        姓名:<input type="text" name="name"><br/>
        年龄:<input type="text" name="age"><br/>
        <input type="submit" value="提交参数">
    </form>
    <br/><br/>
    <button id="myButton">提交ajax请求</button>
</body>
</html>

1.5.4 web.xml与之前的例子相同

1.5.5 运行结果 


2.控制器类中的方法返回对象转为json的步骤

  1. 在pom.xml文件中加入 jackson 依赖,springmvc框架处理json时,默认使用的是jackson。
  2. 在springmvc配置文件中,加入注解驱动标签: <mvc:annotation-driven />。
  3. 在控制器方法的上面加入 @ResponseBody 注解,表示将返回值数据输出给浏览器。
### Spring MVC 控制器方法返回值类型及其使用场景 #### void 类型 当不需要视图解析,即不需转向任何页面或发送响应体给客户端时,可以选择 `void` 作为控制器方法返回值。通常用于异步请求处理或是仅执行某些操作而无需展示结果的情况。 ```java @RequestMapping("/doSomething") public void doSomething(HttpServletResponse response) throws IOException { // 执行一些业务逻辑... } ``` #### String 类型 如果希望指定一个视图名称让容器去查找对应的视图模板并渲染它,则可以采用字符串形式来表示目标视图的名字。这种情况下,默认会按照配置好的前缀和后缀拼接成实际路径进行加载[^1]。 ```java @RequestMapping("/showPage") public String showPage() { return "viewName"; // 假设对应的是 /WEB-INF/jsp/viewName.jsp 或其他配置设定的位置 } ``` #### ModelAndView 类型 对于既想要指明具体使用的视图又希望能够携带模型数据一同传递至前端的情形下,推荐利用 `ModelAndView` 来完成这一需求。通过创建该类型的实例并向其中添加属性的方式实现数据共享[^2]。 ```java @RequestMapping("/dataView") public ModelAndView dataView() { Map<String, Object> model = new HashMap<>(); model.put("key", value); return new ModelAndView("targetView", model); // 同时设置了视图名与model中的键值对 } ``` #### Java 对象 (如 ResponseEntity<T>) 为了更灵活地构建HTTP响应消息头、状态码等内容,可以直接返回实现了 `HttpMessageConverter` 接口的对象,比如 `ResponseEntity<?>` 。这允许开发者精确控制整个 HTTP 响应的内容结构[^3]。 ```java @GetMapping("/api/resource") @ResponseBody public ResponseEntity<Resource> getResource(@PathVariable Long id){ Resource resource = service.getResourceById(id); HttpStatus status = null == resource ? HttpStatus.NOT_FOUND : HttpStatus.OK; return new ResponseEntity<>(resource,status); } ```
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

贝尔摩德苦艾酒

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

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

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

打赏作者

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

抵扣说明:

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

余额充值