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

Servlet简单示例

Servlet简单示例

文章说明

Servlet 虽然是一门旧技术了,但是它的基础性和广泛性仍然不可忽视;我在实践中发现不少同学经常会被它的一些特性给困惑住;时常出现404等错误,这里我写下这篇文章,介绍Servlet的不同版本的特性,以及相关的注意事项;配套有具体的使用示例;附注:代码方面由GPT生成,具体的对话记录在底部附带仓库中有记录

项目介绍

本项目展示了不同版本Tomcat下的Servlet开发示例,包含了以下版本的实现:

  • Tomcat 8.5.x (Servlet 3.1)
  • Tomcat 9.0.x (Servlet 4.0)
  • Tomcat 10.x (Jakarta EE 9)

项目结构

├── 8.5版本示例代码/    # Tomcat 8.5.x 示例
├── 9.0版本示例代码/    # Tomcat 9.0.x 示例
├── 10.0版本示例代码/   # Tomcat 10.x 示例
└── tomcat安装包/       # 各版本Tomcat安装包

版本特性说明

Tomcat 8.5.x

  • 使用Servlet 3.1 API
  • 支持JDK 7及以上版本
  • 使用javax.servlet包名
  • web.xml使用3.1版本规范

Tomcat 9.0.x

  • 使用Servlet 4.0 API
  • 支持JDK 8及以上版本
  • 使用javax.servlet包名
  • web.xml使用4.0版本规范
  • 支持HTTP/2

Tomcat 10.x

  • 使用Jakarta EE 9 API
  • 要求JDK 11及以上版本
  • 包名从javax.servlet变更为jakarta.servlet
  • web.xml使用Jakarta EE规范

示例内容

每个版本的示例都包含:

  1. 注解方式配置的Servlet (@WebServlet)
  2. web.xml方式配置的Servlet
  3. 完整的Maven项目配置

如何运行

环境要求

  • JDK版本要求:
    • 8.5版本:JDK 7+
    • 9.0版本:JDK 8+
    • 10.x版本:JDK 11+
  • Maven 3.6+

构建步骤

  1. 进入对应版本目录
  2. 执行Maven构建
mvn clean package
  1. 将生成的war包复制到对应版本Tomcat的webapps目录
  2. 启动Tomcat
  3. 访问示例页面:http://localhost:8080/[war包名称]/

注意事项

  1. 不同版本的API包名和依赖不同,需注意区分
  2. 确保使用正确版本的JDK
  3. 中文编码问题处理:
    • 设置URIEncoding=“UTF-8”
    • 配置响应编码
    • 设置文件编码为UTF-8
    • 在上述操作都设置了之后,控制台仍有可能报中文乱码,这是因为Windows下控制台的默认编码是GBK,肯定是会乱码的,不过这个不影响项目运行

参考资料

  • Apache Tomcat官方文档
  • Servlet规范
  • Jakarta EE

源码下载

Servlet简单示例

演示截图

1.8.5版本1
在这里插入图片描述

2.8.5版本2
在这里插入图片描述

3.8.5版本3
在这里插入图片描述

4.9.0版本1
在这里插入图片描述

5.9.0版本2
在这里插入图片描述

6.9.0版本3
在这里插入图片描述

7.10.x版本1
在这里插入图片描述

8.10.x版本2
在这里插入图片描述

9.10.x版本3
在这里插入图片描述

对话记录

提问1

帮我书写一下servlet的简单使用示例吧,分别采用@webServlet注解和web.xml 指定,同时书写不同版本的tomcat的示例代码,先写8.5版本的吧,并为我介绍一下tomcat是什么时候切换的api以及对应的版本

回答1

我来帮您创建一个Servlet示例,并解释Tomcat版本的API变化。

首先,让我们了解一下Tomcat的主要版本API变化:

  1. Tomcat 8.5.x 使用 Servlet 3.1 API
  2. Tomcat 9.0.x 使用 Servlet 4.0 API
  3. Tomcat 10.0.x 开始使用 Jakarta EE API,包名从 javax.servlet 变更为 jakarta.servlet

