手写SpringMVC之ApplicationContextListener
什么是Spring MVC?
Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就包含在Spring Framework中。正式名称“Spring Web MVC”来自其源模块的名称( spring-webmvc ),但它通常被称为“Spring MVC”。
手写Spring MVC(一)
创建项目
创建父工程 [ 选择9号模板 :site-simple],命名为shop(以商城为例子)
创建子工程 [ 选择10号模板:webapp],命名为shop-web
创建子工程 [ 选择7号模板:quickstart],命名为shop-mvc
依赖准备
servlet-api
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope>
</dependency>
lombok
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version>
</dependency>
编译插件
<build><finalName>shop_web</finalName><pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (maybe moved to parent pom) --><plugins><!--这个插件就是java类生成class的编译插件--><plugin><artifactId>maven-compiler-plugin</artifactId><configuration><!--编译参数--><compilerArgument>-parameters</compilerArgument><source>1.8</source><target>1.8</target></configuration></plugin></plugins></pluginManagement>
</build>
创建文件
-
在shop-web工程下创建以下目录

-
在mvc工程下创建以下目录

文件详解
mvc工程
-
cn.cnmd.shop.mvc.annotation:主要是注解,包括控制器、路由映射、配置
- cn.cnmd.shop.mvc.annotation.Controller
package cn.cnmd.shop.mvc.annotation;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface Controller { }- cn.cnmd.shop.mvc.annotation.RequestMapping
package cn.cnmd.shop.mvc.annotation;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface RequestMapping {String value(); }- cn.cnmd.shop.mvc.annotation.Configuration
package cn.cnmd.shop.mvc.annotation;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface Configuration {String value(); } -
cn.cnmd.shop.mvc.canstant:包含了常见的错误码和错误信息
-
cn.cnmd.shop.mvc.canstant.ResponseCodeInterface
package cn.cnmd.shop.mvc.constant;public interface ResponseCodeInterface {int getCode();String getMessage();void setCode(int code);void setMessage(String message); } -
cn.cnmd.shop.mvc.canstant.ResponseCode
package cn.cnmd.shop.mvc.constant;public enum ResponseCode implements ResponseCodeInterface {CONFIG_EXCEPTION(100, "config的配置信息出错"),CONFIGURATION_EXCEPTION(101, "需要配置Configuration这个注解"),CLASS_FILE_EXCEPTION(102, "class文件转换异常"),REQUEST_MAPPING_PATH_EXCEPTION(103, "RequestMapping地址设置有误"),REQUEST_PATH_EXCEPTION(104, "uri映射错误"),EXCEPTION_CONFIG_EXCEPTION(105, "未配置全局异常的路径"),ADVISER_CONFIG_EXCEPTION(106, "未配置处理器的路径");private int code;private String message;ResponseCode(int code, String message) {this.code = code;this.message = message;}@Overridepublic int getCode() {return code;}@Overridepublic String getMessage() {return message;}@Overridepublic void setCode(int code) {this.code = code;}@Overridepublic void setMessage(String message) {this.message = message;} }
-
-
cn.cnmd.shop.mvc.container:容器,用于存储项目启动之后创建的BeanDefinition对象
-
cn.cnmd.shop.mvc.container.BeanContainer
package cn.cnmd.shop.mvc.container;import cn.cnmd.shop.mvc.model.BeanDefinition; import lombok.Getter;import java.util.Map; import java.util.concurrent.ConcurrentHashMap;public class BeanContainer {@Getterprivate static Map<String, BeanDefinition<?>> maps = null;static {maps = new ConcurrentHashMap<>();} }
-
-
cn.cnmd.shop.mvc.exception:异常类,用于处理异常
-
cn.cnmd.shop.mvc.exception.FrameWorkException
package cn.cnmd.shop.mvc.exception;import lombok.AllArgsConstructor; import lombok.Data;@AllArgsConstructor @Datapublic class FrameWorkException extends RuntimeException {private int code;private String message; }
-
-
cn.cnmd.shop.mvc.listener:监听器,主要作用是在项目启动时扫描controller下的文件生成BeanDefinition对象
-
cn.cnmd.shop.mvc.listener.ApplicationListener
package cn.cnmd.shop.mvc.listener;import cn.cnmd.shop.mvc.annotation.Configuration; import cn.cnmd.shop.mvc.annotation.RequestMapping; import cn.cnmd.shop.mvc.constant.ResponseCode; import cn.cnmd.shop.mvc.container.BeanContainer; import cn.cnmd.shop.mvc.exception.FrameWorkException; import cn.cnmd.shop.mvc.model.BeanDefinition; import cn.cnmd.shop.mvc.model.MethodDefinition; import cn.cnmd.shop.mvc.model.ParameterDefinition;import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import java.io.File; import java.lang.reflect.Method; import java.lang.reflect.Parameter; import java.util.ArrayList; import java.util.List; import java.util.Map;public class ApplicationListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {/** 扫描web项目的Controller层* 封装成类描述类的对象* 添加到容器中 -- Key(父级uri+子级uri) Value(类描述类的对象)*/ServletContext servletContext = sce.getServletContext();String config = servletContext.getInitParameter("config");//cn.cnmd.config.AppConfigif (config == null) {throw new FrameWorkException(ResponseCode.CONFIG_EXCEPTION.getCode(), ResponseCode.CONFIG_EXCEPTION.getMessage());}//获取配置类的class对象Class<?> configurationClass = getConfiguration(config);//通过配置类的class对象拿到 AppConfig注解 中的cn.cnmd.controllerString controllerPosition = getControllerPosition(configurationClass);//D:\Desktop\code\apache-tomcat-8.0.49\webapps\ROOT\WEB-INF\classes\cn\cnmd\controllerString controllerAbsolutePath = getControllerAbsolutePath(servletContext, controllerPosition);//获取controller文件夹下所有的文件List<File> fileList = new ArrayList<>();findFileByPath(fileList, controllerAbsolutePath);//文件对象集合 --> class对象集合List<Class<?>> classes = transformTo(servletContext, fileList);//封装成类描述类的对象: BeanDefinition -> MethodDefinition -> ParameterDefinitionhandleController(classes);}/*** 通过web.xml的配置* <context-param>* <param-name>config</param-name>* <param-value>cn.cnmd.config.AppConfig</param-value>* </context-param>* 参数 [config] 获取的 [cn.cnmd.config.AppConfig] 获取配置文件类的class对象** @param config [cn.cnmd.config.AppConfig]* @return class对象*/public Class<?> getConfiguration(String config) {try {return Class.forName(config);} catch (ClassNotFoundException e) {throw new RuntimeException(e);}}/*** 通过配置文件类的class对象获取注解中的controller的类的全限定名 [cn.cnmd.controller]** @param configurationClass 配置文件类的class对象* @return controller的类的全限定名*/public String getControllerPosition(Class<?> configurationClass) {Configuration annotation = configurationClass.getAnnotation(Configuration.class);if (annotation == null) {throw new FrameWorkException(ResponseCode.CONFIGURATION_EXCEPTION.getCode(), ResponseCode.CONFIGURATION_EXCEPTION.getMessage());}return annotation.value();}/*** 通过配置文件类 [AppConfig] 的注解信息 [cn.cnmd.controller] 获取controller包的发布路径** @param servletContext servlet上下文对象* @param controllerPosition 配置文件类 [AppConfig] 的注解信息 [cn.cnmd.controller]* @return controller包的发布路径*/public String getControllerAbsolutePath(ServletContext servletContext, String controllerPosition) {//D:\Desktop\code\apache-tomcat-8.0.49\webapps\ROOT\WEB-INF\classesString absolutePath = servletContext.getRealPath("WEB-INF" + File.separator + "classes");controllerPosition = controllerPosition.replace(".", File.separator);return absolutePath + File.separator + controllerPosition;}/*** 通过controller包路径找到路径下所有文件对象** @param fileList 文件对象集合* @param controllerAbsolutePath controller包的发布路径*/public void findFileByPath(List<File> fileList, String controllerAbsolutePath) {File file = new File(controllerAbsolutePath);File[] files = file.listFiles();if (files != null) {for (File f : files) {if (f.isDirectory()) {findFileByPath(fileList, f.getAbsolutePath());} else if (f.isFile()) {fileList.add(f);}}}}public List<Class<?>> transformTo(ServletContext servletContext, List<File> fileList) {List<Class<?>> classes = new ArrayList<>();for (File file : fileList) {//D:\Desktop\code\apache-tomcat-8.0.49\webapps\ROOT\WEB-INF\classes\cn\cnmd\controller\UserController.classString classPath = file.getAbsolutePath();String absolutePath = servletContext.getRealPath("WEB-INF" + File.separator + "classes");//cn\cnmd\controller\UserController.class --> cn.cnmd.controller.UserControllerclassPath = classPath.substring(absolutePath.length() + 1).split("\\.")[0].replace("\\", ".");System.out.println(classPath);Class<?> clazz = null;try {clazz = Class.forName(classPath);} catch (ClassNotFoundException e) {throw new RuntimeException(e);}classes.add(clazz);}return classes;}public void handleController(List<Class<?>> classes) {Map<String, BeanDefinition<?>> maps = BeanContainer.getMaps();for (Class<?> clazz : classes) {try {//父级url requestMappingPath --> requestMapping.value()RequestMapping requestMapping = clazz.getAnnotation(RequestMapping.class);String requestMappingPath1 = requestMapping.value();//类名 beanName --> clazz.getName()String beanName = clazz.getName();//controller的类对象 t --> clazz.newInstance()Object t = clazz.newInstance();//方法描述对象Method[] methods = clazz.getMethods();for (Method method : methods) {method.setAccessible(true);if (!method.isAnnotationPresent(RequestMapping.class)) {continue;}RequestMapping requestMapping1 = method.getAnnotation(RequestMapping.class);//子级url requestMappingPath --> requestMapping1.value()String requestMappingPath2 = requestMapping1.value();//方法名 methodName --> method.getName()String methodName = method.getName();//方法对象 method --> method//返回值类型 returnType --> method.getReturnType()Class<?> returnType = method.getReturnType();//参数描述对象Parameter[] parameters = method.getParameters();List<ParameterDefinition> parameterDefinitions = new ArrayList<>();for (int i = 0; i < parameters.length; i++) {Class<? extends Parameter> paramClass = parameters[i].getClass();//参数名 parameterName --> paramClass.getName()String parameterName = paramClass.getName();//参数类型 type --> paramClass//参数下标 index --> iParameterDefinition parameterDefinition = new ParameterDefinition(parameterName, paramClass, i);parameterDefinitions.add(parameterDefinition);}MethodDefinition methodDefinition = new MethodDefinition(requestMappingPath2, methodName, method, returnType, parameterDefinitions);BeanDefinition<?> beanDefinition = new BeanDefinition<>(requestMappingPath1, beanName, clazz, t, methodDefinition);String route = requestMappingPath1 + File.separator + requestMappingPath2;maps.put(route, beanDefinition);}} catch (InstantiationException | IllegalAccessException e) {throw new RuntimeException(e);}}} }
-
-
cn.cnmd.shop.mvc.model:类描述类,包括参数描述类、方法描述类、类描述类
-
cn.cnmd.shop.mvc.model.ParameterDefinition
package cn.cnmd.shop.mvc.model;import com.sun.istack.internal.NotNull; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;/*** 参数描述类*/@NoArgsConstructor @AllArgsConstructor @Data public class ParameterDefinition {private String name;//参数名private Class<?> type;//参数类型private int index;//参数下标 } -
cn.cnmd.shop.mvc.model.MethodDefinition
package cn.cnmd.shop.mvc.model;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;import java.lang.reflect.Method; import java.util.List;@NoArgsConstructor @AllArgsConstructor @Data public class MethodDefinition {private String requestMappingPath;//子级urlprivate String methodName;//方法名private Method method;//方法对象private Class<?> returnType;//返回值类型private List<ParameterDefinition> parameters;//参数描述列表 } -
cn.cnmd.shop.mvc.model.BeanDefinition
package cn.cnmd.shop.mvc.model;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;@NoArgsConstructor @AllArgsConstructor @Data public class BeanDefinition<T> {private String requestMappingPath;//父级urlprivate String name;//类名private Class<?> beanClass;//controller类的class对象private T t;//controller类对象private MethodDefinition methodDefinition;//方法描述对象 }
-
web工程
-
cn.cnmd.config
-
cn.cnmd.config.AppConfig
package cn.cnmd.config;import cn.cnmd.shop.mvc.annotation.Configuration;@Configuration("cn.cnmd.controller") public class AppConfig {}
-
-
cn.cnmd.controller:存放各种controller
-
cn.cnmd.controller.UserController
package cn.cnmd.controller;import cn.cnmd.pojo.User; import cn.cnmd.shop.mvc.annotation.Controller; import cn.cnmd.shop.mvc.annotation.RequestMapping;@Controller @RequestMapping("user") public class UserController {@RequestMapping("login1")public void login(String username, String password) {}@RequestMapping("login2")public void login(User user) {}public void method(String name){} } -
cn.cnmd.controller.back.AdminController
package cn.cnmd.controller.back;import cn.cnmd.shop.mvc.annotation.Controller; import cn.cnmd.shop.mvc.annotation.RequestMapping;@Controller @RequestMapping("admin") public class AdminController {@RequestMapping("login")public void login(String name, String password){} }
-
-
cn.cnmd.pojo:用于存放web项目中的JavaBean对象
-
cn.cnmd.pojo.User
package cn.cnmd.pojo;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;@NoArgsConstructor @AllArgsConstructor @Data public class User {String name;int age;String sex; }
-
ApplicationContextListener扫描过程(个人理解)

roller
@RequestMapping(“admin”)
public class AdminController {
@RequestMapping("login")public void login(String name, String password){}}```
-
cn.cnmd.pojo:用于存放web项目中的JavaBean对象
-
cn.cnmd.pojo.User
package cn.cnmd.pojo;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;@NoArgsConstructor @AllArgsConstructor @Data public class User {String name;int age;String sex; }
-
ApplicationContextListener扫描过程(个人理解)
[外链图片转存中…(img-wN91i1Ja-1719492618962)]

相关文章:
手写SpringMVC之ApplicationContextListener
什么是Spring MVC? Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就包含在Spring Framework中。正式名称“Spring Web MVC”来自其源模块的名称( spring-webmvc ),但它通常被称为“Spring MVC”。 手写…...
Paimon 在汽车之家的业务实践
汽车之家基于Paimon的实践 摘要:本文分享自汽车之家的王刚、范文、李乾⽼师。介绍了汽车之家基于 Paimon 的一些实践,和一些背景。内容主要为以下四部分: 一、背景 二、业务实践 三、paimon 优化实践 四、未来规划 一、背景 在使用Paimon之前…...
2024-06-27 问AI: 介绍一下 LLM building process
文心一言 LLM(Large Language Model,大语言模型)的构建过程是一个复杂且资源密集的任务,涉及多个关键步骤。以下是LLM构建过程的主要阶段,以及每个阶段的一些关键考虑因素: 数据收集与预处理:…...
猫也有自动厕所上了吗?自费分享好用的智能猫砂盆,看完不亏。
还有人在用普通猫砂盘吗?之前我也是用的普通猫砂盘,但我发现只要我在上班时间,我就无法顾忌到小猫的便便,但又不想回家就闻到一股臭味,更何况现在夏天也快到了,便便残留一会就会发酵发臭,导致生…...
《分析模式》漫谈07-怎样把一张图从不严谨改到严谨
DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 下图是《分析模式》原书第2章的图2.10,里面有一些错误和考虑不周的地方: 2004中译本和2020中译本的翻译如下: 基本上都是照搬,没有改过…...
纯干货丨知乎广告投放流程和避坑攻略
精准有效的广告投放企业获客的关键,知乎作为中国最大的知识分享平台,拥有着高质量的用户群体和高度的用户粘性,为广告主提供了独一无二的品牌传播与产品推广平台。然而,如何在知乎上高效、精准地进行广告投放,避免不必…...
mac 安装mysql启动报错 ERROR!The server quit without update PID file
发现问题: mac安装mysql初次启动报错: 一般出现这种问题,大多是文件夹权限,或者以前安装mysql卸载不干净导致。首先需要先确定问题出在哪?根据提示我们可以打开mysql的启动目录,查看启动日志。 问题解决&a…...
TypeScrip环境安装与基础
TS环境安装与基础 文章目录 一、什么是TypeScript(微软开发的)二、TypeScript的特性三、环境安装node安装配置详解(常用:outDir,strict ) 四、注释方式五、数据类型 一、什么是TypeScript(微软开…...
6.27学习总结
一、高数 1、斯托克斯公式(曲线<->曲面):看清顺时针(负)/逆时针(正) 2、曲面方程变二重积分: 前、上、右:正; 后、下、左:负; 3…...
选择第三方软件测试机构做验收测试的好处简析
企事业单位在自行开发完软件系统或委托软件开发公司生产软件之后,有一个必经流程就是验收测试,以验证该产品是否符合用户需求、是否可以上线。为了客观评估所委托生产的软件质量,第三方软件测试机构往往成为企事业单位做验收测试的首选&#…...
【图书推荐】CPython设计与实现“适合所有Python工程师阅读的书籍”
目录 一、图书推荐 |【CPython设计与实现】 1.1、书籍介绍 1.2、内容简介 1.3、适合哪些人阅读 1.4、作者译者简介 1.5、购买链接 一、图书推荐 |【CPython设计与实现】 "深入Python核心,揭秘CPython的设计智慧!📖 对于每一位热衷…...
原创作品—医疗行业软件界面UI、交互设计
在医疗行业大屏UI设计中,首要的是以用户为中心,深入理解医生、护士、管理层等用户群体的具体需求和工作流程。大屏设计应直观展示关键医疗数据、患者信息、设备状态等,确保用户能够迅速、准确地获取所需信息。同时,功能布局应合理…...
[C++深入] --- vector容器浅析
vector是一个封装了动态大小数组的顺序容器,它能够存放各种类型的对象。 可以删除元素、可以插入元素、可以查找元素,做这些工作我们无需管理容器内存。容器内存管理,这种脏活累活全部交由vector管理。了解一下vector的内存管理策略,能够更加充分的利用内存。 1 vector内存…...
用MySQL和navicatpremium做一个项目—(财务管理系统)。
1 ER图缩小的话怕你们看不清,所以截了两张图 2 vsdx绘图结果 3DDL和DML,都有点长分了好多次上传,慢慢看 DDL -- 用户表 CREATE TABLE users (user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT 用户ID,username VARCHAR(50) NOT NULL UNIQUE COMMENT 用…...
Jenkins教程-5-gitee自动化测试任务构建
上一小节我们学习了Jenkins构建gitlab自动化测试任务的方法,本小节我们讲解一下gitee自动化测试任务的构建方法。 接下来我们以windows系统为例,讲解一下构建实际自动化测试任务的具体步骤。 安装git和gitee插件 点击进入Jenkins插件管理页面 安装完插…...
CAN-bus总线在冷链运输中的应用
CAN-bus总线在冷链运输中的应用 如图1所示,疫苗冷链是指为保证疫苗从疫苗生产企业到接种单位运转过程中的质量而装备的存储、运输冷藏设施、设备。由于疫苗对温度敏感,从疫苗制造的部门到疫苗使用的现场之间的每一个环节,都可能因温度过高而失效。在储运过程中,一旦温度超…...
Vue 与 React 区别
Vue.js和React是现代Web开发中两种非常流行的前端框架,两者在**核心概念、组件以及生态系统扩展性**等方面存在区别。具体分析如下: 1. **核心概念** - **Vue**:Vue是一个渐进式JavaScript框架,它致力于视图层,易于上手…...
docker+[nginx] 部署nacos2.x 集群
docker+[nginx] 部署nacos2.x 集群 由于机器有限,本文搭建伪集群 准备: nacos1 :192.168.50.9:8848 nacos2:192.168.50.9:8858 nacos3:192.168.50.9:8868 mysql nginx 【可选,见文末】 创建容器共享网络 便于直接使用容器名连接mysql,如果不创建,连接mysql直接使用i…...
Linux学习第54天:Linux WIFI 驱动:蓝星互联
Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 数字化、现代化的今天,随处的WIFI给与了大众极大的方便,也感受到了科技的力量。万物互联、无线互联越来越成为一个不可逆转的趋势。现在比较火…...
芯片后端之 PT 使用 report_timing 产生报告如何阅读
今天,就PT常用的命令,做一个介绍,希望对大家以后的工作,起到帮助作用。 在PrimeTime中,使用report_timing -delay max命令生成此报告。switch -delay max表示定时报告用于设置(这是默认值)。 首先,我们整…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
