监听 Tomcat 的启动、停止事件
当 Servlet 容器启动或终止 Web 应用时,会触发 ServletContextEvent 事件,该事件由 ServletContextListener 来处理。在 Servlet API 中有一个 ServletContextListener 接口,接口中定义了处理 ServletContextEvent 事件的两个方法,它能够监听 ServletContext 对象的生命周期,实际上就是监听 Web 应用的生命周期。我们可以通过实现这两个方法,来实现在 Tomcat 启动和停止时执行一定的操作。 监听器类编写新建一个监听器类 TomcatListener 并实现 ServletContextListener 接口 1234567891011public class DemoListener..
更多SwiftUI 学习记录 - 切换 TabView 的 tab 时触发震动反馈
最近在折腾 iOS 开发的时候,想实现在切换 TabView 的 tab 时触发震动反馈,因为一边写一边学嘛,基础不牢,只能在网上瞎搜,试了各种方法都不奏效。直到前两天看到 Ice Cubes: for Mastodon 的这段代码,豁然开朗。 之前写的时候,只知道给 selection 传一个绑定的对象,但是看完 IceCubes 的代码,再一看 selection 参数的文档,恍然大悟,这个参数要的其实是一个 SelectionValue 的绑定对象,所以我其实可以在这个对象的 set 方法上面做文章。 12345678910111213141516171819202122struct ContentView: View { @State private var selectedTab..
更多SwiftUI 学习记录 - 使用 Alamofire 加载 JSON 并初始化列表
这两天又捡起来了之前开的一个老坑,继续完成 X 岛揭示板的 iOS 客户端,而且刚刚完成了从 JSON 初始化版面列表的功能。这部分感觉最难的还是上手 Alamofire,因为它返回结果不像我平时做 Web 开发那样通过方法返回(也有可能是我没学到位),而是要把反序列化得到的对象传给一个回调方法。而这个思路的差异也导致我刚开始学的时候非常的痛苦,因为怎么也找不到我想要的那种返回方式。我相信应该不止我一个人会遇到这种情况,所以打算在这里把完整的实现过程记录在这里,并希望后面有类似情况的同志能因为这篇文章而少掉几根头发。 定义 JSON 对应的结构体X 岛揭示板的版面列表 API 会返回一个类似这样的 JSON: 1234567891011121314151617181920212223242526272..
更多配置 Tomcat 监控 class 和 lib 变更并自动重新加载
在 context.xml 的 Context 标签中,设定 reloadable="true" 即可。 123<Context reloadable="true"> <!-- Other configurations --></Context> 配置完毕后重启 Tomcat 使配置生效,然后 Tomcat 在监控到项目的 class 或 lib 有变化后,就会自动重新加载这个 webapp。 但是这个功能会显著增加 Tomcat 的性能消耗,故不建议在生产环境中使用。
更多如何将项目部署至 Tomcat 的根下
有两种方法可以实现将项目部署到 Tomcat 的根下。 删掉自带的 ROOT / 目录,然后将项目的 war 包重命名为 ROOT.war 将项目正常部署 (假设 war 包名为 your_project.war),然后修改 conf/server.xml 中的 Context Root为如下内容: 1<Context path="" docBase="your_project" debug="0" reloadable="true"></Context> 参考文献:https://stackoverflow.com/questions/5328518/deploying-my-application-at-the-root-in-tomcat
更多在 MySQL 中修改表和列的排序规则
使用如下 SQL 语句即可更新一张表的字符集 (character set) 和排序规则 (collation): 12-- 此处假设使用utf8字符集,以及使用utf8_unicode_ci排序规则ALTER TABLE `table_name` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci; 然后可以使用如下 SQL 查询表和列的字符集和排序规则是否修改成功: 123456789-- 查询表的信息SELECT `TABLE_SCHEMA`, `TABLE_NAME`, `TABLE_COLLATION`FROM `information_schema`.`TABLES`WHERE `TABLE_NAME` = 'table_name';-..
更多让 MyBatis 把查询结果以 Map 形式返回
在使用 MyBatis 查询数据库时,偶尔会出现短时间高频查询的情况。或者,会被短时间高频率查询的数据需要通过另一个微服务的接口来获取。显而易见,高频率的查询数据库,或者高频率的调用微服务的接口,是会对性能产生一定影响的。 在这种情况下,或许可以考虑将相关的数据一次性全部查询出来,然后根据某一列作为 key,将其存放在一个 Map 中,把这个 Map 当成一个临时的缓存。 示例数据假设有这样的一组数据,其中保存了某公司的一系列基地的信息,包括基地名称、基地代号,和基地所在的区。 id base_name base_code location 1 梅陇 ML 徐汇区 2 富锦路 FJL 宝山区 3 龙阳路 LYL 浦东新区 4 北翟路 BDL 普陀区..
更多使用frp实现内网ssh穿透
最近需要远程访问一台虚拟机内的Linux,因为虚拟机没有公网IP,因此选择使用frp转发ssh流量的方式来实现远程访问。首先访问frp的release页面并根据操作系统和CPU下载相应的版本,之后解压得到frpc和frps文件。frps是服务端版本,它需要部署在一台拥有公网IP的主机上,它的配置frps.ini如下[common]bind_port = 10625token = y9XBLEu2ymW1s5N3W7OuDPhUG4IohVmQ其中bind_port代表了它所监听的端口号,而token则是客户端连接时需要用到的验证信息。frpc是客户端版本,它的配置frpc.ini如下[common]server_addr = 100.26.21.285server_port = 10625authenti..
更多修复使用 GPG 密钥时 git commit 卡住的问题
使用 GPG 密钥时 git commit 有时候会卡住。可以通过一下命令来重启 gpg-agent 和 ssh-agent:1 gpgconf --kill gpg-agent && killall ssh-agent
更多修复 WSL2 镜像网络模式下无法连接 Docker 的问题
问题在 2023 年 9 月的 Windows 11 更新中,WSL2 支持了新的网络模式:镜像(mirrored)。它能够通过 localhost 地址从 WSL2 内部连接到 Windows 的 127.0.0.1 地址。可以在 %UserProfile%/.wslconfig 添加 networkingMode=mirrored 来启用它。但是这会导致无法连接到 Docker 的问题:dial tcp 127.0.0.1:3306: connect: connection refused。该问题的原因是 Docker 使用了 iptables 来转发端口。可以通过以下方法来修复这个问题。使用 Docker Desktop方法 1直接将 Docker Desktop 升级到 4.26 以上版本即可,该..
更多