当前位置: 首页 > 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; 功能 接收请求&#…...

    渗透测试-WAF是什么以及原理解释 waf功能详解

    目录 waf功能介绍 waf出现的地点: 什么是waf 功能: 常见的系统攻击分为两类 一是利用Web服务器的漏洞进行攻击 二是利用网页自身的安全漏洞进行攻击 WAF主要功能&#xff1a; waf的特点1 waf主要功能2 网马木马主动防御及查杀 流量监控 网站漏洞防御功能 危险组件…...

    Vue3 provide/inject用法总结

    1. 基本概念 provide/inject 是 Vue3 中实现跨层级组件通信的方案&#xff0c;类似于 React 的 Context。它允许父组件向其所有子孙组件注入依赖&#xff0c;无论层级有多深。 1.1 基本语法 // 提供方&#xff08;父组件&#xff09; const value ref(hello) provide(key, …...

    C# 提取PDF表单数据

    目录 使用工具 C# 提取多个PDF表单域的数据 C# 提取特定PDF表单域的数据 PDF表单是一种常见的数据收集工具&#xff0c;广泛应用于调查问卷、业务合同等场景。凭借出色的跨平台兼容性和标准化特点&#xff0c;PDF表单在各行各业中得到了广泛应用。然而&#xff0c;当需要整合…...

    【JAVA项目】基于ssm的【宠物医院信息管理系统】

    【JAVA项目】基于ssm的【宠物医院信息管理系统】 技术简介&#xff1a;采用JSP技术、ssm框架、B/S架构、MySQL技术等实现。 系统简介&#xff1a;宠物医院信息管理系统&#xff0c;在系统首页可以查看首页、医学知识、医生信息、药品信息、新闻资讯、留言反馈、我的、跳转到后台…...

    书生大模型实战营2

    L0——入门岛 Python基础 Conda虚拟环境 虚拟环境是Python开发中不可或缺的一部分&#xff0c;它允许你在不同的项目中使用不同版本的库&#xff0c;避免依赖冲突。Conda是一个强大的包管理器和环境管理器。 创建新环境 首先&#xff0c;确保你已经安装了Anaconda或Minico…...

    产业园管理系统提升企业综合管理效率与智能化水平的成功案例分析

    内容概要 在当前科技迅猛发展的时代&#xff0c;越来越多的企业意识到数字化转型的重要性。为了提升管理效率和智能化水平&#xff0c;产业园管理系统应运而生&#xff0c;成为众多园区和商办写字楼不可或缺的一部分。无论是工业园、物流园还是公寓&#xff0c;这些系统都能为…...

    《AI赋能光追:开启图形渲染新时代》

    光线追踪技术是图形渲染领域的重大突破&#xff0c;能够通过模拟光的传播路径&#xff0c;精准渲染反射、折射、阴影和间接光照等效果&#xff0c;实现高度逼真的场景呈现。而人工智能的加入&#xff0c;更是为光线追踪技术带来了前所未有的变革&#xff0c;主要体现在以下几个…...

    危机13小时:追踪一场GitHub投毒事件

    事件概要 自北京时间 2024.12.4 晚间6点起&#xff0c; GitHub 上不断出现“幽灵仓库”&#xff0c;仓库中没有任何代码&#xff0c;只有诱导性的病毒文件。当天&#xff0c;他们成为了 GitHub 上 star 增速最快的仓库。超过 180 个虚假僵尸账户正在传播病毒&#xff0c;等待不…...

    利用JSON数据类型优化关系型数据库设计

    利用JSON数据类型优化关系型数据库设计 前言 在关系型数据库中&#xff0c;传统的结构化存储方式要求预先定义好所有的列及其数据类型。 然而&#xff0c;随着业务的发展&#xff0c;这种设计可能会显得不够灵活&#xff0c;尤其是在需要扩展单个列的描述功能时。 JSON数据…...

    如何学习Java后端开发

    文章目录 一、Java 语言基础二、数据库与持久层三、Web 开发基础四、主流框架与生态五、分布式与高并发六、运维与部署七、项目实战八、持续学习与提升总结路线图 学习 Java 后端开发需要系统性地掌握多个技术领域&#xff0c;从基础到进阶逐步深入。以下是一个详细的学习路线和…...

    AI刷题-蛋糕工厂产能规划、优质章节的连续选择

    挑两个简单的写写 目录 一、蛋糕工厂产能规划 问题描述 输入格式 输出格式 解题思路&#xff1a; 问题理解 数据结构选择 算法步骤 关键点 最终代码&#xff1a; 运行结果&#xff1a;​编辑 二、优质章节的连续选择 问题描述 输入格式 输出格式 解题思路&a…...

    SpringBoot统一数据返回格式 统一异常处理

    统一数据返回格式 & 统一异常处理 1. 统一数据返回格式1.1 快速入门1.2 存在问题1.3 案列代码修改1.4 优点 2. 统一异常处理 1. 统一数据返回格式 强制登录案例中,我们共做了两部分⼯作 通过Session来判断⽤⼾是否登录对后端返回数据进⾏封装,告知前端处理的结果 回顾 后…...

    [MySQL]事务的理论、属性与常见操作

    目录 一、事物的理论 1.什么是事务 2.事务的属性&#xff08;ACID&#xff09; 3.再谈事务的本质 4.为什么要有事务 二、事务的操作 1.事务的支持版本 2.事务的提交模式 介绍 自动提交模式 手动提交模式 3.事务的操作 4.事务的操作演示 验证事务的回滚 事务异常…...

    JWT实现单点登录

    文章目录 JWT实现单点登录JWT 简介存在问题及解决方案登录流程后端程序实现前端保存Tokenstore存放信息的缺点及解决 校验流程&#xff1a;为gateway增加登录校验拦截器 另一种单点登录方法&#xff1a;Token&#xff0b;Redis实现单点登录 JWT实现单点登录 登录流程&#xff…...

    docker 学习笔记

    一、docker容器快速上手以及简单操作 docker的image和container image镜像 docker image就是一个read.only文件&#xff0c;可以理解成一个模版&#xff0c;docker image具有分层的概念 可以自己制作&#xff0c;也可以从registry拉去 container容器 一个运行中的docker …...

    Lesson 119 A true story

    Lesson 119 A true story 词汇 story n. 故事&#xff0c;传记&#xff0c;小说&#xff0c;楼层storey 搭配&#xff1a;tell a story 讲故事&#xff0c;说谎    true story 真实的故事    the second floor 二楼 例句&#xff1a;我猜他正在说谎。    I guess he…...

    c语言版贪吃蛇(Pro Max版)附源代码

    1 背景 贪吃蛇是一款经典的电子游戏&#xff0c;最早出现在20世纪70年代的街机游戏中。游戏的核心玩法是玩家控制一条蛇在有限的空间内移动&#xff0c;通过吃食物来增长身体长度&#xff0c;同时避免撞到墙壁、障碍物或自身。随着蛇的长度增加&#xff0c;游戏难度逐渐提升。 …...

    蓝桥村打花结的花纸选择问题

    在这篇文章中&#xff0c;我们将探讨一个有趣的算法问题&#xff0c;这个问题涉及到中国传统手工艺——打花结。我们需要判断给定的矩形花纸是否可以通过折叠操作使其面积变为特定的值 X&#xff0c;从而适合用来打花结。 问题描述 解题思路 这个问题可以通过循环方法来解决。…...

    SSM开发(三) spring与mybatis整合(含完整运行demo源码)

    目录 本文主要内容 一、Spring整合MyBatis的三个关键点 二、整合步骤 1、创建一个Maven项目 2、在pom.xml文件中添加jar包的依赖 3、配置MyBatis 注解实现方式 XML配置文件实现 4、配置Spring 5、测试运行 本文主要内容 1. Spring + Mybatis整合; 2. MyBatis两种SQL…...

    【Matlab高端绘图SCI绘图模板】第006期 对比绘柱状图 (只需替换数据)

    1. 简介 柱状图作为科研论文中常用的实验结果对比图&#xff0c;本文采用了3组实验对比的效果展示图&#xff0c;代码已调试好&#xff0c;只需替换数据即可生成相关柱状图&#xff0c;为科研加分。通过获得Nature配色的柱状图&#xff0c;让你的论文看起来档次更高&#xff0…...

    Elasticsearch中的度量聚合:深度解析与实战应用

    在大数据和实时分析日益重要的今天&#xff0c;Elasticsearch以其强大的搜索和聚合能力&#xff0c;成为了众多企业和开发者进行数据分析和处理的首选工具。本文将深入探讨Elasticsearch中的度量聚合&#xff08;Metric Aggregations&#xff09;&#xff0c;展示其如何在数据分…...

    重回C语言之老兵重装上阵(十六)C语言可变参数

    C语言可变参数 在C语言中&#xff0c;标准库提供了一些函数允许接收可变数量的参数。最典型的例子就是 printf 和 scanf&#xff0c;它们能够处理不确定数量的参数。为了实现这一功能&#xff0c;C语言提供了可变参数函数的概念。 1. 可变参数函数的概念 可变参数函数是指函数…...

    第4章 神经网络【1】——损失函数

    4.1.从数据中学习 实际的神经网络中&#xff0c;参数的数量成千上万&#xff0c;因此&#xff0c;需要由数据自动决定权重参数的值。 4.1.1.数据驱动 数据是机器学习的核心。 我们的目标是要提取出特征量&#xff0c;特征量指的是从输入数据/图像中提取出的本质的数 …...

    动态规划——斜率优化DP

    题目清单 acwing300.任务安排1 状态表示f[i]: 集合&#xff1a;完成前i个任务且第i个任务为最后一个批次最后一个任务的方案。 属性&#xff1a;min 状态计算&#xff1a; f [ i ] m i n { f [ j ] s u m t [ i ] ∑ j 1 i w [ u ] s ∑ j 1 n w [ i ] } f[i]min\{f[j…...

    函数栈帧的创建和销毁

    1、总述&#xff1a; 大家在前期学习函数的时候&#xff0c;肯定会有诸多疑惑&#xff1a; 1、局部变量怎么创建的&#xff1f; 2、为什么有时候局部变量是随机值&#xff1f; 3、函数是怎么传参的&#xff1f;传参的顺序如何&#xff1f; 4、形参和实参是什么样的关系&am…...

    【MQ】探索 Kafka

    高性能 消息的顺序性、顺序写磁盘 零拷贝 RocketMQ内部主要是使用基于mmap实现的零拷贝&#xff0c;用来读写文件 减少cpu的拷贝次数和上下文切换次数&#xff0c;实现文件的高效读写操作 Kafka 零拷贝 Kafka 使用到了 mmap 和 sendfile 的方式来实现零拷贝。分别对应 Jav…...

    c++ set/multiset 容器

    1. set 基本概念 简介&#xff1a; 所有元素都会在插入时自动排序本质&#xff1a; set/multiset属于关联式容器&#xff0c;底层结构是用二叉树实现。set 和 multiset 区别&#xff1a; set容器不允许有重复的元素。 multiset允许有重复的元素。2. set 构造和赋值 构造&a…...

    react-bn-面试

    1.主要内容 工作台待办 实现思路&#xff1a; 1&#xff0c;待办list由后端返回&#xff0c;固定需要的字段有id(查详细)、type(本条待办的类型)&#xff0c;还可能需要时间&#xff0c;状态等 2&#xff0c;一个集中处理待办中转路由页&#xff0c;所有待办都跳转到这个页面…...

    【C++数论】880. 索引处的解码字符串|2010

    本文涉及知识点 数论&#xff1a;质数、最大公约数、菲蜀定理 LeetCode880. 索引处的解码字符串 给定一个编码字符串 s 。请你找出 解码字符串 并将其写入磁带。解码时&#xff0c;从编码字符串中 每次读取一个字符 &#xff0c;并采取以下步骤&#xff1a; 如果所读的字符是…...

    shiro学习五:使用springboot整合shiro。在前面学习四的基础上,增加shiro的缓存机制,源码讲解:认证缓存、授权缓存。

    文章目录 前言1. 直接上代码最后在讲解1.1 新增的pom依赖1.2 RedisCache.java1.3 RedisCacheManager.java1.4 jwt的三个类1.5 ShiroConfig.java新增Bean 2. 源码讲解。2.1 shiro 缓存的代码流程。2.2 缓存流程2.2.1 认证和授权简述2.2.2 AuthenticatingRealm.getAuthentication…...

    Python案例--养兔子

    兔子繁殖问题是一个经典的数学问题&#xff0c;最早由意大利数学家斐波那契在13世纪提出。这个问题不仅在数学领域具有重要意义&#xff0c;还广泛应用于计算机科学、生物学和经济学等领域。本文将通过一个具体的Python程序&#xff0c;深入探讨兔子繁殖问题的建模和实现&#…...

    【搜索回溯算法】:BFS的魔力--如何使用广度优先搜索找到最短路径

    ✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;搜索回溯算法篇–CSDN博客 文章目录 一.广度优先搜索&#xff08;BFS&#xff09;解决最短路…...

    JavaSE第十一天——集合框架Collection

    一、List接口 List接口是一个有序的集合&#xff0c;允许元素有重复&#xff0c;它继承了Collection接口&#xff0c;提供了许多额外的功能&#xff0c;比如基于索引的插入、删除和访问元素等。 常见的List接口的实现类有ArrayList、LinkedList和Vector。 List接口的实现类 …...

    Three城市引擎地图插件Geo-3d

    一、简介 基于Three开发&#xff0c;为Three 3D场景提供GIS能力和城市底座渲染能力。支持Web墨卡托、WGS84、GCJ02等坐标系&#xff0c;支持坐标转换&#xff0c;支持影像、地形、geojson建筑、道路&#xff0c;植被等渲染。支持自定义主题。 二、效果 三、代码 //插件初始化…...

    深度学习|表示学习|卷积神经网络|详细推导每一层的维度变化|14

    如是我闻&#xff1a; 一个经典的卷积神经网络&#xff08;CNN&#xff09;架构&#xff0c;呈现的是输入图像通过多个卷积层、池化层以及全连接层&#xff0c;最终输出分类结果的过程。整个过程的核心是理解输入特征图的尺寸如何在每一层发生变化&#xff0c;我们可以通过卷积…...

    多级缓存(亿级并发解决方案)

    多级缓存&#xff08;亿级流量&#xff08;并发&#xff09;的缓存方案&#xff09; 传统缓存的问题 传统缓存是请求到达tomcat后&#xff0c;先查询redis&#xff0c;如果未命中则查询数据库&#xff0c;问题如下&#xff1a; &#xff08;1&#xff09;请求要经过tomcat处…...

    BOM对象location与数组操作结合——查询串提取案例

    BOM对象location与数组操作结合——查询串提取案例 前置知识 1. Location 对象 Location 对象是 JavaScript 提供的内置对象之一&#xff0c;它表示当前窗口或框架的 URL&#xff0c;并允许你通过它操作或获取 URL 的信息。可以通过 window.location 访问。 主要属性&#…...

    读书笔记--分布式服务架构对比及优势

    本篇是在上一篇的基础上&#xff0c;主要对共享服务平台建设所依赖的分布式服务架构进行学习&#xff0c;主要记录和思考如下&#xff0c;供大家学习参考。随着企业各业务数字化转型工作的推进&#xff0c;之前在传统的单一系统&#xff08;或单体应用&#xff09;模式中&#…...

    GOGOGO 枚举

    含义&#xff1a;一种类似于类的一种结构 作用&#xff1a;是Java提供的一个数据类型&#xff0c;可以设置值是固定的 【当某一个数据类型受自身限制的时候&#xff0c;使用枚举】 语法格式&#xff1a; public enum 枚举名{…… }有哪些成员&#xff1f; A、对象 public …...

    【Linux】Linux基础开发工具

    1 Linux 软件包管理器 yum 1.1软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上,通过包管理器可以很方便的…...

    嵌入式C语言:结构体的多态性之结构体中的void*万能指针

    目录 一、void*指针在结构体中的应用 二、实现方式 2.1. 定义通用结构体 2.2. 定义具体结构体 2.3. 初始化和使用 三、应用场景 3.1. 内存管理函数 3.2. 泛型数据结构&#xff08;链表&#xff09; 3.3. 回调函数和函数指针 3.4. 跨语言调用或API接口&#xff08;模拟…...

    重构进行时:一秒告别 !=null 判空

    重构进行时&#xff1a;一秒告别 !null 判空 空指针异常&#xff08;NullPointerException&#xff09;是Java开发中常见的错误之一。 许多开发者在遇到空指针问题时&#xff0c;往往会习惯性地使用! null来进行判断。 然而&#xff0c;当代码中频繁出现这种判断时&#xff…...

    React 中hooks之useSyncExternalStore使用总结

    1. 基本概念 useSyncExternalStore 是 React 18 引入的一个 Hook&#xff0c;用于订阅外部数据源&#xff0c;确保在并发渲染下数据的一致性。它主要用于&#xff1a; 订阅浏览器 API&#xff08;如 window.width&#xff09;订阅第三方状态管理库订阅任何外部数据源 1.1 基…...

    Semaphore 与 线程池 Executor 有什么区别?

    前言&#xff1a;笔者在看Semaphone时 突然脑子宕机&#xff0c;啥啥分不清 Semaphore 和 Executor 的作用&#xff0c;故再次记录。 一、什么是Semaphore&#xff1f; Semaphore 是 Java 并发编程&#xff08;JUC&#xff09;中一个重要的同步工具&#xff0c;它的作用是 控…...

    Rust:高性能与安全并行的编程语言

    引言 在现代编程世界里&#xff0c;开发者面临的最大挑战之一就是如何平衡性能与安全性。在许多情况下&#xff0c;C/C这样的系统级编程语言虽然性能强大&#xff0c;但其内存管理的复杂性导致了各种安全漏洞。为了解决这些问题&#xff0c;Rust 作为一种新的系统级编程语言进入…...

    论文笔记(六十三)Understanding Diffusion Models: A Unified Perspective(六)(完结)

    Understanding Diffusion Models: A Unified Perspective&#xff08;六&#xff09;&#xff08;完结&#xff09; 文章概括指导&#xff08;Guidance&#xff09;分类器指导无分类器引导&#xff08;Classifier-Free Guidance&#xff09; 总结 文章概括 引用&#xff1a; …...

    Redis --- 分布式锁的使用

    我们在上篇博客高并发处理 --- 超卖问题一人一单解决方案讲述了两种锁解决业务的使用方法&#xff0c;但是这样不能让锁跨JVM也就是跨进程去使用&#xff0c;只能适用在单体项目中如下图&#xff1a; 为了解决这种场景&#xff0c;我们就需要用一个锁监视器对全部集群进行监视…...

    电脑怎么格式化?格式化详细步骤

    格式化是我们在日常使用电脑时可能会用到的一种操作&#xff0c;无论是清理磁盘空间、安装新系统&#xff0c;还是解决磁盘读写错误&#xff0c;都可能需要格式化。不过&#xff0c;对于一些不熟悉电脑操作的用户来说&#xff0c;格式化听起来可能有些复杂。其实&#xff0c;只…...

    TikTok广告投放优化策略:提升ROI的核心技巧

    在短许多品牌和商家纷纷投入广告营销&#xff0c;争夺这片潜力巨大的市场。然而&#xff0c;在激烈的竞争环境中&#xff0c;如何精准有效地投放广告&#xff0c;优化广告效果&#xff0c;实现更高的投资回报率&#xff08;ROI&#xff09;成为了广告主关注的核心。 一. 精准受…...