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响应处理的进阶应用场景,为实际项目开发提供更全面的解决方案。

相关推荐
SWAGGY..12 小时前
【C++初阶】:(15)模板进阶--从非类型参数到模板特化与分离编译
java·服务器·前端
楠楠子呀13 小时前
独立站聊天转化全链路:从二维码引流到数据复盘
java·javascript·数据仓库·python·c#·自动化·etl
yurenpai(27届找实习中)13 小时前
从零读懂AI智能客服(二):Java 多模块项目如何协作:Maven 依赖、Spring 注入与运行时装配
java·spring·maven
有来技术13 小时前
youlai-boot 实战:MinIO 停止维护,Docker 迁移 RustFS 完整记录
java·后端·docker
吴声子夜歌13 小时前
Java面试——设计模式(二)
java·设计模式·面试
JAVA面经实录91713 小时前
MySQL问题定位与性能优化完整知识体系
java·jvm·数据库·mysql·性能优化
Rain的Java大神之路13 小时前
Docker搭建Redis集群完全指南
java·运维·redis·后端·docker·容器·架构
Raas10013 小时前
大模型网关和API网关区别是什么?MAI Gateway统一AI流量治理
java·大数据·运维·人工智能·gateway·企业级·ai网关
BioRunYiXue13 小时前
RACE技术全攻略:从全长克隆到靶基因验证
java·javascript·网络·人工智能·科技·算法·eclipse
AC赳赳老秦14 小时前
个保法下数据处理:OpenClaw 自动过滤公开数据中的个人信息,保障采集分析合规性
java·python·sqlite·json·php·deepseek·openclaw