让我们先创建Tomcat 8.5版本的示例:

  1. 首先创建一个简单的HTML页面作为入口:
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>Servlet示例</title>
</head>
<body><h2>Servlet 3.1 示例</h2><hr/><h3>注解方式:</h3><a href="hello">访问HelloServlet(@WebServlet)</a><br/><h3>web.xml方式:</h3><a href="welcome">访问WelcomeServlet(web.xml)</a>
</body>
</html>
  1. 创建使用注解的Servlet:
package com.example.servlet;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;@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><title>Hello Servlet</title></head>");out.println("<body>");out.println("<h2>这是通过@WebServlet注解配置的Servlet</h2>");out.println("<p>当前时间: " + new java.util.Date() + "</p>");out.println("<a href='index.html'>返回首页</a>");out.println("</body></html>");}
}
  1. 创建使用web.xml配置的Servlet:
package com.example.servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;public class WelcomeServlet 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><title>Welcome Servlet</title></head>");out.println("<body>");out.println("<h2>这是通过web.xml配置的Servlet</h2>");out.println("<p>当前时间: " + new java.util.Date() + "</p>");out.println("<a href='index.html'>返回首页</a>");out.println("</body></html>");}
}
  1. 配置web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"version="3.1"><servlet><servlet-name>welcomeServlet</servlet-name><servlet-class>com.example.servlet.WelcomeServlet</servlet-class></servlet><servlet-mapping><servlet-name>welcomeServlet</servlet-name><url-pattern>/welcome</url-pattern></servlet-mapping>
</web-app>
  1. 创建Maven的pom.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>servlet-demo</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.3.2</version></plugin></plugins></build>
</project>

这个示例展示了在Tomcat 8.5下使用Servlet 3.1 API的两种配置方式:

  1. 使用@WebServlet注解(推荐方式)
  2. 使用传统的web.xml配置

要运行这个项目:

  1. 使用Maven打包:
mvn clean package
  1. 将生成的war包复制到Tomcat的webapps目录下:
copy target\servlet-demo-1.0-SNAPSHOT.war e:\workspace\Git\simple-example-of-servlet\tomcat安装包\apache-tomcat-8.5.90\webapps\
  1. 启动Tomcat:
e:\workspace\Git\simple-example-of-servlet\tomcat安装包\apache-tomcat-8.5.90\bin\startup.bat

访问:http://localhost:8080/servlet-demo-1.0-SNAPSHOT/ 即可看到示例页面。

这个示例完整展示了Servlet 3.1在Tomcat 8.5中的使用。如果您需要Tomcat 9.0的示例,我也可以为您展示其中的区别。主要区别在于web.xml的版本号和Servlet API的版本。

提问2

继续生成9.0之后的吧

回答2

好的,我来帮您创建Tomcat 9.0和10.0版本的Servlet示例。

首先是Tomcat 9.0版本(使用Servlet 4.0 API)的示例:

  1. 创建Maven项目配置:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>servlet-demo-9</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.3.2</version></plugin></plugins></build>
</project>
  1. 创建web.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><servlet><servlet-name>welcomeServlet</servlet-name><servlet-class>com.example.servlet.WelcomeServlet</servlet-class></servlet><servlet-mapping><servlet-name>welcomeServlet</servlet-name><url-pattern>/welcome</url-pattern></servlet-mapping>
</web-app>
  1. 创建Servlet示例:
package com.example.servlet;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;@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><title>Hello Servlet</title></head>");out.println("<body>");out.println("<h2>这是Tomcat 9.0 - Servlet 4.0的示例</h2>");out.println("<p>当前时间: " + new java.util.Date() + "</p>");// 演示HTTP/2推送功能(Servlet 4.0新特性)if (request.getProtocol().equals("HTTP/2.0")) {request.newPushBuilder().path("images/logo.png").push();}out.println("<a href='index.html'>返回首页</a>");out.println("</body></html>");}
}

