自定义@ResponseBody以及SpringMVC总结

news2024/9/21 21:07:18

文章目录

    • 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();
            // 日志打印monsters
            log.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);

        // 如果没有找到映射器,就返回404
        if (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注解,如果有则返回JSON
            if (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.coloradmin.cn/o/2069945.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据技术之 Flume概述、安装(1)

目录 Flume 概述 Flume 定义 为什么选用 Flume Flume 基础架构 Agent Source Sink Channel Event Flume 安装 Flume 安装部署 安装地址 安装部署 Flume 概述 Flume 定义 Flume 是 Cloudera 提供的一个高可用的、高可靠的、分布式的海量日志采集、聚合和传输的系统。Flume…

多系统萎缩不慌张,这些维生素是你的“守护神”✨

亲爱的朋友们&#xff0c;今天我们来聊聊一个可能不太为人熟知但至关重要的健康话题——多系统萎缩&#xff08;MSA&#xff09;。面对这样的挑战&#xff0c;除了医疗治疗&#xff0c;日常的营养补充也是不可或缺的一环。特别是维生素&#xff0c;它们在我们的身体中扮演着举足…

有无符号整形加减,截断,提升等问题解析

一&#xff1a;整形截断问题 1. 分析&#xff1a;-128 的原码是 10000000 00000000 00000000 10000000 补码是 11111111 11111111 11111111 10000000&#xff0c;因为是char 型&#xff0c;截断之后&#xff1a;10000000 %u 是打印无符号整数&#xff0c;整形提升补截断之后…

多态(详细介绍以及内存图展示)

什么是多态&#xff1f; 同类型的对象&#xff0c;表现出的不同形态 多态的表现形式 父类类型 对象名称 子类对象 多态的前提 1.有继承关系 2.有父类引用指向子类 Fu f new Zi() 3.有方法重写 多态的好处 使用父类型作为参数&#xff0c;可以接收所有子类对象 体现…

大模型从入门到精通,看这篇就够了,AI小白的大模型学习路径_大模型教程

写这篇文章的初衷&#xff1a;作为一个AI小白&#xff0c;把我自己学习大模型的学习路径还原出来&#xff0c;包括理解的逻辑、看到的比较好的学习材料&#xff0c;通过一篇文章给串起来&#xff0c;对大模型建立起一个相对体系化的认知&#xff0c;才能够在扑面而来的大模型时…

牛客小白月赛99

文章目录 A.材料打印B. %%%C.迷宫又是一年毕业季题目链接 A.材料打印 签到题&#xff0c;直接按照题意输出就行。赛时写的有点慢了&#xff0c;这种题应该一分钟之内写完的 void solve () {int n;cin>>n;for (int i1;i<n;i) {int a,b,c,d;cin>>a>>b>…

go const(常量)

常量介绍 示例 package mainimport ("fmt" )func main() {const name "tom"fmt.Println(name)const tax float64 0.8fmt.Println(tax) }go run const.go tom 0.8package mainimport ("fmt" )func main() {const a intfmt.Println(a) }go run…

SpringAop介绍与使用

AOP的介绍 在不修改原有代码的情况下 增强跟主要业务没有关系的公共功能代码到 之 前写好的方法中的指定位置 这种编程的方式叫AOP AOP的底层用的代理&#xff0c;代理是一种设计模式 静态代理 玩家类 代理类 他们的接口 最后用接口接收代理的类实现静态代理 总结&#x…

英特尔终止开发开源 H.265/HEVC 编码器项目

作为英特尔可扩展视频技术&#xff08;SVT&#xff09;计划的一部分&#xff0c;一直以来他们持续在开发 SVT-HEVC&#xff0c;这是一款 BSD 许可的高性能 H.265/HEVC 视频编码器&#xff0c;针对至强可扩展处理器和至强 D 处理器进行了优化。但最近他们改变了方向&#xff0c;…

kali安装

引言 Kali Linux 是一个基于 Debian 的 Linux 发行版&#xff0c;专门为渗透测试和安全审计而设计。它包含了大量的安全工具&#xff0c;如 Wireshark、Nmap、Metasploit 等&#xff0c;这些工具可以帮助安全专家和研究人员进行网络安全评估、漏洞检测和渗透测试。Kali Linux …

InternLM 2.5 书生·浦语 开源大模型本地部署体验

老牛同学之前偶尔刷到过InternLM大模型相关的介绍文章&#xff0c;因为在老牛同学心中&#xff0c;Qwen2千问才是国内开源模型中最适合自己的大模型&#xff0c;原因是自己在本地部署和应用Qwen2都非常满意&#xff0c;所以没有在意InternLM大模型&#xff0c;也就没有动力去了…

程序员的AI大模型进阶之旅,零基础入门到精通,收藏这一篇就够了

作为程序员&#xff0c;如果你有兴趣迈向AI大模型的进阶之旅&#xff0c;以下是一些步骤和资源可以帮助你&#xff1a; 基础知识&#xff1a;了解机器学习和深度学习的基础概念是重要的第一步。学习线性代数、概率论和统计学等数学基础知识&#xff0c;以及机器学习算法和神经网…

风波中坚守:技术应对突发故障的危与机

文章目录 快速响应与问题定位策略确定故障类型使用排查工具明确响应流程实时沟通与更新事后总结 健全的应急预案和备份机制制定应急预案定期演练数据备份和快速恢复机制持续改进 事后总结与持续改进分析问题根源定义改进措施促进团队学习培养危机意识 技术债务管理与监测识别与…

Netty基础知识

官网地址: https://netty.io/ 快速入门&#xff1a;https://netty.io/wiki/user-guide-for-4.x.html Netty 是一个 NIO 客户端服务器框架&#xff0c;方便快速、简单地开发网络应用程序。 NIO&#xff08;Non-blocking I/O&#xff0c;在Java领域&#xff0c;也称为New I/O&…

《牛虻》读后感

《牛虻》这本书是同事送的&#xff0c;最近换工作、搬家很多杂事&#xff0c;也就没有多少看书的兴致&#xff0c;所以断断续续看了快两周才看完。这是爱尔兰女作家埃塞尔丽莲伏尼契的代表作&#xff0c;在我国声名远播&#xff0c;是一代人的精神食粮。怀着崇敬的心情翻开这本…

淘宝天猫商品详情接口API解密:如何轻松找到最适合的商品?

在当今的电子商务时代&#xff0c;淘宝和天猫作为国内最大的电商平台&#xff0c;每天都有海量的商品供我们选择。如何从这庞大的商品库中寻找到最适合自己的商品&#xff1f;这就需要我们掌握一种高效的搜索方式——详情接口API解密。本文将为您详细解析这一技术&#xff0c;助…

基于强化学习的即时商店自动化管理

介绍 如今&#xff0c;提示是与大型语言模型 (LLM) 交互的主要模式。提示需要根据用户需求进行调整&#xff0c;为 LLM 提供正确的上下文和指导 — 以最大限度地提高获得“正确”响应的机会。 这导致了提示工程 [1] 的兴起&#xff0c;并成为一门专业学科&#xff0c;提示工程师…

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

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

EmguCV学习笔记 VB.Net 6.4 霍夫变换

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

提升大模型内容创作能力

前言 现在的大模型能够创作一些故事、小说等等&#xff0c;但是大多数时候创作出来的剧情都是泛泛而谈&#xff0c;并没人给读者很爽的感觉。近期已经有一些工作开始在该方面进行发力&#xff0c;即让大模型做内容消费&#xff0c;如果大模型能够源源不断的创作出好的剧情来供…