当前位置: 首页 > news >正文

SpringMVC的注解、参数传递、页面跳转

 

一.SpringMvc常用注解

常用注解

@RequestMapping:@RequestMapping注解是一个用来处理请求地址映射的注解,可用于映射一个请求或一个方法,可以用在类或方法上。
@RequestParam:@RequestParam主要用于将请求参数区域的数据映射到控制层方法的参数上

@ModelAttribute:

绑定请求参数到命令对象:放在功能处理方法的入参上时,用于将多个请求参数绑定到一个命令对象,从而简化绑定流程,而且自动暴露为模型数据用于视图页面展示时使用;

暴露表单引用对象为模型数据:放在处理器的一般方法(非功能处理方法)上时,是为表单准备要展示的表单引用对象,如注册时需要选择的所在城市等,而且在执行功能处理方法(@RequestMapping注解的方法)之前,自动添加到模型对象中,用于视图页面展示时使用;

暴露@RequestMapping方法返回值为模型数据:放在功能处理方法的返回值上时,是暴露功能处理方法的返回值为模型数据,用于视图页面展示时使用。

@SessionAttributes:用于将数据存储到会话(Session)中,在多个请求之间共享数据。

@RequestBody:用于将方法的返回值直接作为响应体返回给客户端,常用于返回JSON数据。

@RequestHeader:使用 @RequestHeader 注解可以获取指定的请求头信息。

@PathVariable:该注解请求URI中的模板变量部分到处理器功能处理方法的方法参数上的绑定。

@CookieValue:@CookieValue注解主要是将请求的Cookie数据,映射到功能处理方法的参数上。
使用人类思维解释

解释:

当你在使用 Spring MVC 框架来构建一个 Web 应用程序时,你会经常使用一些特殊的注解来告诉框架如何处理请求和数据。让我用更容易理解的方式解释这些注解:

  1. @RequestMapping: 这就像一个路标,告诉框架哪个方法应该处理特定的 URL 请求。你可以把它想象成一本地图上的指示牌,告诉你如何到达特定的目的地。

  2. @RequestParam: 当你需要从客户端请求中获取参数时,这个注解就派上用场了。它帮助你将请求中的数据映射到你的方法参数上,就像你从用户口中听到点菜的内容一样。

  3. @ModelAttribute: 这个注解有三种用法:

    • 当放在方法参数上时,它可以将多个请求参数绑定到一个命令对象,使得参数的绑定变得更加简单。想象一下,你收到了一个复杂的订单,这个注解可以帮助你将这个订单整理成一个简单的格式。
    • 当放在一般方法上时,它可以为表单准备要展示的数据,比如在注册页面中选择所在城市的选项。这样,数据会自动添加到模型对象中,以便在视图页面上展示。
    • 当放在功能处理方法(@RequestMapping 注解的方法)的返回值上时,它将方法的返回值暴露为模型数据,以便在视图页面上使用。
  4. @SessionAttributes: 这个注解用于将数据存储在会话(Session)中,以便在多个请求之间共享数据。就像你在不同的餐厅订了多道菜,然后在同一个餐厅一次一道地享用一样。

  5. @RequestBody: 当你想要将方法的返回值直接作为响应体返回给客户端时,可以使用这个注解。通常用于返回 JSON 数据,就像你点了一份外卖,外卖盒里就是你要的食物。

  6. @RequestHeader: 用于获取请求头的信息。你可以想象它为你提供了关于客户端请求的额外信息,就像你在餐馆里点菜时,服务员询问你的特殊要求。

  7. @PathVariable: 当你需要从请求的 URL 中提取特定的部分作为方法的参数时,可以使用这个注解。就像你在路上遇到一个特殊标志,告诉你需要走哪条路线。

  8. @CookieValue: 这个注解帮助你将请求的 Cookie 数据映射到方法的参数上。想象一下,你点了一份甜点,服务员将甜点的名字告诉你,这就是 CookieValue 的作用。

这些注解就像是你与 Spring MVC 框架之间的沟通工具,它们帮助你更轻松地处理请求和数据,就像你在餐馆里处理订单和食物一样。

二.参数传递