接下来是Tomcat 10.0版本(使用Jakarta EE 9 API)的示例:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>servlet-demo-10</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><version>5.0.0</version><scope>provided</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.3.2</version></plugin></plugins></build>
</project>
package com.example.servlet;import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;@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><title>Hello Servlet</title></head>");out.println("<body>");out.println("<h2>这是Tomcat 10 - Jakarta EE 9的示例</h2>");out.println("<p>当前时间: " + new java.util.Date() + "</p>");out.println("<p>注意包名从javax.servlet变为jakarta.servlet</p>");out.println("<a href='index.html'>返回首页</a>");out.println("</body></html>");}
}

主要变化说明:

  1. Tomcat 9.0 (Servlet 4.0)的主要变化:

    • web.xml版本升级到4.0
    • 引入了HTTP/2的服务器推送等新特性
    • 依然使用javax.servlet包名
  2. Tomcat 10.0的重大变化:

    • 包名从javax.servlet变更为jakarta.servlet
    • 需要Java 11或更高版本
    • 使用Jakarta EE 9 API
    • web.xml的命名空间也相应变化

要运行这些项目,分别执行:

cd 9.0版本示例代码
mvn clean package
copy target\servlet-demo-9-1.0-SNAPSHOT.war ..\tomcat安装包\apache-tomcat-9.0.104\webapps\cd ..\10.0版本示例代码
mvn clean package
copy target\servlet-demo-10-1.0-SNAPSHOT.war ..\tomcat安装包\apache-tomcat-10.1.40\webapps\

这些示例展示了Servlet API的演进过程,特别是从Tomcat 10开始的重大变化。建议在新项目中使用最新的Jakarta EE API,以获得更好的长期支持。

提问3

9.0和10.0里面都少了东西,9.0的没有WelcomeServlet的实现,以及index.html 页面,10.0的甚至连web.xml和HelloServlet都没有

回答3

好的,我来帮您补充缺失的文件。

  1. 首先补充9.0版本的缺失文件:
package com.example.servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;public class WelcomeServlet 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><title>Welcome Servlet</title></head>");out.println("<body>");out.println("<h2>这是Tomcat 9.0 - 通过web.xml配置的Servlet</h2>");out.println("<p>当前时间: " + new java.util.Date() + "</p>");out.println("<a href='index.html'>返回首页</a>");out.println("</body></html>");}
}
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>Servlet 4.0示例</title>
</head>
<body><h2>Servlet 4.0 示例</h2><hr/><h3>注解方式:</h3><a href="hello">访问HelloServlet(@WebServlet)</a><br/><h3>web.xml方式:</h3><a href="welcome">访问WelcomeServlet(web.xml)</a>
</body>
</html>
  1. 补充10.0版本的缺失文件:
<?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"><servlet><servlet-name>welcomeServlet</servlet-name><servlet-class>com.example.servlet.WelcomeServlet</servlet-class></servlet><servlet-mapping><servlet-name>welcomeServlet</servlet-name><url-pattern>/welcome</url-pattern></servlet-mapping>
</web-app>
package com.example.servlet;import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;@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><title>Hello Servlet</title></head>");out.println("<body>");out.println("<h2>这是Tomcat 10 - Jakarta EE 9的示例</h2>");out.println("<p>当前时间: " + new java.util.Date() + "</p>");out.println("<p>注意包名从javax.servlet变为jakarta.servlet</p>");out.println("<a href='index.html'>返回首页</a>");out.println("</body></html>");}
}
package com.example.servlet;import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;public class WelcomeServlet 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><title>Welcome Servlet</title></head>");out.println("<body>");out.println("<h2>这是Tomcat 10 - 通过web.xml配置的Servlet</h2>");out.println("<p>当前时间: " + new java.util.Date() + "</p>");out.println("<p>注意包名从javax.servlet变为jakarta.servlet</p>");out.println("<a href='index.html'>返回首页</a>");out.println("</body></html>");}
}
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>Jakarta EE 9示例</title>
</head>
<body><h2>Jakarta EE 9 示例</h2><hr/><h3>注解方式:</h3><a href="hello">访问HelloServlet(@WebServlet)</a><br/><h3>web.xml方式:</h3><a href="welcome">访问WelcomeServlet(web.xml)</a>
</body>
</html>

这样就补充完了所有缺失的文件。主要的区别在于:

  1. Tomcat 9.0版本使用javax.servlet包名,web.xml使用javaee命名空间
  2. Tomcat 10.0版本使用jakarta.servlet包名,web.xml使用jakartaee命名空间

