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

Java Web-Tomcat Servlet

Web服务器-Tomcat

Web服务器简介

Web 服务器是一种软件程序,它主要用于在网络上接收和处理客户端(如浏览器)发送的 HTTP 请求,并返回相应的网页内容或数据。以下是关于 Web 服务器的详细介绍:

功能

  • 接收请求:监听网络端口,等待客户端发送 HTTP 请求,一旦收到请求,它会解析请求的内容,包括请求的方法(如 GET、POST 等)、请求的 URL 以及请求头信息等。
  • 处理请求:根据请求的 URL 和其他信息,查找对应的资源或执行相应的程序逻辑。如果请求的是静态资源(如 HTML 文件、图片、CSS 样式表等),Web 服务器会直接从本地文件系统中读取并返回这些资源;如果请求的是动态资源(如 JSP、PHP、ASPX 等脚本文件),Web 服务器会将请求传递给相应的脚本解释器或应用服务器进行处理,然后将处理结果返回给客户端。
  • 响应请求:将处理后的结果以 HTTP 响应的形式发送回客户端,响应内容包括状态码(如 200 表示成功、404 表示未找到等)、响应头信息和响应体(即实际返回的网页内容或数据)。
  • 管理连接:负责管理与客户端的连接,包括建立连接、保持连接状态、处理连接中断等情况。它可以同时处理多个并发的客户端连接,确保每个请求都能得到及时处理。

常见的 Web 服务器软件

  • Apache HTTP Server:是一款广泛使用的开源 Web 服务器,具有高度的稳定性和丰富的功能。它支持多种操作系统,能够处理大量的并发请求,并且可以通过各种模块进行扩展,如支持 SSL 加密、CGI 脚本、PHP 等。
  • Nginx:也是一款开源的高性能 Web 服务器,它以轻量级、高并发处理能力著称。Nginx 在处理静态资源方面效率极高,同时也可以作为反向代理服务器、负载均衡器等使用,常用于构建高性能的 Web 应用架构。
  • Microsoft IIS(Internet Information Services):是微软开发的 Web 服务器软件,集成在 Windows 操作系统中。它提供了图形化的管理界面,易于配置和管理,支持 ASP、ASPX、.NET 等技术,适用于 Windows 环境下的 Web 应用部署。
  • Tomcat:主要用于运行 Java Web 应用,支持 Servlet、JSP 等技术。它是一个轻量级的应用服务器,既可以作为独立的 Web 服务器使用,也可以与其他 Web 服务器(如 Apache)集成,共同提供更强大的 Web 服务。

作用

  • 发布网站:将网站的各种文件(如 HTML、CSS、JavaScript、图片等)存储在服务器上,并通过 Web 服务器将这些文件发布到互联网上,使得用户可以通过浏览器访问网站。
  • 运行 Web 应用程序:支持各种动态 Web 应用程序的运行,如电子商务系统、企业管理系统、在线论坛等。这些应用程序通常包含复杂的业务逻辑和数据库交互,Web 服务器负责协调各个组件之间的通信,处理用户请求并返回相应的结果。
  • 提供数据服务:可以作为数据服务器,向客户端提供各种数据,如 JSON 数据、XML 数据等。这些数据可以被用于网页的动态加载、移动应用的数据获取等。

Tomcat

Tomcat 作为一款常用的 Web 服务器,在 Java Web 应用的开发和部署中发挥着重要作用,以下是关于它的详细介绍:

基本信息

Tomcat 是由 Apache 软件基金会开发和维护的开源轻量级 Web 应用服务器,支持 Servlet、JSP(JavaServer Pages)、WebSocket 等多种 Java Web 技术,为开发和部署动态 Web 应用提供了有力支持。

