使用@WebServlet配置loadOnStartup的时候不起作用的解决方法

本文探讨了Servlet中loadOnStartup配置的作用及其与urlPatterns的关系。通过示例代码展示了仅配置loadOnStartup时Servlet行为的异常,并指出当同时配置urlPatterns时Servlet能够正常工作。

今天发现,如果配置loadOnStartup为启动时加载的Servlet,如果仅仅配置loadOnStartup的Annotation

package com.zhen.servlet;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.swing.Timer;

/**
 * Servlet implementation class TimerServlet
 */
@WebServlet(loadOnStartup=1)
public class TimerServlet extends HttpServlet {
	
	private static final long serialVersionUID = 1L;

	/**
	 * @see Servlet#init(ServletConfig)
	 */
	public void init(ServletConfig config) throws ServletException {
		super.init(config);
		new Timer(1000,new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println(new Date());
			}
		}).start();
	}
}
这个Servlet将看不到结果,但是如果加上urlPatterns或者value的值,就能看到效果,目前原因不明

package com.zhen.servlet;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.swing.Timer;

/**
 * Servlet implementation class TimerServlet
 */
@WebServlet(loadOnStartup=1,urlPatterns={"/timerServlet"})
public class TimerServlet extends HttpServlet {
	
	private static final long serialVersionUID = 1L;

	/**
	 * @see Servlet#init(ServletConfig)
	 */
	public void init(ServletConfig config) throws ServletException {
		super.init(config);
		new Timer(1000,new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println(new Date());
			}
		}).start();
	}
}



### 如何在Tomcat 8中查看@WebServlet注解的源码 要在Tomcat 8中查看@WebServlet注解的源码,需要明确@WebServlet并不是Tomcat提供的注解,而是Java EE(Jakarta EE)规范的一部分[^1]。因此,@WebServlet的源码位于`javax.servlet`包中,而不是Tomcat本身的代码库中。 以下是具体步骤和相关信息: 1. **确认依赖来源** 在Java项目中,如果使用了Servlet API,则通常会通过Maven或Gradle引入相关依赖。例如,在Maven中,Servlet API的依赖可能如下所示: ```xml <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> ``` 这里需要注意,`javax.servlet-api`是Servlet规范的实现,而Tomcat作为一个Servlet容器,实现了该规范[^2]。 2. **下载Servlet API源码** 要查看@WebServlet的源码,可以下载`javax.servlet-api`的源码jar文件。通常,Maven仓库中的依赖会附带源码。可以通过以下方式获取源码: - 在IDE中右键点击依赖项,选择“Download Sources”。 - 或者手动从[Maven Central Repository](https://search.maven.org/)下载对应版本的源码jar文件。 3. **直接查看源码内容** 下载源码后,可以找到`javax.servlet.annotation.WebServlet`类。其定义类似于以下内容: ```java package javax.servlet.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface WebServlet { String name() default ""; String[] value() default {}; String[] urlPatterns() default {}; String loadOnStartup() default ""; int asyncSupported() default -1; String smallIcon() default ""; String largeIcon() default ""; String description() default ""; String displayName() default ""; } ``` 以上内容展示了@WebServlet的核心定义,包括其作用范围、生命周期以及可配置的属性[^4]。 4. **Tomcat与@WebServlet的关系** Tomcat作为Servlet容器,负责解析和加载带有@WebServlet注解的类。具体实现位于Tomcat的内部模块中,例如`org.apache.catalina.startup.ContextConfig`类会扫描Web应用中的类,并根据@WebServlet注解的配置注册相应的Servlet实例[^3]。 5. **调试Tomcat加载过程** 如果希望深入了解Tomcat如何解析@WebServlet注解,可以通过以下方式: - 启用Tomcat的日志输出,观察启动过程中对Servlet的加载日志。 - 使用IDE调试模式运行Tomcat,设置断点在`ContextConfig`或其他相关类中,跟踪加载过程。 --- ### 示例代码:自定义类似@WebServlet的功能 以下是一个简单的示例,展示如何通过自定义注解模拟@WebServlet的功能: ```java package com.example.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface CustomServlet { String name() default ""; String[] urlPatterns(); } ``` 使用自定义注解的类: ```java package com.example.servlet; import com.example.annotation.CustomServlet; @CustomServlet(urlPatterns = {"/custom"}) public class CustomServletExample { public void service() { System.out.println("Custom Servlet Example"); } } ``` --- ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值