自定义@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数据,如果没有则将结果交给视图解析器**处理
  • 视图解析器根据冒号进行分割,请求转发或者重定向到指定的视图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/408368.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简单实现进度条效果(vue2)

如果用echarts或者其他图表来写个进度条有点大材小用&#xff0c;所以直接简单html、js写一下就可以&#xff1b; 以下代码基于vue2&#xff0c; 部分代码来自国内直连GPT/Claude镜像站 <template><div class"progress-container"><div class"p…

springboot框架中filter过滤器的urlPatterns的匹配源码

如下图所示&#xff0c;我使用WebFilter注解的方式定义了一个过滤器&#xff0c;同时定义了过滤器的过滤条件 urlPatterns为/*,可能很多人都知道filter的/*代表所有URL都匹配&#xff0c;但是源码在哪里呢 先打断点看一下调用链 然后跟着调用链慢慢点&#xff0c;看看哪里开始…

【Material-UI】深入了解Radio Group中的useRadioGroup Hook

文章目录 一、什么是useRadioGroup&#xff1f;1.1 Hook的返回值 二、useRadioGroup的基本用法2.1 代码示例2.2 代码解析 三、useRadioGroup的应用场景3.1 动态样式调整3.2 高级交互逻辑 四、使用useRadioGroup的最佳实践4.1 保持代码简洁4.2 结合主题定制4.3 注意无障碍设计 五…

【论文分享】Graviton: Trusted Execution Environments on GPUs 2018’OSDI

目录 AbstractIntroductioncontributions BackgroundGPUSoftware stackHardwareContext and channel managementCommand submissionProgramming modelInitializationMemory allocationHost-GPU transfersKernel dispatch Sharing Intel SGX Threat ModelOverviewGraviton Archi…

【动态规划】第 N 个泰波那契数

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 题目讲解算法原理代码实现 题目 题目如下&#xff1a; 讲解算法原理 我们先说一下动态规划题目的整体做题思路&#xff1a; 第一步&#xff1a; 状态表示 什么是状态表示? 做动态规划类题目一般…

appium学习记录

免责声明 本文内容仅供参考&#xff0c;将appuim与爬虫技术相结合可能违反某些app的使用条款和法律法规。作者不对因此产生的法律问题或技术风险负责。建议读者在进行爬取操作前&#xff0c;充分了解相关法律法规并确保合规。 1、初识appium 背景&#xff1a;部分APP需要反编译…

<数据集>遥感船舶识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;15047张 标注数量(xml文件个数)&#xff1a;15047 标注数量(txt文件个数)&#xff1a;15047 标注类别数&#xff1a;25 标注类别名称&#xff1a;[Aircraft Carrier, Auxiliary Ships, Other Ship, Other Warship,…

vue项目中,修改elementui一些复杂控件样式

1.前言 在vue项目中&#xff0c;我们为了快速开发&#xff0c;会用到elementui。但很多时候&#xff0c;elementui的样式不满足于我们项目的样式需求。这时候我们需要修改原生elementui的样式。 2.简单控件的样式修改 对于elementui中一些简单的控件&#xff0c;如按钮之类的…

三维平面电磁铁、交流电磁铁、显微镜磁场北京大学方案

根据用户北京大学需求设计制造方案如下 三维平面电磁铁产品规格 5MPS63-25型三维平面电磁铁&#xff0c;X、Y方向磁场由2对正交的磁极产生&#xff0c;Z轴由一组同轴线圈产生&#xff1b; 每轴对应的两个线圈正接产生均匀磁场&#xff0c;反接产生梯度磁场&#xff1b; …

Canvas 动画: atan2 三角函数与鼠标跟随效果

这个案例展示了如何使用HTML5的Canvas和JavaScript实现一个动态效果&#xff1a;在画布上绘制一个箭头&#xff0c;并让它实时跟随鼠标移动。这个小项目不仅有趣&#xff0c;还能帮助你理解编程和基本数学概念的实际应用。 项目需求 我们的目标是在一个画布上绘制一个箭头&…