现在两个版本的示例都是完整的了,可以分别部署到对应版本的Tomcat中运行。

提问4

tomcat10是不是不能用jdk8来运行了

回答4

是的,Tomcat 10.x 版本确实不能使用JDK 8了。让我解释一下原因和要求:

  1. Tomcat 10.x 的最低JDK要求:

    • 需要JDK 11或更高版本
    • 这是因为Jakarta EE 9(Tomcat 10使用的规范)要求最低Java版本为JDK 11
  2. 不同版本Tomcat对JDK版本的要求:

    • Tomcat 8.5.x: 支持JDK 7及以上
    • Tomcat 9.0.x: 支持JDK 8及以上
    • Tomcat 10.x: 要求JDK 11及以上

这一点可以从当前项目中的pom.xml配置看出差异:

<properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><!-- ... 其他配置 ... -->
</properties>

而在Tomcat 10的项目中:

<properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><!-- ... 其他配置 ... -->
</properties>

如果您的项目必须使用JDK 8,建议使用以下版本:

  1. 首选:Tomcat 9.0.x (支持Servlet 4.0)
  2. 备选:Tomcat 8.5.x (支持Servlet 3.1)

如果您尝试使用JDK 8运行Tomcat 10,会遇到启动失败的问题,因为:

  1. Jakarta EE 9的API需要JDK 11的特性支持
  2. 部分内部实现使用了JDK 11的新特性
  3. 类加载机制有所变化

因此,在选择Tomcat版本时,需要考虑项目的JDK版本约束。如果您的项目可以升级到JDK 11或更高版本,建议使用最新的Tomcat 10,以获得更好的特性支持和长期维护。

相关文章:

Servlet简单示例

Servlet简单示例 文章说明 Servlet 虽然是一门旧技术了&#xff0c;但是它的基础性和广泛性仍然不可忽视&#xff1b;我在实践中发现不少同学经常会被它的一些特性给困惑住&#xff1b;时常出现404等错误&#xff0c;这里我写下这篇文章&#xff0c;介绍Servlet的不同版本的特…...

spring:注解@Component、@Controller、@Service、@Reponsitory

背景 spring框架的一个核心功能是IOC&#xff0c;就是将Bean初始化加载到容器中&#xff0c;Bean是如何加载到容器的&#xff0c;可以使用spring注解方式或者spring XML配置方式。 spring注解方式直接对项目中的类进行注解&#xff0c;减少了配置文件内容&#xff0c;更加便于…...

LLM做逻辑推理题 - 野鸭蛋的故事

题目: 四个旅游家&#xff08;张虹、印玉、东晴、西雨&#xff09;去不同的岛屿去旅行&#xff0c;每个人都在岛上发现了野鸡蛋&#xff08;1个到3个&#xff09;。4人的年龄各不相同&#xff0c;是由18岁到21岁。已知&#xff1a; ①东晴是18岁。 ②印玉去了A岛。 ③21岁的女…...

Linux的目录结构(介绍,具体目录结构)

目录 介绍 具体目录结构 简洁的目录解释 详细的目录解释 介绍 Linux的文件系统是采用级层式的树状目录结构&#xff0c;在此结构的最上层是根目录“/”。Linux的世界中&#xff0c;一切皆文件&#xff08;比如&#xff1a;Linux会把硬件映射成文件来管理&#xff09; 具体目…...

C++Cherno 学习笔记day21 [86]-[90] 持续集成、静态分析、参数计算顺序、移动语义、stdmove与移动赋值操作符

b站Cherno的课[86]-[90] 一、C持续集成二、C静态分析三、C的参数计算顺序四、C移动语义五、stdmove与移动赋值操作符 一、C持续集成 Jenkins 商业软件 二、C静态分析 静态分析器会检查你的代码&#xff0c;并尝试检测各种错误&#xff0c;这些错误 可能是你无意中编写的&am…...

python学习 -- 综合案例1:设计一款基于python的飞机大战小游戏

