目录
**摘要:**本文系统介绍了 Spring MVC 中控制器方法的多种响应方式,包括返回静态页面、数据(@ResponseBody 注解)、HTML 代码片段、JSON 格式数据,以及如何设置 HTTP 状态码和响应头(Header)。文章通过具体代码示例和运行效果图,详细说明了 @ResponseBody 注解的作用机制、@RestController 与 @Controller 的区别、常见 HTTP 错误状态码的含义,并演示了通过 @RequestMapping 的 produces 属性设置 Content-Type 响应头。最后通过一个加法器案例展示了如何接收参数并返回计算结果,为 Spring MVC 响应处理提供了全面的实践指导。
返回静态页面
java
@Controller
public class ResponseController {
@RequestMapping("/index")
public Object r1(){
return "/index.html";
}
}

返回数据@ResponseBody
java
@Controller
public class ResponseController {
@ResponseBody
@RequestMapping("/index")
public Object r1(){
return "/index.html";
}
}
加上 @ResponseBody 注解,该方法就会把 "/index.html" 当做一个数据返回给前端。

@ResponseBody 既是类注解,又是方法注解
如果作用在类上,表示该类的所有方法返回的都是数据;如果作用在方法上,表示方法返回的是数据。
也就是说:在类上添加 @ResponseBody 相当于在所有的方法上添加了 @ResponseBody 注解。
同样,如果类上有 @RestController 注解时:表示所有的方法上添加了 @ResponseBody 注解,也就是当前类下所有的方法返回值作为响应数据。
如果一个类的方法里,既有返回数据的,又有返回页面的,就把 @ResponseBody 注解添加到对应的方法上即可。
java
@Controller
public class ResponseController {
@ResponseBody
@RequestMapping("/index1")
public Object r1(){
return "/index.html";
}
@RequestMapping("/index2")
public Object r2(){
return "/index.html";
}
}


java
@ResponseBody
@RequestMapping("/returnData")
public String r3(){
return "返回数据";
}

去掉 @ResponseBody 会产生 404 错误。

常见的网页错误总结:
- 404 Not Found(页面不存在)含义:请求的网页或资源不存在
- 400 Bad Request(请求错误)含义:客户端发送的数据格式不正确
- 401 Unauthorized(未认证)含义:用户没有登录或者身份验证失败
- 403 Forbidden(禁止访问)含义:已经认证,但是没有权限
- 405 Method Not Allowed(请求方法错误)含义:请求方式不支持
- 500 Internal Server Error(服务器内部错误)含义:后端代码运行异常
- 502 Bad Gateway(网关错误)含义:网关访问不到后端服务
- 503 Service Unavailable(服务不可用)含义:服务暂时无法处理请求
- 504 Gateway Timeout(网关超时)含义:等待后端响应太久
返回HTML代码片段
java
@ResponseBody
@RequestMapping("/returnhtml")
public Object r4(){
return "<h1>hello html</h1>";
}


响应中的 Content-Type 常见取值有以下几种:
- text/html:body 数据类型是 HTML
- text/css:body 数据类型是 CSS
- application/javascript:body 数据类型是 JavaScript
- application/json:body 数据格式是 JSON
如果请求的是 js 文件,Spring MVC 会自动设置 Content-Type 为 application/javascript。
如果请求的是 css 文件,Spring MVC 会自动设置 Content-Type 为 text/css。
返回JSON
Spring MVC 也可以返回 JSON。
后端方法返回结果为对象。
java
@ResponseBody
@RequestMapping("/returnjson")
public Object r5(){
HashMap<String,String> mp=new HashMap<>();
mp.put("java","java value");
mp.put("mysql","mysql value");
mp.put("js","js value");
return mp;
}


设置状态码
java
@ResponseBody
@RequestMapping("/setstatus")
public String r6(HttpServletResponse response){
response.setStatus(402);
return "设置状态码成功";
}


设置Header
HTTP 响应报头也会向客户端传递一些附加信息,比如服务程序的名称、请求的资源已移动到新地址等,如:Content-Type、Location 等。
这些信息通过 @RequestMapping 注解的属性来实现。

- value:指定映射的 URL
- method:指定请求的 method 类型,如 GET、POST 等
- consumes:指定处理请求(request)的提交内容类型(Content-Type),例如 application/json、text/html
- produces:指定返回的内容类型,还可以同时设置返回的字符编码
- params:指定 request 中必须包含某些参数时,才能让该方法处理
- header:指定 request 中必须包含某些指定的 header 值,才能让该方法处理请求
设置Content-Type
java
@ResponseBody
@RequestMapping(value = "/setcontent",produces = "application/json")
public String r7(){
return "{\"success\":true}";
}


java
@ResponseBody
@RequestMapping(value = "/setcontent2",produces = "application/json;charset=utf-8")
public String r8(){
return "{\"success\":true}";
}

java
@ResponseBody
@RequestMapping("/setheader")
public String r9(HttpServletResponse response){
response.addHeader("myheader","header");
return "header设置成功";
}

加法器
需求分析
加法计算器功能,对两个整数进行相加,需要客户端提供参与计算的两个数,服务端返回这两个整数计算的结果。

java
@RequestMapping("/calc")
@RestController
public class CalcController {
@RequestMapping("/sum")
public String calc(Integer num1,Integer num2){
if(num1==null||num2==null){
return "输入不合法";
}
Integer sum=num1+num2;
return "相加结果为"+sum;
}
}
总结与扩展
响应方式总结
| 响应方式 | 核心注解/方法 | 适用场景 | 注意事项 |
|---|---|---|---|
| 返回静态页面 | @Controller + return "视图名" | 需要返回HTML页面模板 | 需要配置视图解析器,返回的是视图逻辑名 |
| 返回数据(@ResponseBody) | @ResponseBody 或 @RestController | API接口返回纯数据 | 方法返回值会直接写入HTTP响应体,不经过视图解析 |
| 返回HTML代码片段 | @ResponseBody + return "HTML字符串" | 返回动态生成的HTML片段 | 需要手动设置或确保Content-Type正确 |
| 返回JSON | @ResponseBody + 返回对象 | RESTful API接口 | Spring MVC自动将对象序列化为JSON |
| 设置状态码 | HttpServletResponse.setStatus() | 需要返回特定HTTP状态码 | 如402(支付要求)、404(未找到)等 |
| 设置Header | HttpServletResponse.addHeader() 或 @RequestMapping(produces) | 需要设置响应头信息 | 如Content-Type、Cache-Control、Location等 |
扩展思考题
思考题一:如何统一处理所有控制器的异常并返回自定义JSON错误信息?
在实际项目中,我们经常需要统一处理控制器抛出的异常,避免将详细的异常信息直接暴露给客户端,同时返回结构化的错误信息。请思考:
- 可以使用Spring MVC的什么机制来实现全局异常处理?
- 如何定义统一的错误响应格式?
- 如何处理不同类型的异常(如业务异常、参数校验异常、系统异常)?
- 如何确保异常处理逻辑不会影响正常的业务响应?
思考题二:如何实现响应内容的国际化(i18n)支持?
对于需要支持多语言的应用程序,响应内容可能需要根据用户的语言偏好进行动态调整。请思考:
- 如何在Spring MVC中配置消息源(MessageSource)?
- 如何在控制器方法中获取用户的语言偏好?
- 如何根据语言偏好动态返回不同语言的响应内容?
- 对于JSON响应,如何实现字段值的国际化?
这两个扩展思考题旨在引导读者深入思考Spring MVC响应处理的进阶应用场景,为实际项目开发提供更全面的解决方案。