核心功能

  • Servlet 容器:负责管理 Servlet 的生命周期,接收客户端请求并将其分配给相应的 Servlet 进行处理,然后将处理结果返回给客户端。
  • JSP 引擎:能够将 JSP 页面转换为 Java Servlet 源代码,并进行编译和执行。在运行时,JSP 引擎会根据页面的更新情况自动重新编译 JSP 页面,确保应用程序能够及时反映出代码的变化。
  • HTTP 服务器:具备基本的 HTTP 服务器功能,能够监听指定端口上的 HTTP 请求,解析请求信息,并返回相应的响应。
  • 连接器:支持多种协议的连接,如 HTTP、HTTPS、AJP(Apache JServ Protocol)等,方便与其他服务器或应用程序进行通信。

工作原理

  • 接收请求:作为 Web 服务器,Tomcat 监听指定端口(默认 8080)上的 HTTP 请求。当客户端发送请求时,Tomcat 接收并解析请求信息。
  • Servlet 处理:如果请求的是一个 Servlet,Tomcat 会根据请求的 URL 找到对应的 Servlet,并创建一个 ServletRequest 和 ServletResponse 对象,将请求信息封装在 ServletRequest 中传递给 Servlet 的 service 方法进行处理。Servlet 根据业务逻辑生成响应数据,通过 ServletResponse 对象返回给客户端。
  • JSP 处理:对于 JSP 页面请求,Tomcat 首先将 JSP 页面转换为 Java Servlet 源代码,然后编译成字节码。之后的处理过程与 Servlet 类似,生成的响应数据被发送回客户端。

优势

  • 开源免费:遵循 Apache 许可协议,用户可以自由使用、分发和修改,降低了软件成本,尤其适合预算有限的项目和开发者。
  • 轻量级:占用系统资源少,启动速度快,在各种规模的项目中,特别是中小型应用中表现出色,能够快速响应客户端请求。
  • 可扩展性强:通过插件和扩展机制,方便添加新功能,如安全认证、集群支持、监控和管理工具等,以满足不同应用场景的需求。

应用场景

  • Java Web 应用开发与测试:开发人员在开发过程中,可以将 Tomcat 作为本地服务器,方便进行代码调试和功能测试,快速验证应用程序的正确性和稳定性。
  • 企业级应用部署:许多企业级应用选择 Tomcat 作为应用服务器,承载各种业务系统,如电子商务网站、企业资源规划(ERP)系统、客户关系管理(CRM)系统等,为企业的日常运营提供支持。
  • 学习与教学:由于其开源和轻量级的特点,适合初学者学习 Java Web 开发和服务器配置相关知识,帮助他们快速上手并理解 Web 应用的运行原理。

安装与配置

  • 下载安装:从 Tomcat 官方网站(Apache Tomcat® - Welcome!)下载适合你操作系统的版本,解压到指定目录即可完成安装。
  • 配置环境变量:在系统环境变量中设置CATALINA_HOME指向 Tomcat 的安装目录,方便在命令行中执行 Tomcat 相关命令。
  • 端口配置:如果默认的 8080 端口被占用,可以在 Tomcat 安装目录的conf文件夹下的server.xml文件中修改Connector元素的port属性来指定其他端口。
  • 部署应用:将 Web 应用的 WAR 文件放置在 Tomcat 的webapps目录下,Tomcat 会自动解压并部署应用。也可以通过修改server.xml文件或使用 Tomcat 的管理界面进行应用部署。
  • Tomcat的常用Maven插件


Servlet

Servlet 简介

Servlet 是运行在 Web 服务器上的小型 Java 程序,它扩展了服务器的功能,能够动态生成 Web 页面或处理客户端请求。它充当了客户端(通常是 Web 浏览器)和服务器之间的中间层,接收客户端的请求,进行相应的处理,并生成响应返回给客户端。

Servlet 的工作流程

  1. 客户端发送请求到服务器。
  2. 服务器根据请求的 URL 查找相应的 Servlet。
  3. 服务器调用 Servlet 的 service() 方法,根据请求类型调用 doGetdoPost 等方法。
  4. Servlet 处理请求并生成响应。
  5. 服务器将响应发送给客户端。