本文目录 pygame模块介绍核心模块与功能开发流程 本文案例 - 飞机大战开发流程1. 导入必要的库2. 定义常量3. 创建精灵类4. 主程序 运行游戏 总结 pygame模块介绍 Pygame 是基于 Python 的开源、跨平台游戏开发库&#xff0c;依托 SDL&#xff08;Simple DirectMedia Layer&am…...

开启 Python 编程之旅:基础入门实战班全解析

重要的东西放前面 开启 Python 编程之旅&#xff1a;基础入门实战班全解析 开启Python编程之旅&#xff1a;基础入门实战班全解析 在当下热门的编程语言中&#xff0c;Python凭借简洁易读的语法、强大的功能和丰富的库&#xff0c;在数据科学、人工智能、Web开发等诸多领域大…...

Linux笔记---动静态库(原理篇)

1. ELF文件格式 动静态库文件的构成是什么样的呢&#xff1f;或者说二者的内容是什么&#xff1f; 实际上&#xff0c;可执行文件&#xff0c;目标文件&#xff0c;静态库文件&#xff0c;动态库文件都是使用ELF文件格式进行组织的。 ELF&#xff08;Executable and Linkable…...

SpringBoot整合Logback日志框架深度实践

一、依赖与默认集成机制 SpringBoot从2.x版本开始默认集成Logback日志框架&#xff0c;无需手动添加额外依赖。当项目引入spring-boot-starter-web时&#xff0c;该组件已包含spring-boot-starter-logging&#xff0c;其底层实现基于LogbackSLF4J组合。这种设计使得开发者只需…...

Spring Boot中接入DeepSeek的流式输出

第一步&#xff0c;添加依赖&#xff1a; <!-- WebFlux 响应式支持 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId> </dependency> 第二步&#xff0c;配置We…...

路由交换网络专题 | 第四章 | 生成树 | VRRP | 边缘端口

拓扑图 &#xff08;1&#xff09;SW1、SW2、SW3 三台交换机之间存在环路问题&#xff0c;需要通过生成树协议破环&#xff0c;请简述二层环路可能导致的问题。 因为交换机在收到一个广播帧之后&#xff0c;会对非接收端口进行转发。每台交换机都转发的话&#xff0c;就行形成一…...

SFOS2:常用容器(布局)介绍

一、前言 最近在进行sailfish os的开发&#xff0c;由于在此之前并没有从事过QT开发的工作&#xff0c;所以对这一套颇为生疏&#xff0c;以此记录一下。以下内容不一定完全准确&#xff0c;开发所使用的是Qt Quick 2.6与Sailfish.Silica 1.0两个库。 二、布局 1.Qt Quick 2.…...

VS qt 联合开发环境下的多国语言翻译

添加Linguist 文件方法&#xff0c;如同添加类文件的方式&#xff0c;那样&#xff1a; 其他跟QT的一样的流程&#xff0c;另外在main函数里要注册一下&#xff0c; QTextCodec::setCodecForLocale(textCodec); QTranslator translator5; QString trans5 fi…...

基于 Python 的 ROS2 应用开发全解析

引言 在机器人操作系统&#xff08;ROS&#xff09;不断发展的进程中&#xff0c;ROS2 作为新一代的机器人框架&#xff0c;带来了诸多显著的改进与新特性。Python 作为一种简洁、高效且具有强大数据处理能力的编程语言&#xff0c;在 ROS2 应用开发中占据着重要地位。本文将深…...

AI分析师

01 实操 人工 公司需要开发了一个XX系统&#xff0c;在文件夹中包含了XX.csv&#xff0c;其中每一行表示一个XX样本&#xff0c;最后一列为每个样本的标签&#xff0c;现需要设计模型与系统&#xff0c;请按照以下要求完成算法测试。根据要求完成以下任务&#xff0c;将完成的…...

Redis核心数据类型在实际项目中的典型应用场景解析

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 Redis作为高性能的键值存储系统&#xff0c;在现代软件开发中扮演着重要角色。其多样化的数据结构为开发者提供了灵活的解决方案&#xff0c;本文将通过真实项…...

LLamaIndex中经常使用的三个模块

