Spring MVC(四)

目录

返回静态页面

返回数据@ResponseBody

返回HTML代码片段

返回JSON

设置状态码

设置Header

设置Content-Type

加法器

需求分析

**摘要:**本文系统介绍了 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 错误。

常见的网页错误总结:

  1. 404 Not Found(页面不存在)含义:请求的网页或资源不存在
  2. 400 Bad Request(请求错误)含义:客户端发送的数据格式不正确
  3. 401 Unauthorized(未认证)含义:用户没有登录或者身份验证失败
  4. 403 Forbidden(禁止访问)含义:已经认证,但是没有权限
  5. 405 Method Not Allowed(请求方法错误)含义:请求方式不支持
  6. 500 Internal Server Error(服务器内部错误)含义:后端代码运行异常
  7. 502 Bad Gateway(网关错误)含义:网关访问不到后端服务
  8. 503 Service Unavailable(服务不可用)含义:服务暂时无法处理请求
  9. 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 注解的属性来实现。

  1. value:指定映射的 URL
  2. method:指定请求的 method 类型,如 GET、POST 等
  3. consumes:指定处理请求(request)的提交内容类型(Content-Type),例如 application/json、text/html
  4. produces:指定返回的内容类型,还可以同时设置返回的字符编码
  5. params:指定 request 中必须包含某些参数时,才能让该方法处理
  6. 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错误信息?

在实际项目中,我们经常需要统一处理控制器抛出的异常,避免将详细的异常信息直接暴露给客户端,同时返回结构化的错误信息。请思考:

  1. 可以使用Spring MVC的什么机制来实现全局异常处理?
  2. 如何定义统一的错误响应格式?
  3. 如何处理不同类型的异常(如业务异常、参数校验异常、系统异常)?
  4. 如何确保异常处理逻辑不会影响正常的业务响应?

思考题二:如何实现响应内容的国际化(i18n)支持?

对于需要支持多语言的应用程序,响应内容可能需要根据用户的语言偏好进行动态调整。请思考:

  1. 如何在Spring MVC中配置消息源(MessageSource)?
  2. 如何在控制器方法中获取用户的语言偏好?
  3. 如何根据语言偏好动态返回不同语言的响应内容?
  4. 对于JSON响应,如何实现字段值的国际化?

这两个扩展思考题旨在引导读者深入思考Spring MVC响应处理的进阶应用场景,为实际项目开发提供更全面的解决方案。

相关推荐
都叫我大帅哥4 小时前
给 Java 程序员的 CSRF 攻击详解:从原理到防御实战
java
江南十四行4 小时前
Spring框架核心(上)——IoC控制反转与DI依赖注入详解
java·后端·spring
fb_123455 小时前
Linux磁盘分区从入门到实操:MBR_GPT全解析+分区工具实战指南
java·linux·gpt
码智社6 小时前
JSON 零基础到资深全体系教程
java·json
wgego7 小时前
基础的反序列化一些总结(php和java)
java·开发语言·笔记
机建狂魔7 小时前
Codex 接入第三方模型 API 实战:以 Mimo 为例
java·服务器·数据库·ai·ai编程·codex
山峰哥8 小时前
数据库工程与SQL调优:从慢查询到秒级响应的实战之路
java·开发语言·数据库·sql·深度优先·启发式算法
乐观的Terry8 小时前
11、发布系统-用户认证与权限体系
java·spring boot·spring·spring cloud·mybatis
前端开发张小七8 小时前
Java 学习笔记 · 第二课:面向对象核心(封装、继承、多态)及接口与异常
java·后端·程序员