TomcatServlet
https://www.bilibili.com/video/BV1UN411x7xe
tomcat
tomcat 架构图,与 jre,应用程序之前的关系
安装使用
tomcat 10 开始,api 从 javax.* 转为使用 jakarta.*,需要至少使用 jdk 11+
cmd 中默认 gbk 编码,解决控制台乱码,修改\conf\logging.properties
java.util.logging.ConsoleHandler.encoding = GBK
startup.bat 启动
目录
- conf
server.xml,可配置连接器启动端口
<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443"maxParameterCount="1000"/>
tomcat-users.xml 配置 manager 项目的访问
<?xml version="1.0" encoding="UTF-8"?>
<tomcat-users xmlns="http://tomcat.apache.org/xml"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"version="1.0">
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user username="admin" password="admin" roles="manager-gui,manager-script,manager-jmx,manager-status"/>
</tomcat-users>
访问 http://localhost:8080/manager 访问管理页面
- libs: 公共依赖的jar
- webapps: 存放部署的web项目,有五个默认的项目
- work: 与 jsp 有关,运行时生成文件(了解)
访问自带的 examples 项目,区分项目上下文路径与项目部署目录之间的关系
WebAPP 标准结构
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaeehttps://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"version="6.0"metadata-complete="true"></web-app>
web 项目部署的方式
方式1:直接将编译好的项目放在webapps目录下(已经演示)
方式2:将编译好的项目打成war包放在webapps目录下,tomcat启动后会自动解压war包(其实和第一种一样)
方式3:可以将项目放在非webapps的其他目录下,在tomcat中通过配置文件指向app的实际磁盘路径
apache-tomcat-10.1.26\conf\Catalina\localhost
<Context docBase="D:\tool\apache-tomcat-10.1.26-windows-x64\apache-tomcat-10.1.26\webappsnew\app" path="/app"/>
idea 关联 tomcat
- 建立tomcat和idea的关联
- 使用idea创建一个javaWEB工程 在WEB 工程中开发代码
- 使用idea将工程构建成一个可以发布的app
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaeehttps://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"version="5.0"metadata-complete="true">
</web-app>
- 使用idea将构建好的app部署到tomcat中, 启动运行
idea 部署 web项目原理
- idea并没有直接进将编译好的项目放入tomcat的webapps中
- idea根据关联的tomcat, 创建了一个tomcat副本, 将项目部署到了这个副本中
- idea的tomcat副本在C:\用户\当前用户\AppData\Local\JetBrains\IntelliJIdea2022.2\tomcat\中
- idea的tomcat副本并不是一个完整的tomcat, 副本里只是准备了和当前项目相关的配置文件而已
- idea启动tomcat时, 是让本地tomcat程序按照tomcat副本里的配置文件运行
- idea的tomcat副本部署项目的模式是通过conf/Catalina/localhost/*.xml配置文件的形式实现项目部署的
servlet
Servlet 概念
不是所有的JAVA类都能用于处理客户端请求,能处理客户端请求并做出响应的一套技术标准就是Servlet
Servlet是运行在服务端的,所以Servlet必须在WEB项目中开发且在Tomcat这样的服务容器中运行
HttpServletRequest与HttpServletResponse
servelt 程序编写
添加依赖
或者添加 maven 依赖
<dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><version>6.1.0</version><scope>provided</scope>
</dependency>
:::color1
provided 作用域的servlet依赖包的理解
开发过程:
-
在IDE中编写代码时需要Servlet API来编译
-
运行测试用例时需要Servlet API
部署过程:
-
将WAR包部署到Tomcat时,不需要包含Servlet API
-
Tomcat自带Servlet API,会提供给所有部署的应用使用
:::
注解
/*** Servlet配置方式有两种:* 1. 注解配置:@WebServlet("/hello")* 2. XML配置:在web.xml中配置servlet和servlet-mapping**/
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();out.println("<!DOCTYPE html>");out.println("<html>");out.println("<head>");out.println("<title>Hello Servlet</title>");out.println("</head>");out.println("<body>");out.println("<h1>欢迎使用Servlet!</h1>");out.println("<p>当前时间: " + new java.util.Date() + "</p>");out.println("<p>这是使用XML配置方式的Servlet</p>");out.println("</body>");out.println("</html>");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}
xml
<!-- Servlet配置 --><servlet><!-- servlet-name是servlet的唯一标识 --><servlet-name>helloServlet</servlet-name><!-- servlet-class指定Servlet类的完全限定名 --><servlet-class>com.example.servlet.HelloServlet</servlet-class></servlet><!-- Servlet映射配置 --><servlet-mapping><!-- 需要和上面的servlet-name保持一致 --><servlet-name>helloServlet</servlet-name><!-- url-pattern定义访问路径 --><url-pattern>/hello</url-pattern></servlet-mapping>
Servlet 生命周期与作用域
生命周期 | 对应方法 | 执行时机 | 执行次数 |
---|---|---|---|
构造对象 | 构造器 | 第一次请求或者容器启动 | 1 |
初始化 | init() | 构造完毕后 | 1 |
处理服务 | service(HttpServletRequest req, HttpServletResponse resp) | 每次请求 | 多次 |
销毁 | destory() | 容器关闭 | 1 |
:::color1
Servlet 初始化时可以指定启动参数
在 init() 阶段加载
:::
Servlet在Tomcat中是单例的
Servlet的成员变量在多个线程栈之中是共享的
不建议在service方法中修改成员变量 在并发请求时,会引发线程安全问题
ServletConfig&ServletContext
ServletConfig
接口方法
方法名 | 作用 |
---|---|
getServletName() | 获取<servlet-name>HelloServlet</servlet-name>定义的Servlet名称 |
getServletContext() | 获取ServletContext对象 |
getInitParameter() | 获取配置Servlet时设置的『初始化参数』,根据名字获取值 |
getInitParameterNames() | 获取所有初始化参数名组成的Enumeration对象 |
<!-- 配置Servlet本身 -->
<servlet><!-- 全类名太长,给Servlet设置一个简短名称 --><servlet-name>HelloServlet</servlet-name><!-- 配置Servlet的全类名 --><servlet-class>com.atguigu.servlet.HelloServlet</servlet-class><!-- 配置初始化参数 --><init-param><param-name>goodMan</param-name><param-value>me</param-value></init-param><!-- 配置Servlet启动顺序 --><load-on-startup>1</load-on-startup>
</servlet>
public class HelloServlet implements Servlet {// 声明一个成员变量,用来接收init()方法传入的servletConfig对象private ServletConfig servletConfig;public HelloServlet(){System.out.println("我来了!HelloServlet对象创建!");}@Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("HelloServlet对象初始化");// 将Tomcat调用init()方法时传入的servletConfig对象赋值给成员变量this.servletConfig = servletConfig;}@Overridepublic ServletConfig getServletConfig() {// 返回成员变量servletConfig,方便使用return this.servletConfig;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {// 控制台打印,证明这个方法被调用了System.out.println("我是HelloServlet,我执行了!");// 返回响应字符串// 1、获取能够返回响应数据的字符流对象PrintWriter writer = servletResponse.getWriter();// 2、向字符流对象写入数据writer.write("Hello,I am Servlet");// =============分割线===============// 测试ServletConfig对象的使用// 1.获取ServletConfig对象:在init()方法中完成System.out.println("servletConfig = " + servletConfig.getClass().getName());// 2.通过servletConfig对象获取ServletContext对象ServletContext servletContext = this.servletConfig.getServletContext();System.out.println("servletContext = " + servletContext.getClass().getName());// 3.通过servletConfig对象获取初始化参数Enumeration<String> enumeration = this.servletConfig.getInitParameterNames();while (enumeration.hasMoreElements()) {String name = enumeration.nextElement();System.out.println("name = " + name);String value = this.servletConfig.getInitParameter(name);System.out.println("value = " + value);}}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {System.out.println("HelloServlet对象即将销毁,现在执行清理操作");}
}
ServletContext
- 代表:整个Web应用
- 是否单例:是
- 典型的功能:
- 获取某个资源的真实路径:getRealPath()
- 获取整个Web应用级别的初始化参数:getInitParameter()
- 作为Web应用范围的域对象
- 存入数据:setAttribute()
- 取出数据:getAttribute()
<!-- 配置Web应用的初始化参数 -->
<context-param><param-name>handsomeMan</param-name><param-value>alsoMe</param-value>
</context-param>
String handsomeMan = servletContext.getInitParameter("handsomeMan");
System.out.println("handsomeMan = " + handsomeMan);
三大域对象
作用域 | 生命周期 | 典型对象 |
---|---|---|
Request | 一次 HTTP 请求 | <font style="color:rgba(0, 0, 0, 0.87);background-color:rgb(241, 241, 241);">HttpServletRequest</font> 属性 |
Session | 用户会话期间(如登录状态) | <font style="color:rgba(0, 0, 0, 0.87);background-color:rgb(241, 241, 241);">HttpSession</font> 属性 |
Application | Web 应用全局(如配置信息) | <font style="color:rgba(0, 0, 0, 0.87);background-color:rgb(241, 241, 241);">ServletContext</font> 属性 |
继承结构
Servlet
接口
public interface Servlet {// 初始化方法,构造完毕后由tomcat自动调用完成初始化功能的方法void init(ServletConfig var1) throws ServletException;// 获得ServletConfig对象的方法 -> 提供一些初始信息 <init-param>ServletConfig getServletConfig();// 接收用户请求,向用于响应信息的方法void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;// 返回Servlet字符串形式描述信息的方法-了解String getServletInfo();// Servlet在回收前,由tomcat调用的销毁方法,往往用于做资源的释放工作void destroy();
}
GenericServlet
抽象类
public abstract class GenericServlet implements Servlet {private transient ServletConfig config;public void destroy() {// 将抽象方法重写为普通方法,在方法内部没有任何的实现代码// 平庸实现}// tomcat在调用init方法时,会读取配置信息进入一个ServletConfig对象并将该对象传入init方法public void init(ServletConfig config) throws ServletException {// 将config对象存储为当前的属性this.config = config;// 调用了重载的无参的initthis.init();}// 重载的初始化方法,我们重写初始化方法时对应的方法public void init() throws ServletException {}// 返回ServletConfig的方法public ServletConfig getServletConfig() {return this.config;}// 再次抽象声明service方法public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
}
HttpServlet
抽象类 侧重 service 的处理
public abstract class HttpServlet extends GenericServlet {// 参数的父转子 调用重载service方法
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {// 参数的父转子HttpServletRequest request = (HttpServletRequest)req;HttpServletResponse response = (HttpServletResponse)res;// 调用重载的servicethis.service(request, response);
}protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取请求的方式String method = req.getMethod(); // GET POST PUT DELETE OPTIONS ...// 根据请求方式,调用对应do... 方法if (method.equals("GET")) {this.doGet(req, resp);} else if (method.equals("HEAD")) {this.doHead(req, resp);} else if (method.equals("POST")) {this.doPost(req, resp);} else if (method.equals("PUT")) {this.doPut(req, resp);} else if (method.equals("DELETE")) {this.doDelete(req, resp);} else if (method.equals("OPTIONS")) {this.doOptions(req, resp);} else if (method.equals("TRACE")) {this.doTrace(req, resp);} else {resp.sendError(501, errMsg);}
}// 故意响应405
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {"http.method_get_not_supported"// 故意响应405 请求方式不允许的信息resp.sendError(405, msg);
}// 故意响应405
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {"http.method_get_not_supported"// 故意响应405 请求方式不允许的信息resp.sendError(405, msg);
}}
- 部分程序员推荐在Servlet中重写do***方法处理请求。理由是:service方法中可能做了一些处理,如果我们直接重写service的话,父类中的service方法处理的功能则失效
- 目前直接重写service也没有什么问题
- 后续使用了SpringMVC框架后,我们则无需继承HttpServlet,处理请求的方法也无需是do***_service
- 如果doGet 和doPost方法中,我们定义的代码都一样,可以让一个方法直接调用另一个方法掌握的技能
- 继承HttpServlet后,要么重写service方法,要么重写doGet/doPost
请求转发与重定向
请求转发和响应重定向是web应用中间接访问项目资源的两种手段,也是Servlet控制页面跳转的两种手段
请求转发通过HttpServletRequest实现,响应重定向通过HttpServletResponse实现
请求转发
servlet 之间的接力
请求转发是通过HttpServletRequest对象实现的
请求转发是服务器内部行为,对客户端是屏蔽的
客户端只产生了一次请求,服务端只产生了一对request和response对象
客户端的地址栏是不变的
请求的参数是可以继续传递的
目标资源可以是servlet动态资源,也可以是html静态资源
目标资源可以是WEB-INF下的受保护的资源,该方式也是WEB-INF下的资源的唯一访问方式
重定向
响应重定向通过HttpServletResponse对象的sendRedirect方法实现
响应重定向是服务端通过302响应码和路径告诉客户端自己去找其他资源,是在服务端提示下进行的,客户端的行为
客户端至少发送了两次请求,客户端地址栏是要变化的
服务端产生了多对请求和响应对象,且请求和响应对象不会传递给下一个资源
因为全程产生了多个HttpServletRequest对象,所以请求参数不可以传递,请求域中的数据也不可以传递
重定向可以是其他Servlet动态资源,也可以是一些静态资源以实现页面跳转
重定向不可以到WEB-INF下受保护的资源
filter
图
介绍
- Filter接口定义了过滤器的开发规范,所有的过滤器都要实现该接口
- Filter的工作位置是项目中所有目标资源之前,容器在创建HttpServletRequest和HttpServletResponse对象后,会先调用Filter的doFilter方法
- Filter的doFilter方法可以控制请求是否继续,如果放行,则请求继续,如果拒绝,则请求到此为止,由过滤器本身做出响应
- Filter不仅可以对请求做出过滤,也可以在目标资源做出响应前,对响应再次进行处理
- Filter是GOF中责任链模式的典型案例
- Filter的常用应用包括但不限于:登录权限检查,解决网站乱码,过滤敏感字符,日志记录,性能分析……
api
package jakarta.servlet;import java.io.IOException;public interface Filter {default public void init(FilterConfig filterConfig) throws ServletException {}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException;default public void destroy() {}
}
API | 目标 |
---|---|
default public void init(FilterConfig filterConfig) | 初始化方法,由容器调用并传入初始配置信息filterConfig对象 |
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) | 过滤方法,核心方法,过滤请求,决定是否放行,响应之前的其他处理等都在该方法中 |
default public void destroy() | 销毁方法,容器在回收过滤器对象之前调用的方法 |
案例-记录日志
public class HelloFilter implements Filter {/*** 过滤请求的和响应的方法* 1.请求到达目标资源之前,先经过该方法* 2.该方法有能力控制请求是否继续向后到达目标资源,可以在该方法内直接向客户端做响应处理* 3.请求到达目标资源后,响应之前还会经过该方法*/@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {// 请求到达目标资源之前的代码System.out.println("loggingFilter before doFilter invoked");// 放行chain.doFilter(request, response);// 响应之前的功能代码System.out.println("loggingFilter after doFilter invoked");}
}
<filter><filter-name>loggingFilter</filter-name><filter-class>com.example.servlet.HelloFilter</filter-class>
</filter><filter-mapping><!--url-pattern 根据请求的资源路径 对指定的请求进行过滤/* 过滤全部资源/a/* 过滤以a开头的资源*.html 过滤以html为后缀的资源/servlet1 对servlet1请求进行过滤servlet-name 根据请求的servlet的别名,最指定的servlet资源进行过滤一个 filter-mapping 中可以同时存在多个 url-pattern 和 servlet-name--><filter-name>loggingFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>
生命周期
过滤器作为web项目的组件之一,和Servlet的生命周期类似,略有不同,没有servlet的load-on-startup的配置,默认就是系统启动立刻构造
阶段 | 对应方法 | 执行时机 | 执行次数 |
---|---|---|---|
创建对象 | 构造器 | web应用启动时 | 1 |
初始化方法 | void init(FilterConfig filterConfig) | 构造完毕 | 1 |
过滤请求 | void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) | 每次请求 | 多次 |
销毁 | default void destroy() | web应用关闭时 | 1次 |
过滤器链
一个web项目中,可以同时定义多个过滤器,多个过滤器对同一个资源进行过滤时,工作位置有先后,整体形成一个工作链,称之为过滤器链。
- 注解方式下顺序->类名
- xml方式下顺序->filter-mapping 声明顺序
Listener
监听器:专门用于对域对象对象身上发生的事件或状态改变进行监听和相应处理的对象
- 监听器是GOF设计模式中,观察者模式的典型案例
- 观察者模式:当被观察的对象发生某些改变时,观察者自动采取对应的行动的一种设计模式
- 监听器使用的感受类似JS中的事件,被观察的对象发生某些情况时,自动触发代码的执行
- 监听器并不监听web项目中的所有组件,仅仅是对三大域对象做相关的事件监听
监听器的分类
- web中定义八个监听器接口作为监听器的规范,这八个接口按照不同的标准可以形成不同的分类
按监听的对象划分
○ application域监听器 ServletContextListener ServletContextAttributeListener
○ session域监听器 HttpSessionListener HttpSessionAttributeListener HttpSessionBindingListener HttpSessionActivationListener
○ request域监听器 ServletRequestListener ServletRequestAttributeListener
按监听的事件分
○ 域对象的创建和销毁监听器 ServletContextListener HttpSessionListener ServletRequestListener
○ 域对象数据增删改事件监听器 ServletContextAttributeListener HttpSessionAttributeListener ServletRequestAttributeListener
○ 其他监听器 HttpSessionBindingListener HttpSessionActivationListener
案例
ServletContextListener
在应用程序启动的时候会触发,SpringMVC 会使用到<font style="color:rgb(51, 51, 51);">ContextLoaderListener</font>
,在web环境下能在应用程序启动的时候加载spring容器,就是ServletContextListener
的实现类
// @WebListener
public class HelloListener implements ServletContextListener {@Overridepublic void contextInitialized(// Event对象代表本次事件,通过这个对象可以获取ServletContext对象本身ServletContextEvent sce) {System.out.println("Hello,我是ServletContext,我出生了!");ServletContext servletContext = sce.getServletContext();System.out.println("servletContext = " + servletContext);}@Overridepublic void contextDestroyed(ServletContextEvent sce) {System.out.println("Hello,我是ServletContext,我打算去休息一会儿!");}
}
<!-- 每一个listener标签对应一个监听器配置,若有多个监听器,则配置多个listener标签即可 -->
<listener><!-- 配置监听器指定全类名即可 --><listener-class>com.atguigu.listener.AtguiguListener</listener-class>
</listener>
相关文章:
TomcatServlet
https://www.bilibili.com/video/BV1UN411x7xe tomcat tomcat 架构图,与 jre,应用程序之前的关系 安装使用 tomcat 10 开始,api 从 javax.* 转为使用 jakarta.*,需要至少使用 jdk 11 cmd 中默认 gbk 编码,解决控制…...
Seurat - Guided Clustering Tutorial官方文档学习及复现
由于本人没有使用过Seurat4.0,而是直接使用的最新版。所以本文都是基于Seurat5.2.0(截止2025/3/6)来进行撰写。 参考的官方教程来进行学习(上图中的 Guided tutorial-2.700 PBMCs),肯定没有官方文档那么全面…...
Python数据分析面试题及参考答案
目录 处理 DataFrame 中多列缺失值的 5 种方法 批量替换指定列中的异常值为中位数 使用正则表达式清洗电话号码格式 合并两个存在部分重叠列的 DataFrame 将非结构化 JSON 日志转换为结构化表格 处理日期列中的多种非标准格式(如 "2023 年 12 月 / 05 日") 识…...
极狐GitLab 正式发布安全版本17.9.1、17.8.4、17.7.6
本分分享极狐GitLab 补丁版本 17.9.1、17.8.4、17.7.6 的详细内容。这几个版本包含重要的缺陷和安全修复代码,我们强烈建议所有私有化部署用户应该立即升级到上述的某一个版本。对于极狐GitLab SaaS,技术团队已经进行了升级,无需用户采取任何…...
【JavaSE-7】方法的使用
1、方法的概念和使用 1.1、什么是方法 方法(method)是程序中最小的执行单元,类似于 C语言中的函数,方法存在的意义: 是能够模块化的组织代码(当代码规模比较复杂的时候).做到代码被重复使用, 一份代码可以在多个位置…...
阿里推出全新推理模型(因果语言模型),仅1/20参数媲美DeepSeek R1
阿里Qwen 团队正式发布了他们最新的研究成果——QwQ-32B大语言模型!这款模型不仅名字萌萌哒(QwQ),实力更是不容小觑!😎 QwQ-32B 已在 Hugging Face 和 ModelScope 开源,采用了 Apache 2.0 开源协议。大家可通过 Qwen C…...
C语言笔记(通讯录)
目录 1.通讯录的架构 2.通讯录的功能 3.实现静态通讯录的功能步骤 3.1.创建通讯录数组 3.2.显示功能菜单 3.3.初始化通讯录 3.4.添加联系人的信息 3.5.显示联系人的信息 3.6.查找某个人的信息 3.7.删除某一个联系人信息 3.8.修改某一联系人的信息 3.9.按名字对联系…...
【Manus资料合集】激活码内测渠道+《Manus Al:Agent应用的ChatGPT时刻》(附资源)
DeepSeek 之后,又一个AI沸腾,冲击的不仅仅是通用大模型。 ——全球首款通用AI Agent的破圈启示录 2025年3月6日凌晨,全球AI圈被一款名为Manus的产品彻底点燃。由Monica团队(隶属中国夜莺科技)推出的“全球首款通用AI…...
Python 面向对象高级编程-定制类
目录 __str__ __iter__ __getitem__ __getattr__ __call__ 小结 看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的。 __slots__我们已经知道怎么用了,__len__()方法我们也知道是为了能让class作用于len()…...
安装remixd,在VScode创建hardhat
在终端,以管理员身份,cmd 需要科学上网 npm install -g remix-project/remixd 在vscode插件中,安装solidity插件,是暗灰色那款 1.将nodeJs的版本升级至18以上 2.在vscode打开一个新的文件,在终端输入 npx hardhat 3.…...
开发环境搭建-02.后端环境搭建-熟悉项目结构
一.后端环境搭建...
Linux(Centos 7.6)命令详解:vi
1.命令作用 vi/vim 是Linux 系统内置不可或缺的文本编辑命令,vim 是vi 的加强版本,兼容vi 的所有指令,不仅能编辑文本,而且还具有shell 程序编辑的功能,可以不同颜色的字体来辨别语法的正确性。 2.命令语法 usage: …...
Ubuntu 20.04下配置VSCode以支持Eigen库开发
这里写目录标题 1. 安装Eigen库2. 配置VSCode的C开发环境3. 配置c_cpp_properties.json4. 编写代码并测试5. 配置tasks.json(可选)6. 运行程序总结 在VSCode中配置Eigen库(用于线性代数、矩阵和向量运算的C库)的步骤如下ÿ…...
正点原子[第三期]Arm(iMX6U)Linux移植学习笔记-2.1 uboot简介
前言: 本文是根据哔哩哔哩网站上“Arm(iMX6U)Linux系统移植和根文件系统构键篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。 引用: …...
Android14 OTA差分包升级报kPayloadTimestampError (51)
由于VF 架构, 所以镜像的打包时间可能存在偏差, 如 boot.img 和 客制化的一些镜像打包 可能会在 vendor 侧进行打包。 而 与system 侧进行merge 时,时间戳比较乱,为了解决这个问题,让时间戳进行统一。 使用adb方式验证…...
PPT 技能:巧用 “节” 功能,让演示文稿更有序
在制作PPT时,你是否遇到过这样的情况:幻灯片越来越多,内容越来越杂,找某一页内容时翻得眼花缭乱?尤其是在处理大型PPT文件时,如果没有合理的结构,编辑和调整都会变得非常麻烦。这时候࿰…...
Mysql创建库、表练习
创建库 #创建 create database gc_novels default charsetutf8mb4;#default charsetutf8mb4 指定编码为utf-8#使用 use gc_novels#查看当前所在位置 select database(); 结果: 创建表 #创建 create table heros(-> id int,-> name varchar(50),-&…...
【原创】Ollama Test API For Linux/MacOS/Unix
安装Json解析工具 Linux/Unix sudo apt-get install jq -yMacOS brew install jq -y设置环境变量 export IP"192.168.250.229" export PORT"8080" export MODEL"deepseek-r1:7b"检查Ollama版本 curl http://"$IP":"$PORT&qu…...
盛铂科技 SLMF315频率综合器200MHz至15GHz 国产频综模块
在当今科技飞速发展的时代,射频技术在众多领域发挥着关键作用,从通信、雷达系统到科研实验,对频率综合器的性能要求日益严苛。以下是关于盛铂科技的 SLMF315 超低相位噪声频率综合器的介绍: SLMF315超低相位噪声0.2至15GHz频率综合…...
AI-前端开发webcrumbs.ai/frontend-ai,Fitten Code提高开发效率
1.webcrumbs.ai/frontend-ai Frontend AI by Webcrumbshttps://app.webcrumbs.ai/frontend-ai 可选择某一模版进行生成对应版本代码,减少开发量。 2.Fitten Code Vue AI 编程助手 Vue AI 编程助手 | 菜鸟教程https://www.runoob.com/vue2/fitten-code-vue2.htm…...
DeepSeek开源Day4:DualPipeEPLB技术详解
2 月 24 日,DeepSeek 启动 “开源周”,第四个开源的代码库为 DualPipe 与 EPLB(一下发布了两个)。DualPipe 与 EPLB 依然使用了大量与 Hopper 架构绑定的技术。 DualPipe 是由 DeepSeek-AI 团队开发的一种双向流水线并行通信算法&…...
代码随想录算法训练营第22天 | 组合 组合总和 电话号码的字母组合
77. 组合 77. 组合 - 力扣(LeetCode) class Solution {List<Integer> path new ArrayList<>();List<List<Integer>> result new ArrayList<>();public void backTracking(int n,int k,int startIndex){if(path.size() …...
Oracle19c进入EM Express(Oracle企业管理器)详细步骤
以下是使用Oracle 19c进入Oracle Enterprise Manager Database Express(EM Express)的详细步骤: ### **步骤 1:确认EM Express配置状态** 1. **登录数据库服务器** 使用Oracle用户或管理员权限账户登录操作系统。 2. **查看EM…...
Oracle 数据库基础入门(六):视图与索引的深入解析
在 Oracle 数据库的知识体系中,视图与索引是提升数据库操作效率和优化数据管理的重要工具。对于 Java 全栈开发者而言,熟练掌握视图与索引的运用,不仅能够增强数据库查询的性能,还能为构建高效稳定的后端应用提供有力支持。接下来…...
机器学习-随机森林解析
目录 一、.随机森林的思想 二、随机森林构建步骤 1.自助采样 2.特征随机选择 3构建决策树 4.集成预测 三. 随机森林的关键优势 **(1) 减少过拟合** **(2) 高效并行化** **(3) 特征重要性评估** **(4) 耐抗噪声** 四. 随机森林的优缺点 优点 缺点 五.…...
Qt添加MySql数据库驱动
文章目录 一. 安装MySql二.编译mysql动态链接库 Qt版本:5.14.2 MySql版本:8.0.41 一. 安装MySql 参考这里进行安装:https://blog.csdn.net/qq_30150579/article/details/146042922 将mysql安装目录里的bin,include和lib拷贝出来…...
MR的环形缓冲区(底层)
MapReduce的大致流程: 1、HDFS读取数据; 2、按照规则进行分片,形成若干个spilt; 3、进行Map 4、打上分区标签(patition) 5、数据入环形缓冲区(KVbuffer) 6、原地排序ÿ…...
RMAN备份bug-审计日志暴涨(select action from gv$session)
问题概述 /oracle 文件系统使用率过大,经过检查是审计日志过大,/oracle 目录 197G 审计日志占用70G,每6个小时产生大量审计日志,日志内容全是select action from gv$session ,猜测可能跟备份有关, $>df -h /oracle…...
30秒从零搭建机器人管理系统(Trae)
1. 安装 [Trae官网】(https://www.trae.com.cn/) 2. 提示词 创建一个BS架构的机器人远程操控系统,具备机器人状态及位置实时更新,可以实现机器人远程遥控,可以对机器人工作日志进行统计分析,以及其它管理系统的常用功能3. 模型…...
OpenFeign 学习笔记
OpenFeign 学习笔记 一、基础入门 1.1 简介 OpenFeign 是基于声明式的 REST 客户端,用于简化服务间远程调用。(编程式 REST 客户端(RestTemplate)) 通过接口注解方式定义 HTTP 请求,自动实现服务调用。 …...
单例模式(线程案例)
单例模式可以分为两种:1.饿汉模式 2.懒汉模式 一.饿汉模式 //饿汉模式👇 class MySingleTon{//因为这是一个静态成员变量,在类加载的时候,就创建了private static MySingleTon mySingleTon new MySingleTon();//创建一个静…...
HttpServletRequest 和 HttpServletResponse 不同JDK版本的引入
java中,可能会用到JWT令牌校验, 这时,大概率会用到 HttpServletRequest,和 HttpServletResponse。 若为 JDK8,SpringBoot 2.7.3 的版本则引入: import javax.servlet.http.HttpServletRequest; import ja…...
数据安全VS创作自由:ChatGPT与国产AI工具隐私管理对比——论文党程序员必看的避坑指南
文章目录 数据安全VS创作自由:ChatGPT与国产AI工具隐私管理对比——论文党程序员必看的避坑指南ChatGPTKimi腾讯元宝DeepSeek 数据安全VS创作自由:ChatGPT与国产AI工具隐私管理对比——论文党程序员必看的避坑指南 产品隐私设置操作路径隐私协议ChatGPT…...
【JavaEE】SpringMVC简单练习
目录 一、计算器1.1 接口定义1.2 前端代码1.3 后端代码1.4 运行结果 二、⽤⼾登录2.1 需求2.2 接口定义2.3 前端页面2.4 后端代码2.5 结果 三、留⾔板3.1 需求:3.2 接口3.3 前端代码3.4 后端代码3.5 运行结果 四、图书管理系统4.1 需求4.2 接口定义4.3 后端代码 一、计算器 1.…...
文件上传漏洞:upload-labs靶场11-20
目录 pass-11 pass-12 pass-13 pass-14 pass-15 pass-16 pass-17 pass-18 pass-19 pass-20 pass-11 分析源代码 ,发现上传文件的存放路径可控 if(isset($_POST[submit])){$ext_arr array(jpg,png,gif);$file_ext substr($_FILES[upload_file][name],st…...
苹果Siri升级遇阻,国行iPhone或将引入阿里、百度AI自救
AI整合进展缓慢 苹果正加速将生成式AI技术整合至Siri,但内部消息称其底层技术研发落后于竞争对手,进展未达预期。 国行iPhone将引入双AI模型 苹果计划在2025年中期为国行iPhone引入AI功能,目前已敲定与 阿里巴巴、百度 合作,用户…...
立即释放 Mac 空间!Duplicate File Finder 8 重复文件高速清理工具
Duplicate File Finder 专业的 Mac 重复文件清理工具。查找并删除重复的文件、文件夹,甚至相似的照片。 不要让无用的文件占用磁盘上的宝贵空间。 整理你的 Mac。用最好的重复文件查找器来管理你的文件集合。 扫描任何磁盘或文件夹 主文件夹、照片/音乐库、外部磁…...
ES时序数据库的性能优化
本文主要是讲解了Elasticsearch数据库的优化,大家可以看一下。因为当时实操中涉及了6版本和7版本的一起优化,所以内容上大家自行区分一下。 一、基础设置 1. jvm.options参数详解 不同版本java配置会不一样 -Xms12g -Xmx12g 说明: 将 Xms…...
第3章:启动界面与主界面设计
第3章:启动界面与主界面设计 学习目标 掌握SwiftUI中的启动界面(Splash Screen)设计与实现学习主界面的布局与导航结构设计实现灵感笔记的列表与网格视图掌握SwiftUI中的动画与过渡效果学习如何使用环境对象共享数据理论知识讲解 启动界面设计原则 启动界面(Splash Scre…...
c++ 作用域解析操作符::
目录 什么是 ::? 基本语法 主要用途 1. 访问全局作用域 2. 访问类的静态成员 3. 访问命名空间中的内容 4. 区分嵌套作用域 5. 在类中定义成员函数 注意事项 什么是 ::? 在C中,:: 是作用域解析操作符(Scope Resolution O…...
JavaScript数据类型转换
在JavaScript编程中,由于其动态类型特性,经常需要在不同的数据类型之间进行转换。正确地执行类型转换不仅能够避免潜在的错误,还能提高代码的灵活性和可维护性。本文将探讨JavaScript中的常见数据类型转换方法,并提供一些实用的例…...
css错峰布局/瀑布流样式(类似于快手样式)
当样式一侧比较高的时候会自动换行,尽量保持高度大概一致, 例: 一侧元素为5,另一侧元素为6 当为5的一侧过于高的时候,可能会变为4/7分部dom节点 如果不需要这样的话删除样式 flex-flow:column wrap; 设置父级dom样…...
AI 技术 引入 RTK(实时动态定位)系统,可以实现智能化管理和自动化运行
将 AI 技术 引入 RTK(实时动态定位)系统,可以实现智能化管理和自动化运行,从而提高系统的精度、效率和可靠性。以下是 AI 技术在 RTK 系统中的应用实例: 一、AI 技术在 RTK 系统中的应用场景 1. 整周模糊度快速解算 问题:RTK 的核心是解算载波相位的整周模糊度,传统方法…...
【STM32F103ZET6——库函数】11.捕获红外信号
目录 红外原理 数据码 引导码 连发码 配置捕获引脚 使能引脚时钟 配置定时器 使能定时器时钟 配置输入捕获 中断优先级分组 配置定时器4中断 定时器中断使能 使能定时器 重写定时器中断服务函数 清空定时器中断标志位 例程 例程说明 main.h main.c HongWai…...
江科大51单片机笔记【9】DS1302实时时钟(上)
一、DS1302介绍 DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能。RTC(Real Time Clock):实时时钟,是一种集成电路…...
在Spring Boot + MyBatis中优雅处理多表数据清洗:基于XML的配置化方案
问题背景 在实际业务中,我们常会遇到数据冗余问题。例如,一个公司表(sys_company)中存在多条相同公司名的记录,但只有一条有效(del_flag0),其余需要删除。删除前需将关联表…...
【计网】网络层
网络层 4.1 网络层提供的两种服务(一) 面向连接的虚电路服务(二) 无连接的数据报服务 4.2 IPv44.2.1 IPv4概述4.2.2 分类编址的IPv4地址4.2.3 划分子网的IPv4地址4.2.4 无分类编址的IPv4地址4.2.5 IPv4地址的应用规划(…...
稳定性保障-前端
前端稳定性保障是确保应用在各种环境下都能 高效、稳定、无错误 运行的策略和方法。可以从 监控、测试、容灾、优化 等方面进行保障。 📌 1. 监控 & 报警 实时监控 线上情况,及时发现问题。 ✅ 1.1 前端错误监控 • Sentry、Fundebug:…...
批量给 Word 中的所有图片添加水印
如果要给一个 Word 文档加水印,很多小伙伴都能轻松的完成,因为使用 Office 就能轻松的操作,并且也有很多第三方的工具可以帮我们实现。那假如需要给 Word 中的每一张图片都添加上水印,那有什么比较好的方法实现呢?今天…...
jQuery UI 简介
jQuery UI 简介 引言 随着互联网技术的飞速发展,前端开发已经成为网站和应用程序建设的重要组成部分。jQuery UI 是一个基于 jQuery 的用户界面库,它为开发者提供了丰富的交互组件和视觉效果,使得创建具有吸引力和互动性的网页变得更加简单。本文将为您详细介绍 jQuery UI…...