Servlet 的主要作用

  1. 处理 HTTP 请求

    • Servlet 可以处理多种 HTTP 请求方法,如 GETPOSTPUTDELETE 等。
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;public class MyServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 处理 GET 请求response.getWriter().println("This is a GET request.");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 处理 POST 请求response.getWriter().println("This is a POST request.");}
    }
    
     

    在这个例子中,MyServlet 类继承自 HttpServlet,并重写了 doGet 和 doPost 方法,分别处理 GET 和 POST 请求。

  2. 动态生成内容

    • Servlet 可以根据请求的不同,动态生成 HTML、XML、JSON 等内容。
    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 DynamicContentServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();out.println("<html><body>");out.println("<h1>Hello, " + request.getParameter("name") + "</h1>");out.println("</body></html>");}
    }
    
     

    上述 Servlet 接收一个 name 参数,并在 HTML 页面中动态显示欢迎信息。

  3. 会话管理

    • Servlet 可以使用 HttpSession 进行会话管理,维护用户的会话状态。
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.io.IOException;public class SessionServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {HttpSession session = request.getSession(true);session.setAttribute("username", "John");String username = (String) session.getAttribute("username");response.getWriter().println("Username: " + username);}
    }
    

    在这个例子中,使用 HttpSession 存储和获取用户的 username

Servlet 的生命周期

  1. 初始化阶段

    • 当 Servlet 容器启动或首次请求 Servlet 时,会调用 Servlet 的 init() 方法进行初始化。
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;public class LifeCycleServlet extends HttpServlet {@Overridepublic void init(ServletConfig config) throws ServletException {super.init(config);System.out.println("Servlet is initialized.");}
    }
    
     

    在上述 Servlet 中,重写 init 方法,当 Servlet 被初始化时会输出一条消息。

  2. 请求处理阶段

    • 当接收到客户端的请求时,会调用 service() 方法,根据请求的类型,调用 doGetdoPost 等方法。
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;public class LifeCycleServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println("Processing a GET request.");response.getWriter().println("GET request processed.");}
    }
    
     

    这个 Servlet 会在处理 GET 请求时输出消息并向客户端发送响应。

  3. 销毁阶段

    • 当 Servlet 容器关闭或 Servlet 长时间未使用时,会调用 destroy() 方法销毁 Servlet。
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;public class LifeCycleServlet extends HttpServlet {@Overridepublic void destroy() {System.out.println("Servlet is destroyed.");}
    }
    

        

Servlet 的配置方式:

注意,在配置urlPattern时,要确保路径的唯一性,避免出现冲突。如果多个 Servlet 的urlPattern匹配到同一个请求,可能会导致不确定的行为。

  1. 在 Servlet 中,urlPattern用于配置 Servlet 的访问路径,它可以通过注解或web.xml文件进行配置。

    注解方式(Servlet 3.0 及以上版本支持)

    在 Servlet 类上使用@WebServlet注解来指定urlPattern。例如:

    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;@WebServlet("/hello")
    public class HelloServlet extends HttpServlet {// Servlet的具体实现
    }
    
     

    上述代码中,@WebServlet("/hello")表示该 Servlet 的访问路径为/hello

    还可以指定多个urlPattern,例如:

    @WebServlet({"/hello", "/hi"})
    public class HelloServlet extends HttpServlet {// Servlet的具体实现
    }
    
     

    这样,该 Servlet 可以通过/hello/hi两个路径进行访问。

    web.xml 方式(传统方式)

     

    web.xml文件中使用<servlet><servlet-mapping>标签来配置urlPattern。例如:

    <web-app><servlet><servlet-name>HelloServlet</servlet-name><servlet-class>com.example.HelloServlet</servlet-class></servlet><servlet-mapping><servlet-name>HelloServlet</servlet-name><url-pattern>/hello</url-pattern></servlet-mapping>
    </web-app>
    
     

    这里通过<servlet-name>标签关联<servlet><servlet-mapping>,并在<url-pattern>中指定访问路径。同样,可以为一个 Servlet 配置多个<url-pattern>

    urlPattern的匹配规则

  2. 精确匹配:如/hello,只有访问路径完全为/hello时才会匹配到对应的 Servlet。
  3. 目录匹配:以/开头并以/*结尾,例如/user/*,表示匹配/user路径下的所有请求。如/user/list/user/add等都会被该 Servlet 处理。
  4. 扩展名匹配:以*开头并以扩展名结尾,例如*.do,表示匹配所有以.do为扩展名的请求,如login.doregister.do等。
  5. 默认匹配/,用于处理其他未被精确匹配或目录匹配的请求,通常作为默认 Servlet 的配置。

Servlet体系结构

Servlet 容器

  • 概念:也称为 Servlet 引擎,是运行 Servlet 的环境,负责加载、实例化、初始化、调用和销毁 Servlet。常见的 Servlet 容器有 Apache Tomcat、Jetty、JBoss 等。
  • 功能:管理 Servlet 的生命周期,接收和处理客户端的请求,并将请求转发给相应的 Servlet 进行处理。它还提供了一些底层的服务,如网络通信、线程管理、安全管理等。

Servlet 接口

  • 概念:所有 Servlet 都必须实现的接口,定义了 Servlet 的基本行为和生命周期方法。
  • 方法
    • init:在 Servlet 被创建后初始化时调用,用于执行一次性的初始化操作。
    • service:处理客户端请求的主要方法,根据请求的 HTTP 方法(GET、POST 等)来调用相应的处理方法(如 doGet、doPost 等)。
    • destroy:在 Servlet 被销毁前调用,用于释放资源。
    • getServletConfig:返回 Servlet 的配置信息。
    • getServletContext:返回 Servlet 上下文对象,用于获取服务器的相关信息和共享资源。

GenericServlet 类

  • 概念:是一个抽象类,实现了 Servlet 接口,提供了与协议无关的 Servlet 的通用框架。
  • 特点:定义了一些通用的方法和属性,使得开发人员可以更方便地创建 Servlet,而不必关注底层的协议细节。它将 Servlet 的初始化、服务和销毁等操作进行了抽象,开发人员只需要关注具体的业务逻辑实现。

HttpServlet 类

生命周期

下面是一个简单的HttpServlet示例,用于处理用户的登录请求:

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 LoginServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 获取用户名和密码String username = request.getParameter("username");String password = request.getParameter("password");// 这里可以进行数据库验证等操作,假设用户名和密码都是admin时登录成功if ("admin".equals(username) && "admin".equals(password)) {response.setContentType("text/html");PrintWriter out = response.getWriter();out.println("<html><body>");out.println("<h1>登录成功</h1>");out.println("</body></html>");} else {response.sendRedirect("login.html");}}
}
  • HttpServlet类是 Java Servlet API 中的一个重要类,它是GenericServlet类的子类,专门用于处理 HTTP 请求。以下是对HttpServlet类的详细介绍:

    主要方法
  • doGet方法:用于处理 HTTP GET 请求。当客户端通过 GET 方法请求资源时,服务器会调用这个方法。在这个方法中,通常会从请求中获取参数,然后根据这些参数执行相应的操作,并将结果以 HTML 或其他格式返回给客户端。
  • doPost方法:用于处理 HTTP POST 请求。当客户端通过 POST 方法提交数据时,服务器会调用这个方法。与 GET 请求不同,POST 请求的数据通常包含在请求体中,而不是 URL 中。在这个方法中,可以从请求体中获取提交的数据,并进行处理,如将数据插入到数据库中。
  • doPut方法:用于处理 HTTP PUT 请求。PUT 请求通常用于更新服务器上的资源。在这个方法中,可以根据请求中的数据更新服务器上的相应资源。
  • doDelete方法:用于处理 HTTP DELETE 请求。DELETE 请求用于删除服务器上的资源。在这个方法中,可以根据请求中的信息删除服务器上的相应资源。
  • 初始化阶段:当 Servlet 容器启动或者第一次请求该 Servlet 时,会创建HttpServlet的实例,并调用init方法进行初始化。在这个阶段,可以进行一些资源的加载、配置的读取等操作。
  • 服务阶段:在初始化完成后,HttpServlet就可以处理客户端的请求了。当有 HTTP 请求到达时,Servlet 容器会根据请求的方法(GET、POST 等)来调用相应的doXXX方法进行处理。
  • 销毁阶段:当 Servlet 容器关闭或者该 Servlet 长时间未被使用时,容器会调用destroy方法来销毁HttpServlet实例。在这个阶段,可以进行一些资源的释放、清理工作。

ServletContext 接口

  • 概念:代表 Servlet 上下文,是一个全局的共享对象,用于在整个 Web 应用程序中共享信息和资源。
  • 功能:可以获取 Web 应用程序的初始化参数、服务器的相关信息、资源文件的路径等。它还可以用于注册监听器和过滤器等。

ServletConfig 接口

  • 概念:用于获取 Servlet 的配置信息,每个 Servlet 都有一个对应的 ServletConfig 对象。
  • 功能:可以获取在 web.xml 文件中为 Servlet 配置的初始化参数等信息。

过滤器(Filter)

  • 概念:是一种特殊的 Servlet 组件,它可以在请求到达 Servlet 之前或响应返回客户端之前对请求和响应进行拦截和处理。
  • 功能:用于实现一些通用的功能,如字符编码过滤、权限验证、日志记录等。可以在不修改 Servlet 代码的情况下,对 Web 应用程序的请求和响应进行统一的处理和增强。

监听器(Listener)

  • 概念:用于监听 Servlet 上下文、会话和请求等对象的创建、销毁和属性变化等事件。
  • 功能:可以在事件发生时执行相应的操作,如在 Servlet 上下文启动时加载资源、在会话创建时记录日志等。通过监听器可以实现对 Web 应用程序的生命周期和状态变化的监控和管理。

Servlet的优点

  • 跨平台性:由于 Java 的跨平台特性,Servlet 可以在不同的操作系统和 Web 服务器上运行,具有很强的可移植性。
  • 安全性高:Java 语言本身具有较强的安全性,Servlet 运行在 Servlet 容器中,受到容器的安全管理,可以有效防止各种安全漏洞。
  • 可扩展性强:Servlet 可以方便地与其他 Java 技术(如 JavaBean、EJB 等)集成,也可以与数据库、消息队列等后端服务进行交互,能够满足各种复杂的业务需求。
  • 性能高效:Servlet 容器对 Servlet 的处理进行了优化,能够高效地处理大量并发请求,提供较好的性能。

Servlet的应用场景

  • 动态 Web 页面生成:可以根据用户的请求动态生成 HTML 页面,实现个性化的内容展示。
  • 表单处理:接收和处理用户在 Web 表单中提交的数据,进行验证、存储和后续处理。
  • HTTP 请求处理:处理各种 HTTP 请求,如文件下载、数据上传、RESTful API 接口实现等。
  • 会话管理:通过 Servlet 可以管理用户的会话,跟踪用户的登录状态、购物车信息等。

    Servlet 是 Java Web 开发中的重要组成部分,它为开发动态的、交互式的 Web 应用程序提供了强大的基础,通过处理请求和响应,可以实现各种功能,并且可以和其他 Java EE 技术(如 JSP、EJB 等)结合使用,以构建完整的企业级应用程序。

    相关文章:

    Java Web-Tomcat Servlet

    Web服务器-Tomcat Web服务器简介 Web 服务器是一种软件程序&#xff0c;它主要用于在网络上接收和处理客户端&#xff08;如浏览器&#xff09;发送的 HTTP 请求&#xff0c;并返回相应的网页内容或数据。以下是关于 Web 服务器的详细介绍&#xff1a; 功能 接收请求&#…...

    老牌工具被破!

    屏幕录制技术因其高效的信息传递能力在多个行业中得到了广泛应用&#xff0c;在教育领域&#xff0c;教师利用屏幕录制制作在线课程。在企业培训中&#xff0c;它为新员工提供了灵活的学习方式。在直播、游戏时&#xff0c;录制分享精彩内容。在客户支持中&#xff0c;客服人员…...

    在计算机上本地运行 Deepseek R1

    Download Ollama on Linux Download Ollama on Windows Download Ollama on macOS Deepseek R1 是一个强大的人工智能模型&#xff0c;在科技界掀起了波澜。它是一个开源语言模型&#xff0c;可以与 GPT-4 等大玩家展开竞争。但更重要的是&#xff0c;与其他一些模型不同&…...

    MongoDB中常用的几种高可用技术方案及优缺点

    MongoDB 的高可用性方案主要依赖于其内置的 副本集 (Replica Set) 和 Sharding 机制。下面是一些常见的高可用性技术方案&#xff1a; 1. 副本集 (Replica Set) 副本集是 MongoDB 提供的主要高可用性解决方案&#xff0c;确保数据在多个节点之间的冗余存储和自动故障恢复。副…...

    【GoLang】利用validator包实现服务端参数校验时自定义错误信息

    在C/S架构下&#xff0c;服务端在校验请求参数时&#xff0c;若出现参数错误&#xff0c;要响应给客户端一个错误消息&#xff0c;通常我们会统一响应“参数错误”。 但是&#xff0c;如果只是一味的提示参数错误&#xff0c;我并不知道具体是哪个参数错了呀&#xff01;能不能…...

    异或哈希总结

    例题 例题1https://codeforces.com/problemset/problem/1175/Fhttps://codeforces.com/problemset/problem/1175/F 例题2https://codeforces.com/contest/2014/problem/Hhttps://codeforces.com/contest/2014/problem/H例题4https://codeforces.com/contest/1418/problem/Ght…...

    【Rust自学】15.7. 循环引用导致内存泄漏

    说句题外话&#xff0c;这篇文章真心很难&#xff0c;有看不懂可以在评论区问&#xff0c;我会尽快作答的。 喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω…...

    C#AWS signatureV4对接Amazon接口

    马上要放假了&#xff0c;需要抓紧时间测试对接一个三方接口&#xff0c;对方是使用Amazon服务的&#xff0c;国内不多见&#xff0c;能查的资(代)料(码)&#xff0c;时间紧比较紧&#xff0c;也没有时间去啃Amazon的文档&#xff0c;主要我的英文水平也不行&#xff0c;于是粗…...

    C语言操作符(下)

    上一篇文章传送门&#xff1a;操作符上 前言&#xff1a;上期我们介绍了C语言的操作符的使用方法&#xff0c;这期我们主要侧重讲当我们已经了解了操作符的基本知识后怎样样来看待运算路径的问题。 操作符 一&#xff0c;优先级和结合性1&#xff0c;优先级2&#xff0c;结合性…...

    学习资料收藏 游戏开发

    本文整理了本人在学习 Unity3D 游戏开发过程中知晓的一些学习资料。 视频教程 siki学院 M_Studio Unity中文课堂 博客 林新发 浅墨_毛星云 冯乐乐 Roystan Sorumi 宣雨松 陆泽西 书籍 《Unity 游戏设计与实现》&#xff08;加藤政树&#xff09; 《Unity Shader 入…...

    我的2024年总结

    趁着摸鱼赶紧写一下吧 去年目标review 还是将去年的目标完成了一些 【接纳不完美&#xff0c;多拍照片】 这个还是部分做到了&#xff0c;今年和一些朋友们见面时都注意拍照留记录了&#xff0c;不过还可以继续加强&#xff0c;因为外貌上发生了重大变化&#xff0c;下面细说…...

    freeswitch在centos上编译过程

    操作系统&#xff1a;centos9-last usr/local/freeswitch/bin/freeswitch -version FreeSWITCH version: 1.10.13-devgit~20250125T131725Z~3f1e4bf90a~64bit (git 3f1e4bf 2025-01-25 13:17:25Z 64bit)vi /etc/ssh/sshd_config ip a nmtui reboot ip a curl -o /etc/pki/rpm-…...

    docker如何查看容器启动命令(已运行的容器)

    docker ps 查看正在运行的容器 该命令主要是为了详细展示查看运行时的command参数 # 通过docker --no-trunc参数来详细展示容器运行命令 docker ps -a --no-trunc | grep <container_name>通过docker inspect命令 使用docker inspect&#xff0c;但是docker inspect打…...

    正则表达式以及Qt中的使用

    目录 一、正则表达式 1、基本匹配&#xff1a; 2、元字符&#xff1a; 2.1 .运算符&#xff1a; 2.2 字符集&#xff1a; 2.3 重复次数&#xff1a; 2.4 量词{} 2.5 特征标群() 2.6 或运算符 2.7 \反斜线转码特殊字符 2.8 锚点 3、简写字符 4、零宽度断言 4.1 正…...

    当高兴、尊重和优雅三位一体是什么情况吗?

    英语单词 disgrace 表示“失脸&#xff0c;耻辱&#xff0c;不光彩&#xff0c;名誉扫地”一类的含义&#xff0c;可做名词或动词使用&#xff0c;含义基本一致&#xff0c;只是词性不同。 disgrace n.丢脸&#xff1b;耻辱&#xff1b;不光彩&#xff1b;令人感到羞耻的人(或…...

    Vue 3 中的 TypeScript:接口、自定义类型与泛型

    在 Vue 3 中&#xff0c;TypeScript 提供了强大的类型系统&#xff0c;帮助我们更好地管理代码的类型安全。通过使用 接口&#xff08;Interface&#xff09;、自定义类型&#xff08;Type Aliases&#xff09; 和 泛型&#xff08;Generics&#xff09;&#xff0c;我们可以编…...

    【Super Tilemap Editor使用详解】(十六):高级主题:深入理解 Super Tilemap Editor

    在本节中,我们将深入探讨 Super Tilemap Editor 的工作原理,特别是图块地图(Tilemap)的渲染机制以及如何优化性能。这些知识将帮助你更好地理解工具的内部机制,并在开发中做出更明智的决策。 一、图块地图与图块渲染 图块地图是 Super Tilemap Editor 的核心组件之一。它由…...

    如何运用python爬虫爬取知网相关内容信息?

    爬取知网内容的详细过程 爬取知网内容需要考虑多个因素&#xff0c;包括网站的结构、反爬虫机制等。以下是一个详细的步骤和代码实现&#xff0c;帮助你使用Python爬取知网上的论文信息。 1. 数据准备 首先&#xff0c;需要准备一些基础数据&#xff0c;如知网的URL、请求头…...

    2025年数学建模美赛 A题分析(2)楼梯使用频率数学模型

    2025年数学建模美赛 A题分析&#xff08;1&#xff09;Testing Time: The Constant Wear On Stairs 2025年数学建模美赛 A题分析&#xff08;2&#xff09;楼梯磨损分析模型 2025年数学建模美赛 A题分析&#xff08;3&#xff09;楼梯使用方向偏好模型 2025年数学建模美赛 A题分…...

    云原生:构建现代化应用的基石

    一、什么是云原生&#xff1f; 云原生是一种构建和运行应用程序的方法&#xff0c;旨在充分利用云计算的分布式系统优势&#xff0c;例如弹性伸缩、微服务架构、容器化技术等。云原生应用程序从设计之初就考虑到了云环境的特点&#xff0c;能够更好地适应云平台的动态变化&…...

    SpringBoot-17-MyBatis动态SQL标签之常用标签

    文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

    测试微信模版消息推送

    进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

    Appium+python自动化(十六)- ADB命令

    简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

    uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

    在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

    dedecms 织梦自定义表单留言增加ajax验证码功能

    增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

    376. Wiggle Subsequence

    376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

    linux arm系统烧录

    1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

    Java入门学习详细版(一)

    大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

    【笔记】WSL 中 Rust 安装与测试完整记录

    #工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

    C#学习第29天:表达式树(Expression Trees)

    目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...