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

本文探讨了Servlet中使用@ServletWeb注解配置loadOnStartup属性的行为差异。当仅配置loadOnStartup值时,Servlet可能不会按预期工作;而添加urlPatterns或value属性后,Servlet能够正常初始化并执行定时任务。

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

[java]  view plain  copy
  1. package com.zhen.servlet;  
  2.   
  3. import java.awt.event.ActionEvent;  
  4. import java.awt.event.ActionListener;  
  5. import java.util.Date;  
  6.   
  7. import javax.servlet.Servlet;  
  8. import javax.servlet.ServletConfig;  
  9. import javax.servlet.ServletException;  
  10. import javax.servlet.annotation.WebServlet;  
  11. import javax.servlet.http.HttpServlet;  
  12. import javax.swing.Timer;  
  13.   
  14. /** 
  15.  * Servlet implementation class TimerServlet 
  16.  */  
  17. @WebServlet(loadOnStartup=1)  
  18. public class TimerServlet extends HttpServlet {  
  19.       
  20.     private static final long serialVersionUID = 1L;  
  21.   
  22.     /** 
  23.      * @see Servlet#init(ServletConfig) 
  24.      */  
  25.     public void init(ServletConfig config) throws ServletException {  
  26.         super.init(config);  
  27.         new Timer(1000,new ActionListener() {  
  28.               
  29.             @Override  
  30.             public void actionPerformed(ActionEvent e) {  
  31.                 System.out.println(new Date());  
  32.             }  
  33.         }).start();  
  34.     }  
  35. }  
这个Servlet将看不到结果,但是如果加上urlPatterns或者value的值,就能看到效果,目前原因不明

[java]  view plain  copy
  1. package com.zhen.servlet;  
  2.   
  3. import java.awt.event.ActionEvent;  
  4. import java.awt.event.ActionListener;  
  5. import java.util.Date;  
  6.   
  7. import javax.servlet.Servlet;  
  8. import javax.servlet.ServletConfig;  
  9. import javax.servlet.ServletException;  
  10. import javax.servlet.annotation.WebServlet;  
  11. import javax.servlet.http.HttpServlet;  
  12. import javax.swing.Timer;  
  13.   
  14. /** 
  15.  * Servlet implementation class TimerServlet 
  16.  */  
  17. @WebServlet(loadOnStartup=1,urlPatterns={"/timerServlet"})  
  18. public class TimerServlet extends HttpServlet {  
  19.       
  20.     private static final long serialVersionUID = 1L;  
  21.   
  22.     /** 
  23.      * @see Servlet#init(ServletConfig) 
  24.      */  
  25.     public void init(ServletConfig config) throws ServletException {  
  26.         super.init(config);  
  27.         new Timer(1000,new ActionListener() {  
  28.               
  29.             @Override  
  30.             public void actionPerformed(ActionEvent e) {  
  31.                 System.out.println(new Date());  
  32.             }  
  33.         }).start();  
  34.     }  
  35. }  
### 如何在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"); } } ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值