pom.xml导入SLF4J的依赖

<log4j2.version>2.9.1</log4j2.version>
<log4j2.disruptor.version>3.2.0</log4j2.disruptor.version>
<slf4j.version>1.7.13</slf4j.version><!--4.log日志相关依赖--><!-- log4j2日志相关依赖 -->
<!-- log配置:Log4j2 + Slf4j -->
<!-- slf4j核心包-->
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>${slf4j.version}</version>
</dependency>
<dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId><version>${slf4j.version}</version><scope>runtime</scope>
</dependency><!--核心log4j2jar包-->
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>${log4j2.version}</version>
</dependency>
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>${log4j2.version}</version>
</dependency>
<!--用于与slf4j保持桥接-->
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId><version>${log4j2.version}</version>
</dependency>
<!--web工程需要包含log4j-web,非web工程不需要-->
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-web</artifactId><version>${log4j2.version}</version><scope>runtime</scope>
</dependency><!--需要使用log4j2的AsyncLogger需要包含disruptor-->
<dependency><groupId>com.lmax</groupId><artifactId>disruptor</artifactId><version>${log4j2.disruptor.version}</version>
</dependency>

1. 基础类型+String类型

package com.liao.web;import com.liao.model.Book;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;import javax.servlet.http.HttpServletRequest;
import java.util.Map;@Slf4j
@Controller
@RequestMapping("/param")
public class ParamController {@RequestMapping("/hello1")public String index(Integer bid ,String bname) {log.info("简单参数:bid:{},bname:{} ",bid,bname);return "index";}
}


2. 复杂类型


   

@RequestMapping("/hello2")public String hello2(Book book , HttpServletRequest httpServletRequest) {log.info("复杂参数:bid:{},bname:{} ",httpServletRequest.getParameter("bid"),httpServletRequest.getParameter("bname"));log.info("复杂参数:book:{} ",book.toString());return "index";}


3. @RequestParam
 

    @RequestMapping("/hello3")public String toHello3(@RequestParam Integer bid,@RequestParam(required = false,value = "price") Integer bookPrice,@RequestParam("bookName") String bname){log.info(">>>> 使用@RequestParam注解传递参数:{},{},{}", bid,bname,bookPrice);return "index";}


控制台输出

不会输出任何结果。

注:@RequestParam的required属性

 该参数是否为必传项。默认是true,表示请求中一定要传入对应的参数,否则会报404错误,如果设置为false时,当请求中没有此参数,将会默认为null,而对于基本数据类型的变量,则必须有值,这时会抛出空指针异常。如果允许空值,则接口中变量需要使用包装类来声明。
 

4. @PathVariable
 

 @RequestMapping("/hello4/{bid}")public String toHello4(@PathVariable("bid") Integer bid){log.info(">>>> 使用@PathVariable注解传递参数:{}", bid);return "index";}


 5.@RequestBody