from aiostream import stream from fastapi import Request from fastapi.responses import StreamingResponse from llama_index.core.chat_engine.types import StreamingAgentChatResponse这四个模块每一个都很实用&#xff0c;在实际开发中经常用到&#xff0c;下面我就详…...

Idea集成AI:CodeGeeX开发

当入职新公司&#xff0c;或者调到新项目组进行开发时&#xff0c;需要快速熟悉项目代码 而新的项目代码&#xff0c;可能有很多模块&#xff0c;很多的接口&#xff0c;很复杂的业务逻辑&#xff0c;更加有与之前自己的代码风格不一致的现有复杂代码 更别提很多人写代码不喜…...

软考 中级软件设计师 考点知识点笔记总结 day12 计算机网络基础知识

文章目录 计算机网络基础5.1、计算机网络基础知识5.1.1 计算机网络分类5.1.2 七层网络体系结构5.1.3 网络标准5.1.4 TCP/IP协议族5.1.5 IP地址和IPv6简介5.1.6 Internet服务 计算机网络基础 要求掌握以下内容 5.1、计算机网络基础知识 网络体系结构 传输介质 传输技术 传输…...

【扩散模型(十三)】Break-A-Scene 可控生成,原理与代码详解(中)Cross Attn Loss 代码篇

系列文章目录 【扩散模型&#xff08;一&#xff09;】中介绍了 Stable Diffusion 可以被理解为重建分支&#xff08;reconstruction branch&#xff09;和条件分支&#xff08;condition branch&#xff09;【扩散模型&#xff08;二&#xff09;】IP-Adapter 从条件分支的视…...

C语言数字图像处理---2.31统计滤波器

本文介绍空域滤波器中的一种:统计滤波器 [定义与算法] 统计滤波(Statistic Filter)定义:基于图像处理中的邻域统计方法,对邻域内的像素信息进行统计,如基于均值和方差的信息,用于平滑或去噪图像,同时保留边缘信息。 算法步骤如下: 统计滤波器的优点和缺点主要包…...

流程设计实战:流程架构设计六步法

目录 简介 1、梳理业务模式及场景 2、甄别核心业务能力 3、搭建差异化的业务流程框架 4、定义L4流程能力 5、L4流程串联 6、展开L5业务流程 作者简介 简介 以往在设计流程的时候&#xff0c;我多数都是采用的自下而上的方式&#xff0c;从具体场景、具体问题出发去做流…...

SDK游戏盾如何接入?复杂吗?

接入SDK游戏盾&#xff08;通常指游戏安全防护类SDK&#xff0c;如防DDoS攻击、防作弊、防外挂等功能&#xff09;的流程和复杂度取决于具体的服务商&#xff08;如腾讯云、上海云盾等&#xff09;以及游戏类型和技术架构。以下是一般性的接入步骤、复杂度评估及注意事项&#…...

STM32F103C8T6 单片机入门基础知识及点亮第一个 LED 灯

目录 一、引言 二、STM32F103C8T6 基本特性 1. 内核与性能 2. 存储器 3. 时钟系统 4. GPIO&#xff08;通用输入输出&#xff09; 5. 外设 三、开发环境搭建 1. 硬件准备 2. 软件安装 四、点亮第一个 LED 灯 1. 硬件连接 2. 软件实现 &#xff08;1&#xff09;创…...

JavaScript Worker池实现教程

JavaScript Worker池实现教程 Worker池是一种管理和复用Web Workers的有效方法&#xff0c;可以在不频繁创建和销毁Worker的情况下&#xff0c;充分利用多线程能力提升应用性能。下面我将详细介绍如何在JavaScript中实现一个功能完善的Worker池。 为什么需要Worker池&#xf…...

【统信UOS操作系统】python3.11安装numpy库及导入问题解决

一、安装Python3.11.4 首先来安装Python3.11.4。所用操作系统&#xff1a;统信UOS 前提是准备好Python3.11.4的安装包&#xff08;可从官网下载&#xff08;链接&#xff09;&#xff09;&#xff0c;并解压到本地&#xff1a; 右键&#xff0c;选择“在终端中打开”&#xff…...

Navicat导入JSON数据到MySQL表

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Navicat导入JSON数据到MySQL表1. 导入入口2.…...

