项目总体框架

news2024/9/21 0:26:28

一.后端(包装servlet)

        使用BaseServlet进行请求的初步处理(利用继承进行执行这个)

                在BaseServlet中  处理请求的类型找到对象的方法,并使用注解找到参数名,执行参数自动注入。

package com.csdn.controller;

import com.csdn.annotation.ParamName;
import com.csdn.annotation.RequestMethod;
import com.csdn.common.Message;
import com.csdn.util.ResponseUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;


public class BaseServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("进入service");


        /*request里的请求体里面储存着json格式的数据,其中存在一个键为method,*/
        ObjectMapper mapper = new ObjectMapper();
        JsonNode jsonNode = mapper.readTree(request.getReader());

        System.out.println("jsonNode:"+jsonNode);


        JsonNode methodNameNode = jsonNode.get("method");

        if (methodNameNode == null || !methodNameNode.isTextual()|| methodNameNode.asText().trim().isEmpty()) {
            throw new ServletException("没有指定方法名");
        }
        String methodName = methodNameNode.asText();
        System.out.println("方法名字:"+methodName);


        try {
            // 通过反射获取当前类的所有方法
            Method[] methods = this.getClass().getDeclaredMethods();
            for (Method method : methods) {
                // 检查方法是否被@RequestMethod注解标记
                if (method.isAnnotationPresent(RequestMethod.class)) {
                    RequestMethod requestMethod = method.getAnnotation(RequestMethod.class);
                    // 检查注解的值是否与请求中的方法名匹配
                    if (requestMethod.value().equals(methodName)) {

                        //得到参数
                        Object[] params = getParameters(method, jsonNode);
                        method.setAccessible(true);
                        // 调用找到的方法 并 自动注入参数
                        //result是一个java对象
                        Object result = method.invoke(this, params);
                        if (result != null) {
                            // 将返回值(java对象)转换为json格式
                            String message = mapper.writeValueAsString(result);
                            System.out.println(message);
                            response.getWriter().write(message);
                        } else {
                            response.getWriter().write("{}");
                            System.out.println("result 为空!  程序错误\n\n\n");
                        }
                        return;
                    }
                }
            }
        } catch (Exception e) {
            System.out.println(",没有找到对应方法");
            e.printStackTrace();
        }

    }

    // 参数注入(得到参数)
    private static Object[] getParameters(Method method, JsonNode jsonNode) {
        Class<?>[] paramTypes = method.getParameterTypes();
        Parameter[] parameters = method.getParameters();
        Object[] params = new Object[paramTypes.length];

        for (int i = 0; i < paramTypes.length; i++) {
            Parameter parameter = parameters[i];
            // 检查参数上是否有ParamName注解
            if (parameter.isAnnotationPresent(ParamName.class)) {
                ParamName paramNameAnnotation = parameter.getAnnotation(ParamName.class);
                String paramName = paramNameAnnotation.value();
                JsonNode paramValueNode = jsonNode.get(paramName);
                if (paramValueNode != null) {
                    // 根据实际类型转换参数值
                    params[i] = convertJsonNodeToJavaType(paramValueNode, paramTypes[i]);
                }
            } else {
                // 如果没有ParamName注解,使用默认逻辑处理
                System.out.println( "!!!\n\n\n没有ParamName注解\n\n\n");
            }
        }
        return params;
    }

    private static Object convertJsonNodeToJavaType(JsonNode node, Class<?> type) {
        ObjectMapper mapper = new ObjectMapper();
        try {
            // 尝试将JsonNode转换为Java对象
            return mapper.treeToValue(node, type);
        } catch (JsonProcessingException e) {
            // 处理转换失败的情况
            System.err.println("Failed to convert JSON node to Java type: " + type);
            return null; // 或者根据需要返回其他值
        }
    }





}

在controller类中(参数中使用注解,并在baseServlet中进行参数自动注入)

 

二.前端与后端交互的信息类

 这里响应对象,转化为json对象进行传输,并在前端并处理后端结果。

三.前端发送请求并响应后端结果