导入@RequestBody依赖

 <jackson.version>2.9.3</jackson.version><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${jackson.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>${jackson.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>${jackson.version}</version></dependency>

测试代码

   

 @RequestMapping("/hello5")public String toHello5(@RequestBody Map map){System.out.println(map);return "index";}


请使用postman或者apipost/eolink等工具发送请求数据。因为浏览器无法携带集合参数,所以借助第三方软件进行测试。

6. @RequestHeader
 

@RequestMapping("/hello7")public String toHello7(Book book, @RequestBody Map map, @RequestHeader("jwt") String jwt){System.out.println(map);System.out.println(book);System.out.println(jwt);return "index";}

参数传递注意事项

Spring MVC 提供了多种方式来处理参数传递,但在某些情况下可能会遇到一些困难。以下是一些可能引起困难的情况和解决方法:

  1. 复杂对象传递: 当你需要传递复杂的对象作为参数时,可能需要确保请求中的参数名称与对象的字段名称匹配。解决方法是使用@ModelAttribute注解将请求参数映射到对象,或者使用合适的数据绑定工具,如Jackson来处理JSON数据。

  2. 路径变量和查询参数: 处理路径变量和查询参数时,确保你的@RequestMapping注解和方法参数与请求的URL匹配。Spring MVC可以根据请求的URL来自动解析这些参数。

  3. 参数验证: 参数验证是一个常见的需求,但可能会导致困难。你可以使用Spring的@Valid注解和javax.validation包中的验证注解来实现参数验证。

  4. 多部分文件上传: 如果需要上传文件,Spring MVC提供了MultipartFile作为参数类型,但处理文件上传可能会有一些复杂性。你需要配置适当的文件上传解析器,并确保前端表单以正确的方式提交文件。

  5. 复杂的请求映射: 当你的应用程序有多个控制器和请求映射时,可能需要小心管理请求的映射关系,以确保请求被正确路由到适当的处理方法。

  6. Session 数据: 在不同请求之间共享数据可能会有一些挑战,尤其是在集群环境中。使用@SessionAttributes注解可以在会话中存储和共享数据。

  7. 不同数据类型的参数: 处理不同数据类型的参数时,你需要确保数据类型的转换和验证是正确的。Spring MVC会尝试自动进行数据类型转换,但你需要确保你的参数和请求中的数据类型一致。

虽然Spring MVC提供了强大的参数传递和绑定功能,但在复杂的应用程序中,可能需要仔细规划和调试,以确保参数传递不会引发问题。使用合适的注解、验证和数据绑定技术,可以解决大多数参数传递的困难。同时,详细的日志和调试工具也有助于识别和解决问题。

三.方法返回值

1.void


ResponseUtil

package com.liao.untils;import com.fasterxml.jackson.databind.ObjectMapper;import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;public class ResponseUtil {public static void write(HttpServletResponse response,Object o)throws Exception{response.setContentType("text/html;charset=utf-8");PrintWriter out=response.getWriter();out.println(o.toString());out.flush();out.close();}public static void writeJson(HttpServletResponse response,Object o)throws Exception{ObjectMapper om = new ObjectMapper();write(response, om.writeValueAsString(o));}
}

ReturnController 

package com.liao.web;import com.liao.untils.ResponseUtil;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;
@Controller
@RequestMapping("/rs")
public class ReturnController {@RequestMapping("/hello1")public void hello1(HttpServletResponse response){Map<String,Object> map=new HashMap<>();map.put("code",200);map.put("msg","添加成功");try {ResponseUtil.writeJson(response,map);} catch (Exception e) {e.printStackTrace();}}}

2.String+model

<%--Created by IntelliJ IDEA.User: 86158Date: 2023/9/5Time: 15:49To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h1>Hello</h1>
名称:${name}
地址:${address}
</body>
</html>

 代码

package com.liao.web;import com.liao.untils.ResponseUtil;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;@Controller
@RequestMapping("/rs")
public class ReturnController {@RequestMapping("/hello2")public String hello2(Model model,HttpServletRequest request){model.addAttribute("name","张三");request.setAttribute("address","嘿嘿嘿");return "index";}}

 四:ModelAndView


package com.liao.web;import com.liao.untils.ResponseUtil;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;@Controller
@RequestMapping("/rs")
public class ReturnController {@RequestMapping("/hello3")public ModelAndView hello3(){ModelAndView mv=new ModelAndView();mv.addObject("sign","打篮球");mv.setViewName("index");return mv;}
}

四、页面跳转


在Spring MVC中,页面跳转可以通过转发(forward)或重定向(redirect)来实现。

@RequestMapping("/hello6")public String hello6() throws Exception {System.out.println("hello6");return "forward:hello2";};


转发(forward)

使用请求转发将请求发送到另一个URL路径上进行处理,客户端的URL地址不会变化。这种方式适用于不同请求之间的跳转和处理,可以共享请求的上下文数据。

 @RequestMapping("/hello7")public String hello7() throws Exception {System.out.println("hello6");return "forward:/param//hello1";};


重定向(redirect)

使用重定向将请求发送到另一个URL路径上进行处理,客户端的URL地址会改变。这种方式适用于不同请求之间的跳转和处理,可以避免表单重复提交等问题。
 

 @RequestMapping("/hello9")public String hello9() throws Exception {System.out.println("hello6");return "redirect:/param//hello1";};

相关文章:

SpringMVC的注解、参数传递、页面跳转

一.SpringMvc常用注解 常用注解 RequestMapping:RequestMapping注解是一个用来处理请求地址映射的注解&#xff0c;可用于映射一个请求或一个方法&#xff0c;可以用在类或方法上。 RequestParam:RequestParam主要用于将请求参数区域的数据映射到控制层方法的参数上 ModelAttr…...

OAK相机:启动报错X_LINK_DEVICE_NOT_FOUND

OAK相机&#xff1a;启动报错X_LINK_DEVICE_NOT_FOUND 环境报错原因与解决未设置 udev 规则USB崩溃排线接触不良或相机模块时钟干扰 环境 硬件&#xff1a; 4✖️OV9782相机模组OAK-FFC-4P驱动模组笔记本电脑 软件&#xff1a; Ubuntu18.04python 3.9depthai 2.21.2.0 报错…...

Python异常处理——走BUG的路,让BUG无处可走

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 本文专栏&#xff1a;Python专栏 专栏介绍&#xff1a;本专栏为免费专栏&#xff0c;并且会持续更新python基础知识&#xff0c;欢迎各位订阅关注。 目录 一、了解python异常 1、BUG 单词的由来 2、什么是异…...

如何解决iOS打包工具AppUploader登录权限问题?

摘要&#xff1a;在iOS技术博主的指导下&#xff0c;了解如何解决使用AppUploader打包时出现的权限问题。本文将深入探讨此问题&#xff0c;为你提供详细的解决方案。 引言&#xff1a; 作为iOS开发者&#xff0c;我们经常需要使用工具来打包和上传应用程序。AppUploader 是一…...

leetcode分类刷题:基于数组的双指针(四、小的移动)

leetcode上有些题是真的太难了&#xff0c;正常读题之后完全想不到要用双指针来求解&#xff0c;本次博客总结的题目是双指针初始时位于数组两端&#xff0c;哪个元素小就移动哪个指针 11. 盛最多水的容器 1、这道题放在42. 接雨水的相似题目里&#xff0c;可能是因为它们都有相…...

eclipse

快捷键 F4: 继承树 F3: 查看变量、方法、类的定义, 跳到光标所在标识符的定义代码。(Ctrl左键) CtrlShiftG&#xff1a; 在工作空间中查找引用了光标所在标识符的位置。与F3相反的快捷键。当按类定义进行阅读时&#xff0c;当前类方法或者函数在被哪些地方调用 controlTAB: 切…...

VIT中的einops包详解

‘’‘einops有三个常用方法&#xff1a;rearrange,repeat,reduce’‘’ rearrange的操作相当于转置 rearrange(image,‘h w c -> w h c’) 高和宽转置 path ../data/cat_and_mouse.jpg image cv2.imread(path) h,w,c image.shape # shape第一个值是h,第二个是w image…...

目标检测笔记(十三): 使用YOLOv5-7.0版本对图像进行目标检测完整版(从自定义数据集到测试验证的完整流程))

文章目录 一、目标检测介绍二、YOLOv5介绍2.1 和以往版本的区别 三、代码获取3.1 视频代码介绍 四、环境搭建五、数据集准备5.1 数据集转换5.2 数据集验证 六、模型训练七、模型验证八、模型测试九、评价指标 一、目标检测介绍 目标检测&#xff08;Object Detection&#xff…...

【数据结构】设计环形队列

环形队列是一种线性数据结构&#xff0c;其操作表现基于 FIFO&#xff08;先进先出&#xff09;原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 环形队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里&#xff0c;一旦一个队列…...

无涯教程-JavaScript - COUPDAYSNC函数

描述 COUPDAYSNC函数返回从结算日期到下一个息票日期的天数。 语法 COUPDAYSNC (settlement, maturity, frequency, [basis])争论 Argument描述Required/OptionalSettlement 证券的结算日期。 证券结算日期是指在发行日期之后将证券交易给买方的日期。 RequiredMaturity 证…...

python 随机生成emoji表情

问答板块觉得比较有意思的问题 当时搜了些网上的发现基本都不能用&#xff0c;不知道是版本的问题还是咋的就开始自己研究 python随机生成emoji 问题的产生解决官网文档数据类型实现思路实现前提&#xff1a;具体实现&#xff1a; 其他常见用法插入 Emoji 表情&#xff1a;解析…...

python关闭指定进程以excel为例

先说下环境&#xff1a; Excel版本&#xff1a; Python2.7.13和Python3.10.4并存。 2、打开两个excel工作簿 看进程是这样的&#xff1a; 3、用python编程kill进程 # -*- coding: utf-8 -*- import os proc_nameEXCEL.EXE if __name__ __main__:os.system(taskkill /im {} /…...

前后端中的异步和事件机制 | 前后端开发

前言 在前后端程序设计开发工作中&#xff0c;小伙伴们一定都接触过事件、异步这些概念。出现这些概念的原因之一是&#xff0c;我们的代码在执行过程中所涉及的逻辑在不同的场合下执行时间的期望是各不相同的。为了尽量做到充分利用CPU等资源做尽可能多的事&#xff0c;免不了…...

设计模式篇(Java):装饰者模式

&#x1f468;‍&#x1f4bb;本文专栏&#xff1a;设计模式篇-装饰者模式 &#x1f468;‍&#x1f4bb;本文简述&#xff1a;装饰者模式的详解以及jdk中的应用 &#x1f468;‍&#x1f4bb;上一篇文章&#xff1a; 设计模式篇(Java)&#xff1a;桥接模式 &#x1f468;‍&am…...

Spark【RDD编程(三)键值对RDD】

简介 键值对 RDD 就是每个RDD的元素都是 &#xff08;key&#xff0c;value&#xff09;类型的键值对&#xff0c;是一种常见的 RDD&#xff0c;可以应用于很多场景。 因为毕竟通过我们之前Hadoop的学习中&#xff0c;我们就可以看到对数据的处理&#xff0c;基本都是以…...

从板凳围观到玩转行家:Moonbeam投票委托如何让普通用户一同参与

今年5月&#xff0c;Moonbeam发起了一项社区链上治理中投票委托反馈的调查。187位社区成员参与了这项调查&#xff0c;调查发现受访者对治理感兴趣&#xff0c;增加参与度只需要进行一些调整&#xff0c;即更简化的投票流程。 治理和去中心化是Web3的核心&#xff0c;随着Moon…...

SpringMVC的文件上传文件下载多文件上传---详细介绍

目录 前言&#xff1a; 一&#xff0c;文件上传 1.1 添加依赖 1.2 配置文件上传解析器 1.3 表单设置 1.4 文件上传的实现 二&#xff0c;文件下载 controller层 前端jsp 三&#xff0c;多文件上传 Controller层 运行 前言&#xff1a; Spring MVC 是一个基于 Java …...

Spark【RDD编程(四)综合案例】

案例1-TOP N个数据的值 输入数据&#xff1a; 1,1768,50,155 2,1218,600,211 3,2239,788,242 4,3101,28,599 5,4899,290,129 6,3110,54,1201 7,4436,259,877 8,2369,7890,27 处理代码&#xff1a; def main(args: Array[String]): Unit {//创建SparkContext对象val conf…...

Golang报错mixture of field:value and value initializers

Golang报错mixture of field:value and value initializers 这个错误跟编程习惯&#xff08;模式&#xff09;有关&#xff0c;都知道golang 语言的编程与java /python 以及其他的编程语言相似 &#xff0c;一通百通&#xff0c;易学万卷书。 编程中同一个结构中要保持唯一模…...

【网络教程】记一次使用Docker手动搭建BT宝塔面板的全过程(包含问题解决如:宝塔面板无法开启防火墙,ssh,nginx等)

文章目录 准备安装安装宝塔面板开启ssh和修改ssh的密码导出镜像问题解决宝塔面板无法开启防火墙无法启动ssh设置密码nginx安装失败设置开机启动相关服务准备 演示的系统环境:Ubuntu 22.04.3 LTS更新安装/升级docker到最新版本升级docker相关命令如下# 更新软件包列表并自动升级…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...