体育比分小程序怎么提示日活

要提高体育比分小程序的日活跃用户(DAU)&#xff0c;您可以考虑以下几个方面的策略&#xff1a; 一、核心功能优化 1.实时推送&#xff1a;确保比分更新真正实时&#xff0c;延迟不超过2秒&#xff0c;推荐接入熊猫比分API体育数据&#xff0c;比分实时更新 2.个性化订阅&am…...

【星海随笔】Python-JSON数据的处理

JSON 是一种轻量级的数据交换格式&#xff0c;主要用于在客户端和服务器之间传输数据。 JSON 在 python 里是一个标准库 https://www.jyshare.com/compile/9/ import json data {name: Alice, age: 30, city: New York} json_string json.dumps(data) print(json_string)js…...

Tomcat与Servlet

目录 1 Tomcat 1.1 目录结构 1.2 启动服务器 1.3 部署 2 Servlet 2.1 创建项目 &#xff08;1&#xff09;创建Maven项目 &#xff08;2&#xff09;目录结构 &#xff08;3&#xff09;引入依赖 &#xff08;4&#xff09;创建必要的目录结构 &#xff08;5&#xf…...

MySQL MVCC工作流程详解

MySQL MVCC工作流程详解 1. 基础概念 MVCC&#xff08;多版本并发控制&#xff09;是通过在每行记录后面保存多个版本来实现并发控制的技术&#xff0c;主要用于提供并发事务访问数据库时的读一致性。 2. 核心要素 2.1 事务ID&#xff08;DB_TRX_ID&#xff09; 每个事务都…...

unityTEngine 框架学习记录1

目前项目再用QF框架其中的UI部分&#xff0c;突然有天想学习一下其他好用的框架UI&#xff0c;根据我多年网友胖菊大佬的推荐TE映入眼帘,网上找了一下发现学习教程没有几个&#xff0c;不太适合啥都不会的小白&#xff0c;然后我就加入了ET官方群&#xff0c;里面人长得又帅又有…...

算法的时间复杂度

整理了下算法的时间复杂度&#xff0c;跟大家一起分享下。 时间复杂度O是表示算法运行时间与输入数据规模&#xff08;通常用 n 表示&#xff09;之间的关系。算法执行时间随输入数据规模增长的变化趋势。 1、O(1) — 常数时间 无论输入数据多大&#xff0c;执行时间固定不变…...

深度学习 从入门到精通 day_01

Pytorch安装 torch安装 python版本3.9.0 在官方文档里面找到适合你设备的PyTorch版本及对应的安装指令执行即可&#xff1a;https://pytorch.org/get-started/previous-versions/ 针对我的网络及设备情况&#xff0c;我复制了如下指令完成了Torch的安装&#xff1a; …...

AutoToM:让AI像人类一样“读心”的突破性方法

引言&#xff1a;AI如何理解人类的“内心世界”&#xff1f; 如何让AI像人类一样理解他人的意图、情感和动机&#xff1f;这一问题的核心是心智理论&#xff08;Theory of Mind, ToM&#xff09;&#xff0c;即通过观察行为推断心理状态的能力。近日&#xff0c;约翰霍普金斯大…...

Java实现Redis

String类型 代码 package com.whop.changyuan2.redisTest;import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.cor…...

DAY09:【pytorch】nn网络层

1、卷积层 1.1 Convolution 1.1.1 卷积操作 卷积运算&#xff1a;卷积核在输入信号&#xff08;图像&#xff09;上滑动&#xff0c;相应位置上进行乘加卷积核&#xff1a;又称为滤波器、过滤器&#xff0c;可认为是某种模式、某种特征 1.1.2 卷积维度 一般情况下&#xf…...

河南普瑞维升企业案例:日事清SOP流程与目标模块实现客户自主简报功能落地

公司简介&#xff1a; 河南普瑞维升企业管理咨询有限公司成立于2017年&#xff0c;目前公司主营业务是为加油站提供全方面咨询管理服务&#xff0c;目前公司成功运营打造河南成品油&#xff0c;运营站点15座&#xff0c;会员数量已达几十万&#xff0c;在加油站周边辐射区域内…...

