jsp tomcat服务器启动或停止时自动执行代码

本文介绍如何利用Servlet监听器实现服务器启动时自动创建文件并写入指定内容,以及服务器关闭时自动删除该文件的方法。通过实现ServletContextListener接口并在web.xml中配置监听器完成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原理是使用servlet的监听器,建立一个servlet类并且实现ServletContextListener接口:

T1.java
package com.abc.test;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpServlet;

publicclass T1 extends HttpServlet implements ServletContextListener {
//服务器停止时执行该事件
publicvoid contextDestroyed(ServletContextEvent sce) {
DeleteFile();//删除启动服务器时建立的文件
}
//服务器启动时执行该事件
publicvoid contextInitialized(ServletContextEvent sce) {
WriteFile();//添加一个新的文本文件
}

publicvoid WriteFile() {
try {
FileWriter fw =new FileWriter("c:/WriteData.txt");
// 将字符串写入文件
fw.write("Hello World!");
fw.write("Hello Everyone!");
fw.close();
} catch (IOException e) {
}
}

publicvoid DeleteFile() {
File f =new File("c:/WriteData.txt");
// 检查文件是否存在,如果存在,直接删除文件
if (f.exists()) {
f.delete();
}
}

}

类写完后,需要在web.xml中添加一个listener,以便让该servlet类自动执行,在web.xml中添加如下内容:
<listener>
<listener-class>com.abc.test.T1</listener-class>
</listener>

listener-class里面的内容就是刚才添加的servlet类

现在就可以使用了,我使用的Tomcat5.5服务器,启动服务器,会发现C:盘根目录下建立了文件WriteData.txt,停止服务器,WriteData.txt又会被自动删除。

启动服务时可能需要读取配置信息,可以把配置信息添加到web.xml,比如

<context-param>
<param-name>YourName</param-name>
<param-value>YourValue</param-value>
</context-param>

在Servlet中可以这么读取:

this.getServletContext().getInitParameter("YourName");
<think>好的,我现在需要解决用户提到的Tomcat启动自动闪退的问题。用户之前提到在Ubuntu系统中遇到Tomcat非正常退出导致无法启动,端口被占用的情况,现在又遇到启动自动退出,退出代码为0且不报错的情况。我需要结合之前的引用内容来分析可能的原因和解决方案。首先,根据引用[2],Spring中使用内置Tomcat启动自动退出,退出代码0,日志显示正常启动后立即断开连接。这种情况可能与应用上下文加载完成后主线程结束有关,导致Tomcat随之关闭。解决方案可能是让主线程等待,比如在Spring Boot中添加线程阻塞使用合适的启动方式。其次,引用[3]提到Tomcat闪退的可能原因包括内存问题(如OOM)JVM崩溃,但用户提到hs_err_pid.log未生成,说明JVM可能正常,需要检查Tomcat日志。此外,引用[1]中的端口占用问题虽然用户已经处理过,但需要确认是否当前仍有端口冲突。接下来,我需要整理可能的原因:1.主线程提前结束(如SpringBoot应用未正确保持运行)。2.配置错误,如端口冲突SSL配置问题。 3.依赖缺失资源文件错误导致应用启动失败。4.内存不足JVM参数设置不当。5.日志文件残留导致启动异常。 解决方案方面:-检查应用的主类是否正确实现保持运行,比如在Spring Boot中使用SpringApplication.run()。-检查端口占用情况,使用netstatlsof确认8080其他配置端口是否空闲。-查看Tomcat的日志文件(如catalina.out)寻找错误信息。 -检查项目的依赖和配置文件,确保没有缺失错误。 -清理Tomcat的工作目录和临文件,避免旧文件干扰。 -调整JVM内存参数,防止内存溢出。 需要确保用户按照步骤逐一排查,从日志分析开始,确认是否有异常堆栈,再检查应用配置和代码是否正确。特别是对于Spring Boot内置Tomcat的情况,主线程结束可能导致容器退出,需要确保应用正确保持运行状态。</think>### Tomcat启动自动退出的原因及解决方案 #### 一、常见原因分析 1. **主线程提前结束** 在Spring Boot等嵌入式Tomcat应用中,若主线程未保持活动状态(如未调用`SpringApplication.run()`未添加阻塞逻辑),Tomcat会随主线程退出而终止。例如: ```java public static void main(String[] args) { SpringApplication.run(Application.class, args); // 正确方式 // 若此处无后续代码,主线程结束会导致Tomcat退出 } ``` 2. **端口冲突配置错误** - 检查端口占用: ```bash netstat -tuln | grep 8080 # 替换为实际端口号 ``` - 若存在冲突,修改`server.xml`中的`<Connector port="8080">`调整应用配置[^1][^2]。 3. **依赖缺失资源错误** - 检查`WEB-INF/lib`目录是否缺少JAR包。 - 确认`web.xml`Spring Boot的`application.properties`中资源配置正确。 4. **内存不足JVM崩溃** - 查看日志中是否有`OutOfMemoryError`,调整JVM参数: ```bash export JAVA_OPTS="-Xmx1024m -Xms512m" ``` 5. **残留文件干扰** 清理Tomcat的`work`、`temp`目录及`logs`中的旧日志: ```bash rm -rf $CATALINA_HOME/work/* $CATALINA_HOME/temp/* ``` --- #### 二、排查步骤与解决方案 1. **查看日志定位问题** - **Tomcat日志**:检查`logs/catalina.out``localhost.log`,搜索`SEVERE`/`ERROR`关键字。 - **应用日志**:Spring Boot项目查看`application.log`控制台输出。 2. **验证主线程逻辑(Spring Boot场景)** - 添加`Thread.sleep()`测试主线程是否提前结束: ```java public static void main(String[] args) throws InterruptedException { SpringApplication.run(Application.class, args); Thread.sleep(Long.MAX_VALUE); // 临测试用 } ``` 3. **检查依赖与配置** - Maven项目执行`mvn clean install`确保依赖完整。 - 确认`@SpringBootApplication`注解包含组件扫描路径。 4. **调整JVM参数** 在`catalina.sh`中添加内存限制: ```bash export CATALINA_OPTS="-Xmx1024m -XX:+HeapDumpOnOutOfMemoryError" ``` 5. **强制终止残留进程** ```bash lsof -i :8080 # 查找占用进程 kill -9 <PID> # 强制终止 ``` --- #### 三、典型场景示例 - **场景1**:Spring Boot应用启动后立即退出,日志显示`Process finished with exit code 0` **解决方案**:确认主类正确调用`SpringApplication.run()`,避免使用`SpringApplication.exit()`[^2]。 - **场景2**:端口被占用导致启动失败 **解决方案**:修改端口终止占用进程: ```bash sudo fuser -k 8080/tcp # 强制释放端口 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值