小菜鸟

java菜鸟号正在起航

Servlet 监听器(Listener):Web 应用的事件响应机制

监听器(Listener)是 Servlet 规范中用于监听 Web 应用中关键对象(如 ServletContextHttpSessionServletRequest)的创建、销毁及属性变化的组件。它基于事件驱动模型,当特定事件触发时自动执行预设逻辑,常用于初始化资源、监控会话状态、记录请求日志等场景。本文将系统解析监听器的类型、使用方式及典型应用。

监听器的核心概念

什么是监听器?

监听器是实现了特定事件接口的 Java 类,通过监听 Web 应用中的域对象ServletContextHttpSessionServletRequest)或属性变化,在事件发生时执行回调方法。其核心作用是:

  • 感知对象生命周期(创建 / 销毁);
  • 监控对象属性变更(添加 / 移除 / 替换);
  • 实现跨组件通信或资源初始化。

事件与监听器的关系

  • 事件源:触发事件的对象(如 ServletContextHttpSession);
  • 事件对象:封装事件源及相关信息(如 ServletContextEventHttpSessionEvent);
  • 监听器:监听事件并处理(如 ServletContextListenerHttpSessionListener)。
阅读全文 »

Swagger 详解:前后端接口文档的自动化解决方案

在前后端分离的开发模式中,接口文档是连接前端与后端的关键桥梁。Swagger(现更名为 OpenAPI)作为一款强大的 API 文档生成工具,不仅能自动生成交互式接口文档,还支持在线接口调试,极大提升了开发效率。本文基于提供的配置示例,详细介绍 Swagger 的核心功能、配置方式及常用注解。

Swagger 核心价值与依赖引入

核心优势

  • 自动化文档生成:通过代码注解自动生成 API 文档,避免手动编写文档的繁琐与不一致;
  • 交互式调试:提供 Web 界面可直接调用接口,支持参数填写、响应查看,替代 Postman 等工具的部分功能;
  • 版本管理:随代码迭代自动更新文档,保持文档与代码的一致性;
  • 跨语言支持:支持多种编程语言(Java、Python 等),是前后端协作的通用标准。

依赖引入(Spring Boot 项目)

pom.xml中添加 Swagger2 的依赖(以 2.8.0 版本为例):

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.8.0</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.8.0</version>
</dependency>
  • springfox-swagger2:核心依赖,提供 Swagger 的注解解析与文档生成功能;
  • springfox-swagger-ui:提供 Web 界面,用于展示和调试接口(访问地址:http://项目地址:端口/swagger-ui.html)。

Swagger 核心配置

通过 Java 配置类开启 Swagger 并自定义文档信息,核心是创建Docket对象(Swagger 的主要配置入口)。

完整配置示例

阅读全文 »

消息队列的核心使用场景与权衡

消息队列(如 RabbitMQ、Kafka、RocketMQ)作为分布式系统的关键中间件,通过异步通信模式解决了服务解耦、流量削峰等核心问题。但同时也引入了系统复杂性和可用性风险,需根据业务场景合理使用。本文将详细解析消息队列的典型应用场景、优势及潜在挑战。

核心使用场景

应用解耦:降低系统依赖

问题:传统架构中,服务间通过直接调用耦合(如订单系统调用库存系统、支付系统),若某一服务故障(如库存系统宕机),会导致整个流程失败,且新增服务需修改调用方代码。

解决方案:引入消息队列作为中间层,服务间通过消息异步通信:

  • 生产者(如订单系统)完成自身业务后,将消息写入队列,无需关心消费者(库存、支付系统)是否可用。
  • 消费者从队列中获取消息并处理,新增服务只需订阅队列即可,无需修改生产者代码。

示例

  • 订单创建后,订单系统向 order.created 队列发送消息。
  • 库存系统、物流系统、通知系统分别订阅该队列,各自处理库存扣减、物流创建、短信通知等逻辑。

优势

  • 服务间无直接依赖,某一服务故障不影响其他服务。
  • 扩展性提升,新增业务只需新增消费者,无需修改核心流程。

异步处理:提升响应速度

问题:同步调用场景中,一个业务流程可能包含多个耗时操作(如订单创建后需发送短信、推送通知、更新统计),导致接口响应时间过长(如 1 秒 → 3 秒),影响用户体验。

阅读全文 »

使用 ojAlgo 求解线性规划(LP)问题

ojAlgo 是一个专注于数值计算和优化的 Java 开源库,提供了简洁直观的 API 来求解线性规划(LP)、整数规划(IP)等问题。相比其他工具,ojAlgo 的代码可读性强,配置灵活,特别适合在 Java 项目中集成。本文以具体示例介绍如何使用 ojAlgo 求解 LP 问题。

问题定义

我们需要求解以下整数线性规划问题(变量为整数):
目标函数minimize 5x₁ + 6x₂ + 23x₃ + 5x₄ + 24x₅ + 6x₆ + 23x₇ + 5x₈(最小化加权和)
约束条件

  1. 2x₁ + x₂ + x₃ + x₄ ≥ 100
  2. 2x₂ + x₃ + 3x₅ + 2x₆ + x₇ ≥ 150
  3. x₁ + x₃ + 3x₄ + 2x₆ + 3x₇ + 5x₈ ≥ 100
    变量约束:所有变量为非负整数(xᵢ ≥ 0且为整数)

环境配置

引入 ojAlgo 依赖

在 Maven 项目的pom.xml中添加依赖:

<dependency>
    <groupId>org.ojalgo</groupId>
    <artifactId>ojalgo</artifactId>
    <version>51.4.1</version>
</dependency>

代码实现与解析

核心步骤

阅读全文 »

Nginx 搭建文件服务器:快速实现文件共享与管理

Nginx 不仅是高性能的 Web 服务器和反向代理,还能通过简单配置搭建轻量级文件服务器,用于共享文档、图片、安装包等资源。本文详细讲解 Nginx 文件服务器的配置方法、功能优化及上传限制设置,帮助快速构建实用的文件共享服务。

基础配置:开启目录浏览

Nginx 默认不显示目录结构,需通过autoindex系列指令开启目录浏览功能,核心配置如下:

server {
    listen 9090;  # 监听端口(如9090)
    server_name _;  # 匹配任意域名(可改为具体域名如file.example.com)
    root /share/file;  # 文件存储的根目录(需提前创建)
    charset utf-8;  # 支持中文文件名显示

    # 开启目录浏览核心配置
    autoindex on;  # 启用目录列表显示(默认关闭)
    autoindex_exact_size on;  # 显示文件精确大小(单位为字节),off则显示KB/MB等
    autoindex_localtime on;  # 显示文件的本地修改时间(默认显示GMT时间)
}

配置说明

  1. root /share/file
    • 指定文件服务器的根目录,所有文件需存放在该目录下(如/share/file/docs//share/file/images/);
    • 需确保 Nginx 进程对该目录有读取权限(可执行chmod 755 /share/file)。
  2. 目录浏览优化
    • autoindex_localtime on:让文件修改时间显示为服务器本地时间(更直观);
    • charset utf-8:避免中文文件名乱码(关键配置)。

访问效果与目录结构

配置完成后,重启 Nginx(nginx -s reload),通过http://服务器IP:9090访问:

阅读全文 »
0%