自定义@ResponseBody以及SpringMVC总结

2024-08-24 10:28

本文主要是介绍自定义@ResponseBody以及SpringMVC总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 1.需求分析
    • 2.目录
    • 3.自定义ResponseBody注解
    • 4.MonsterController.java
    • 5.Monster.java 实现序列化接口
    • 6.引入jackson
    • 7.Adapter.java 如果有@ResponseBody注解就返回json
    • 8.测试
    • 9.SpringMVC执行流程

1.需求分析

CleanShot 2024-08-08 at 14.23.16@2x

2.目录

CleanShot 2024-08-08 at 14.52.19@2x

3.自定义ResponseBody注解

package com.sunxiansheng.springmvc.annotation;import java.lang.annotation.*;/*** Description: 自定义ResponseBody注解* @Author sun* @Create 2024/8/6 16:09* @Version 1.0*/
@Retention(value = RetentionPolicy.RUNTIME) // 运行时生效
@Target(value = ElementType.METHOD) // 作用在方法上
@Documented // 生成文档
public @interface ResponseBody {}

4.MonsterController.java

    /*** 返回JSON数据的格式*/@ResponseBody // 返回JSON数据@RequestMapping(url = "/json/monster")public List<Monster> jsonMonster(HttpServletResponse response) {// 设置响应类型// 获取怪物列表List<Monster> monsters = monsterService.listMonster();// 日志打印monsterslog.info("monsters: {}", monsters);// 响应JSON数据return monsters;}

5.Monster.java 实现序列化接口

CleanShot 2024-08-08 at 14.53.48@2x

6.引入jackson

        <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.4</version> </dependency>

7.Adapter.java 如果有@ResponseBody注解就返回json

package com.sunxiansheng.springmvc.adaptor;import com.fasterxml.jackson.databind.ObjectMapper;
import com.sunxiansheng.springmvc.annotation.ResponseBody;
import com.sunxiansheng.springmvc.handler.HandlerMapping;
import com.sunxiansheng.springmvc.handler.SunHandler;
import com.sunxiansheng.springmvc.viewparser.ViewParser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;/*** Description: 适配器** @Author sun* @Create 2024/8/8 14:13* @Version 1.0*/
public class Adapter {private static final Logger log = LoggerFactory.getLogger(Adapter.class);/*** 3.适配器请求分发** @param request* @param response*/public static void executeDispatch(HttpServletRequest request, HttpServletResponse response) {// 4.调用映射器获取映射关系HandlerMapping handlerMapping = SunHandler.getHandlerMapping(request);// 如果没有找到映射器,就返回404if (handlerMapping == null) {try {response.getWriter().write("404 NOT FOUND");} catch (Exception e) {throw new RuntimeException(e);}return;}// 匹配成功,调用目标方法Object controller = handlerMapping.getController();Method method = handlerMapping.getMethod();// 5.调用参数解析器,解析参数Object[] args = ResolveArguments.resolveMethodArguments(request, response, method);// 日志,打印实参列表数组List<Class<?>> argsList = new ArrayList<>();for (Object arg : args) {argsList.add(arg.getClass());}log.info("实参列表:{}", argsList);try {// 反射调用方法Object invoke = method.invoke(controller, args);// 先判断有没有@ResponseBody注解,如果有则返回JSONif (method.isAnnotationPresent(ResponseBody.class)) {// 使用 Jackson 进行 JSON 序列化ObjectMapper objectMapper = new ObjectMapper();String jsonResponse = objectMapper.writeValueAsString(invoke);// 设置响应内容类型和编码response.setContentType("application/json;charset=utf-8");response.setCharacterEncoding("UTF-8");// 将 JSON 响应数据写入到响应输出流response.getOutputStream().write(jsonResponse.getBytes());} else {// 6.调用视图解析器,进行视图解析if (invoke instanceof String) {ViewParser.parse(invoke.toString(), request, response);}}} catch (Exception e) {throw new RuntimeException(e);}}}

8.测试

CleanShot 2024-08-08 at 14.55.48@2x

CleanShot 2024-08-08 at 14.56.46@2x

9.SpringMVC执行流程

  • 中央控制器是一个Servlet,配置了,在Tomcat启动时调用init方法
  • init方法完成初始化Spring容器,初始化映射器的操作
  • 浏览器发送请求,交给适配器完成请求分发
  • 适配器首先从映射器中获取映射关系,其中映射关系包括url、目标对象、Method对象
  • 适配器调用参数解析器根据形参列表的类型来填充实参列表,然后反射调用方法
  • 适配器检测方法是否有**@ResponseBody注解,如果有则返回Json数据,如果没有则将结果交给视图解析器**处理
  • 视图解析器根据冒号进行分割,请求转发或者重定向到指定的视图

这篇关于自定义@ResponseBody以及SpringMVC总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1102219

相关文章

Java数组初始化的五种方式

《Java数组初始化的五种方式》数组是Java中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

将Java项目提交到云服务器的流程步骤

《将Java项目提交到云服务器的流程步骤》所谓将项目提交到云服务器即将你的项目打成一个jar包然后提交到云服务器即可,因此我们需要准备服务器环境为:Linux+JDK+MariDB(MySQL)+Gi... 目录1. 安装 jdk1.1 查看 jdk 版本1.2 下载 jdk2. 安装 mariadb(my

SpringBoot中配置Redis连接池的完整指南

《SpringBoot中配置Redis连接池的完整指南》这篇文章主要为大家详细介绍了SpringBoot中配置Redis连接池的完整指南,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以... 目录一、添加依赖二、配置 Redis 连接池三、测试 Redis 操作四、完整示例代码(一)pom.

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

Java Optional的使用技巧与最佳实践

《JavaOptional的使用技巧与最佳实践》在Java中,Optional是用于优雅处理null的容器类,其核心目标是显式提醒开发者处理空值场景,避免NullPointerExce... 目录一、Optional 的核心用途二、使用技巧与最佳实践三、常见误区与反模式四、替代方案与扩展五、总结在 Java

基于Java实现回调监听工具类

《基于Java实现回调监听工具类》这篇文章主要为大家详细介绍了如何基于Java实现一个回调监听工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录监听接口类 Listenable实际用法打印结果首先,会用到 函数式接口 Consumer, 通过这个可以解耦回调方法,下面先写一个

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析