LeetCode面试热题150中19-22题学习笔记(用Java语言描述)

Day 04 19、最后一个单词的长度 需求&#xff1a;给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 代码表示 public class Q19_1 {p…...

车载刷写架构 --- 刷写流程中重复擦除同一地址的问题分析

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…...

一个测试GPU可用的测试实例

一个测试GPU可用的测试实例&#xff1a; import torch import torch.nn as nn import torch.optim as optim import time import gc import numpy as np from torch.cuda.amp import autocast, GradScalerclass LargeNN(nn.Module):def __init__(self, use_attentionTrue):sup…...

chili3d调试笔记2+添加web ui按钮

onclick 查找 打个断点看看 挺可疑的&#xff0c;打个断点看看 挺可疑的&#xff0c;打个断点看看 打到事件监听上了 加ui了 加入成功 新建弹窗-------------------------------------- 可以模仿这个文件&#xff0c;写弹窗 然后在这里注册一下&#xff0c;外部就能调用了 对了…...

Go-zero:JWT鉴权方式

1.简述 用于记录在go-zero的后端项目中如何添加jwt中间件鉴权 2.流程 配置api.yaml Auth:AccessSecret: "secret_key"AccessExpire: 604800config中添加Auth结构体 Auth struct {AccessSecret stringAccessExpire int64 }types定义jwt token的自定义数据结构&#…...

MySQL的MVCC机制详解

1. 什么是MVCC&#xff1f; MVCC&#xff08;Multi-Version Concurrency Control&#xff0c;多版本并发控制&#xff09;是数据库系统中用于实现并发控制的一种技术。它通过保存数据在某个时间点的快照来实现&#xff0c;使得在同一个数据行上可以同时存在多个版本&#xff0…...

Postman做自动化测试

Postman也可以实现接口自动化 1.在Scripts写断言&#xff0c;图中红框处。不会写可以偷懒使用蓝框处会自动填写 2.单个运行调试&#xff0c;结果显示在TestResults 3.多个接口都写好断言并调通后&#xff0c;在包揽这些接口的文件夹下运行&#xff0c;图示以两个接口为例&…...

Meltdown原理介绍:用户空间读取内核内存

摘要 计算机系统的安全性从根本上依赖内存隔离,如,内核地址范围被标记为不可访问并受到保护,以防用户非法访问。本文介绍了Meltdown。 利用现代处理器上乱序执行,来读取内核任意的内存位置,包括个人数据和密码。乱序执行是必不可少的用来提升性能的手段,并在现代处理器中…...

数据结构和算法(七)--树

一、树 树是我们计算机中非常重要的一种数据结构&#xff0c;同时使用树这种数据结构&#xff0c;可以描述现实生活中的很多事物&#xff0c;例如家谱、单位的组织架构、等等。 树是由n(n>1)个有限结点组成一个具有层次关系的集合。把它叫做"树"是因为它看起来像一…...

UDP猜数字游戏与TCP文件传输案例解析

目录 案例一&#xff1a;UDP协议实现的猜数字游戏 游戏概述 服务器端代码 客户端代码 (udp_client.py) 游戏特点 案例二&#xff1a;TCP协议实现的文件传输工具 工具概述 服务器端代码 客户端代码 工具特点 总结对比 案例一&#xff1a;UDP协议实现的猜数字游戏 游…...

WPF View 与ViewModel注入对象

View 和ViewModel中使用同一个类型的类&#xff0c;注入的对象在主机中通过在服务中添加 AddTransient 获取的不是同一个对象&#xff0c;在 View 绑定了在ViewModel 中是取不到的&#xff0c;应该在View 中注入ViewModel 对象&#xff0c;使用View中的ViewModel对象里面的参数…...

如何下载免费地图数据?

按照以下步骤下载免费地图数据。 1、安装GIS地图下载器 从GeoSaaS&#xff08;.COM&#xff09;官网下载“GIS地图下载器”软件&#xff1a;&#xff0c;安装完成后桌面上出现”GIS地图下载器“图标。 双击桌面图标打开”GIS地图下载器“ 2、下载地图数据 点击主界面底部的“…...