// 进行发送请求
axios.post('/csdn_war/user',sendMail).then(response => {
    if(response.data.state === 100){
        alert("邮箱未注册请重试!");
    }else if(response.data.state === 110){
        console.log("发送验证码成功!");
        sendVerifyCode2(sendButton2);
    }else{
        alert("后端出现错误!");
    }
})

 

 

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

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

相关文章

JAVA数据导出为Excel

目录 一、导入依赖 二、使用的相关类 1、XSSFWorkbook 构造方法 创建表 操作表 保存表 样式和格式 日期处理 密码保护 其他 2、XSSFSheet 获取属性和信息 行操作 列操作 表的属性 合并单元格 保护表 页眉和页脚 注释 其它 3、XSSFRow 获取属性和信息 单…

Redis 常用命令总结

文章目录 目录 文章目录 1 . 前置内容 1.1 基本全局命令 KEYS EXISTS ​编辑 DEL EXPIRE TTL TYPE 1.2 数据结构和内部编码 2. String类型 SET GET MGET MSET SETNX INCR INCRBY DECR DECYBY INCRBYFLOAT 命令小结 内部编码 3 . Hash 哈希类型 HSET …

如何用python远程测试连接redis服务器

前提条件 A&#xff1a;操作机&#xff08;操作系统不限&#xff09; B&#xff1a;装有redis的服务器&#xff08;linux系统&#xff09; 而且需要配置redis服务器允许外部连接。这个一般是在redis的配置文件里修改相关选项。redis.conf或者6379.conf就是redis的配置文件 b…

备考MS office 二级

word 1、分页符 布局-分隔符-分节符-下一页&#xff1a;第二张可以不同纸张大小、方向等 2、调整宽度&#xff1a;新文字宽度&#xff08;字符宽度&#xff09; 中文版式 3、字符间距 4、文本转换为表格 1、把 || 替换为逗号&#xff0c;方便查找 5、首字下沉 插入 - 首字下沉…

ActiveMQ 反序列化漏洞复现(CVE-2015-5254)

一、漏洞前言 Apache ActiveMQ是美国阿帕奇&#xff08;Apache&#xff09;软件基金会所研发的一套开源的消息中间件&#xff0c;它支持Java消息服务&#xff0c;集群&#xff0c;Spring Framework等。Apache ActiveMQ 5.13.0之前5.x版本中存在安全漏洞&#xff0c;该漏洞源于程…

一篇python常见的Pandas的数据功能的使用

当我们学习了如何使用 Pandas 进行数据的导入与导出,这为我们后续的数据处理打下了基础.此次我们将重点讨论数据选择与过滤.通过掌握这一部分的知识,你将能够轻松地从复杂的数据集中提取出所需的信息.接下来,我们将通过一些实例来逐步了解这些操作. 数据选择 数据选择主要是针…

二分查找 ,看这一篇就够了

什么是二分查找&#xff1f; 二分查找&#xff08;Binary Search&#xff09;是一种高效的查找算法&#xff0c;适用于在有序数组中查找特定元素。其基本思想是通过逐步缩小查找范围&#xff0c;每次将查找区间减半&#xff0c;从而大大提高查找效率。二分查找的时间复杂度为O(…

B样条曲线测试

实验效果&#xff1a; 绿色为A*规划的路径&#xff0c;蓝色为Bspline曲线 介绍 对A* 生成的路径进行B样条&#xff08;A* 和Bspline都是佬们写好的&#xff0c;我直接拿来用&#xff09; 样条曲线相关可参考文章&#xff1a;详解样条曲线&#xff08;上&#xff09;&#x…

基于LaMA-Factory微调llama3.1-8B

大模型的训练目前主要分为Pre-training和Post-training&#xff0c;受限于资源算力等原因&#xff0c;实际工作中更多用到的是SFT。 对于普通用户来说SFT仍然具备较高的门槛&#xff0c;需要了解一定的理论基础&#xff0c;准备用于微调的数据&#xff0c;由于不同基座模型相应…

xilinx通用RAM或者FIFO设计