Java二十三种设计模式-解释器模式(23/23)

本文深入探讨了解释器模式&#xff0c;这是一种行为设计模式&#xff0c;用于构建和解释执行自定义语言&#xff0c;提供了实现方法、优点、缺点、与其他模式的比较、最佳实践和替代方案的全面分析&#xff0c;帮助开发者在实际应用中做出明智的设计选择。 解释器模式&#xff…

趣味算法------尾部零的个数(C语言,python双重解法)

目录 题目描述&#xff1a; 解题思路&#xff1a; 具体代码&#xff1a; 注意&#xff1a; 题目描述&#xff1a; 给出数字 n(0<n<1000000)&#xff0c;计算出 n 阶乘尾部零的个数。 输入输出格式 输入格式 一个整数。 输出格式 一个整数。 输入输出样例 输入 11 输…

pytorch基础学习

环境安装 mac安装conda&#xff08;为什么安装conda? conda类似沙箱&#xff0c;将一个一个环境隔离起来&#xff0c;解决Python工程之前的包冲突问题&#xff09; 下载Miniconda安装器:https://docs.conda.io/en/latest/miniconda.html 执行dmg安装。 安装完成后&#xff0c…

【数据结构5】二叉搜索树(插入、查询、删除)

1 二叉搜索树 1.1 二叉搜索树-插入 1.2 二叉搜索树-查询 1.3 二叉搜索树-删除 1 二叉搜索树 二叉搜索树是一颗二叉树且满足性质:设是二叉树的一个节点。 如果y是x左子树的一个节点&#xff0c;那么y.key< x.key;如果y是x右子树的一个节点&#xff0c;那么y.key > x.key。…

绘剪批量软件——绘剪批量软件

批量软件是一种可以批量处理大量数据或操作的软件。它通常通过自动化的方式&#xff0c;快速高效地完成任务&#xff0c;减少人工操作的时间和工作量。批量软件可以用于数据处理、文件转换、批量重命名、批量下载等各种场景。 绘剪批量软件——绘剪TK批量软件 AIWYZ77 批量软…

docker容器数据卷、数据卷基本案例

在docker里面创建也会在主机中生成文件 并且docker停止 时在主机中创建文件仍然可以生成在docker中

机器学习入门指南:如何构建智能预测模型

【机器学习】&#xff1a;入门从零开始的指南 随着人工智能的快速发展&#xff0c;机器学习&#xff08;Machine Learning&#xff09;已经成为技术领域的热点话题。无论是推荐系统、语音识别、自动驾驶汽车&#xff0c;还是自然语言处理&#xff0c;机器学习的应用随处可见。…

动态规划-打家劫舍Ⅱ

该题是打家劫舍Ⅰ的升级版并与其相关&#xff0c;如果对其感兴趣的话可以先看看打家劫舍Ⅰ 题目描述 一个专业的小偷&#xff0c;计划偷窃一个环形街道上沿街的房屋&#xff0c;每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈 &#xff0c;这意味着第一个房屋和最后…

如何在IIS中为typecho博客启用HTTPS访问

在上篇文章中&#xff0c;介绍了如何安装typecho博客系统&#xff0c;默认是没有启用https访问的&#xff0c;这篇文章介绍如何 在IIS中开启 https访问。 开启https访问需要两个步骤&#xff1a; 1、申请 一个ssl证书&#xff0c;我这里以阿里云上面的申请流程为例。其它云服务…

Variomes:支持基因组变异筛选的高召回率搜索引擎

《Bioinformatics》2022 Variomes&#xff1a; https://candy.hesge.ch/Variomes Source code&#xff1a; https://github.com/variomes/sibtm-variomes SynVar&#xff1a; https://goldorak.hesge.ch/synvar 文章摘要&#xff08;Abstract&#xff09; 动机&#xff08;Mot…