1、在 Vivado 中&#xff0c;XPM&#xff08;Xilinx Parameterized Macros&#xff09;是 Xilinx 提供的一组预定义的、参数化的硬件描述语言 (HDL) 宏模块&#xff0c;用于简化设计流程和提高设计效率。XPM 模块通常用于实现常见的功能&#xff0c;比如存储器&#xff08;RAM/…

PWR电源控制(低功耗模式)

1 PWR简介 1 程序后面是空循环&#xff0c;即使不用也会耗电&#xff0c;所以有了低功耗&#xff08;例如遥控器&#xff09; 2 也要保留唤醒模式&#xff0c;如串口接收数据中断唤醒&#xff0c;外部中断唤醒&#xff0c;RTC闹钟唤醒&#xff0c;在需要工作是&#xff0c;ST…

docker装大米cms(damicms)各种cms可用相同办法

1.docker pull 拉取镜像文件 docker pull medicean/vulapps:base_lamp 2.使用docker运行 docker run -d -p 8080:80 medicean/vulapps:base_lamp 3将需要搭建的 CMS 项目源码放到 kali 中&#xff0c;这里以 damiCMS 为例 查看容器id docker ps 4进入dmCMS 所在目录&#…

基于Java+SpringBoot+Vue的新闻稿件管理系统

基于JavaSpringBootVue的新闻稿件管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末附源码下载链接&#x1f345; 哈…

利用高德API获取整个城市的公交路线并可视化(四)

副标题&#xff1a;公共汽电车站点覆盖率——以厦门市公交线路为例 书接上回&#xff0c;我们有了公交的线路、站点数据&#xff0c;并同时对数据质量进行了校验&#xff0c;但是不同城市情况不同&#xff0c;需要看当地对公交交通数据的开放程度&#xff0c;部分城市建设的有…

Linux系统运行模式以及链接文件

一.Linux系统运行模式 如上图所示&#xff0c;可以使用runlevel这条命令去查看当前系统的运行模式。 如上图所示&#xff0c;可以使用这条命令使得机器以字符模式启动。 如上图所示&#xff0c;可以使用这条命令使得机器以图像化界面启动。 二.链接文件 链接文件类型&#xff…

Aigtek电压放大器的技术指标是什么

电压放大器是一种电路&#xff0c;用于将低电压信号放大为高电压信号。它在电子、通信、音频和视频等领域广泛应用。下面是电压放大器电路的一些特点。 放大倍数高&#xff1a;电压放大器的主要功能是将输入信号的幅度放大到所需的输出电压。因此&#xff0c;电压放大器的一个重…

(Postman)接口测试基础应用

目录 ​编辑 1.简介与分类 2.接口测试流程及用例设计 3. 实战接口介绍 4.postman的简介&#xff0c;安装&#xff0c;注册 5.get请求和响应页签详解 6. 问题​编辑 1.环境变量和全局变量&#xff1a;globals--全局变量 2.接口关联 1.简介与分类 1.接口测试是测试系统组…

重头开始嵌入式第三十四天(数据库二)

sqlite3的一些补充 目录 sqlite3的一些补充 1.事物 2.连接&#xff0c;联合 3.触发器 4.子查询 1.事物 数据库事务是数据库管理系统执行过程中的一个逻辑单位&#xff0c;它由一系列对数据库的操作组成。 一、事务的特性 1. 原子性&#xff08;Atomicity&#xff09…

移动端设计规范:提升用户体验的核心要素

随着移动互联网的普及&#xff0c;移动端设计已成为用户体验的关键一环。设计师不仅需要考虑视觉美感&#xff0c;还必须确保设计符合用户操作习惯&#xff0c;提高用户的操作效率。本文将探讨移动端设计的核心规范&#xff0c;帮助设计师打造出既美观又实用的应用界面。 一、…

uniapp动态页面API

目录 uni.setNavigationBarTitle动态设置标题 uni.showNavigationBarLoading为标题添加加载动画与uni.hideNavigationBarLoading停止加载动画 ​编辑 uni.setNavigationBarColor用于设置导航栏的颜色&#xff0c;包括背景颜色和文字颜色。这对于自定义应用的主题和风格非常有…