简单servlet第二篇--load-on-startup的用法

本文介绍了如何使用Servlet实现在Web应用启动时自动加载特定组件的方法。通过设置`load-on-startup`属性,可以确保某些Servlet在容器启动时按优先级顺序初始化。

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

最近写了一个公司网站,其中只有前端部分,还没有写java代码。在其中js部分有一些内容我觉的可以用配置项来代替,因为直接写到js代码里,有时候不太方便。

故想着使用java来实现一下,读取xml文件配置项的方式。

最简单的办法就是使用servlet, 即就是写一个servlet ,在容器已加载的时候就能读取到xml配置文件中的内容,然后我就写了一个非常非常简单的servlet, 


package com.xljy.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

public class InitServlet extends HttpServlet {

	@Override
	public void init() throws ServletException {
		System.out.println("进入InitServlet1");
	}
}

就这个servlet, ,然后再在web.xml 配置上servlet

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="qaservice" version="3.0">
	<display-name>edu_5ixl</display-name>
	
	<servlet>
	    <servlet-name>InitServlet</servlet-name>
	    <servlet-class>com.xljy.servlet.InitServlet</servlet-class>
	    <!-- 
<load-on-startup>1</load-on-startup>
--></servlet><servlet-mapping> <servlet-name>InitServlet</servlet-name> <url-pattern>/InitServlet</url-pattern></servlet-mapping><welcome-file-list> <welcome-file>index.jsp</welcome-file></welcome-file-list></web-app>


这里没有写
<load-on-startup>1</load-on-startup>
 没有写这句,如果不访问InitServlet 的话 InitServlet 就不会执行的 ,故得写上 
<load-on-startup>1</load-on-startup>
得写上这句, 挡在tomcat一启动的时候,就会执行 InitServlet 

我查了一下,web.xml中load-on-startup的作用

 

贴一段英文原汁原味的解释如下:
Servlet specification:
The load-on-startup element indicates that this servlet should be loaded (instantiated and have its init() called) on the startup of the web application. The optional contents of these element must be an integer indicating the order in which the servlet should be loaded. If the value is a negative integer, or the element is not present, the container is free to load the servlet whenever it chooses.   If the value is a positive integer or 0, the container must load and initialize the servlet as the application is deployed. The container must guarantee that servlets marked with lower integers are loaded before servlets marked with higher integers. The container may choose the order of loading of servlets with the same load-on-start-up value.

翻译过来的意思大致如下:
1)load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法)。

2)它的值必须是一个整数,表示servlet应该被载入的顺序

2)当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;

3)当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载。

4)正数的值越小,该servlet的优先级越高,应用启动时就越先加载。

5)当值相同时,容器就会自己选择顺序来加载。

所以,<load-on-startup>x</load-on-startup>,中x的取值1,2,3,4,5代表的是优先级,而非启动延迟时间。

这里感谢一下作者,我也是摘抄。


后来我又写了一个InitServlet2 ,如下:

package com.xljy.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

public class InitServlet2 extends HttpServlet {

	@Override
	public void init() throws ServletException {
		System.out.println("进入InitServlet2");
	}
}


web.xml 中 配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="qaservice" version="3.0">
	<display-name>edu_5ixl</display-name>
	
	<servlet>
	    <servlet-name>InitServlet</servlet-name>
	    <servlet-class>com.xljy.servlet.InitServlet</servlet-class>
	    <load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
	    <servlet-name>InitServlet</servlet-name>
	    <url-pattern>/InitServlet</url-pattern>
	</servlet-mapping>
	
	<servlet>
	    <servlet-name>InitServlet2</servlet-name>
	    <servlet-class>com.xljy.servlet.InitServlet2</servlet-class>
	    <load-on-startup>2</load-on-startup>
	</servlet>
	<servlet-mapping>
	    <servlet-name>InitServlet2</servlet-name>
	    <url-pattern>/InitServlet2</url-pattern>
	</servlet-mapping>
	
	<welcome-file-list>
	    <welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
</web-app>


其中Initservlet和InitServlet2 都设置了自启动,那么哪个先启动呢? load-on-startup 的值越小,优先级越高 ,所以是InitServlet先启动。 

这里仅此将此知识点记录一下。


不积跬步,无以至千里

不积小流,无以成江海




### Servlet[mvc-dispatcher] 的 Servlet.init() 异常原因分析 #### 原因一:依赖冲突 当 `com.fasterxml.jackson.core` 提供的 Jackson JAR 包与 Spring 框架版本不匹配时,可能会导致此类异常。Jackson 是用于 JSON 序列化和反序列化的库,如果其版本过低或过高,则可能无法满足当前 Spring 版本的要求[^2]。 #### 原因二:缺少必要的依赖项 某些情况下,项目中未正确引入所需的依赖项也可能引发此问题。例如,在使用 Bean Validation API 时,如果没有升级到兼容的版本(如 javax.validation-api),则可能导致初始化失败[^1]。 #### 原因三:类路径错误 如果配置文件中定义了一个不存在的类(如 ThymeleafViewResolver),或者由于 Maven 构建过程中出现问题而导致目标类缺失,也会抛出类似的异常。具体表现为 `ClassNotFoundException` 或者 `CannotLoadBeanClassException`[^3]。 #### 原因四:XML 配置不当 Tomcat 启动期间读取不到正确的 DispatcherServlet 初始化参数也是一个常见因素。这通常是因为 `<init-param>` 节点设置有误或者是未能指向实际存在的 XML 文件位置所致[^4]。 #### 原因五:第三方插件干扰 向 POM 中添加额外组件(像 spring-mobile-device)之后却忽略了它们所带来的潜在影响同样会触发上述状况。比如某个新加入的功能模块自带了一些旧版库作为传递性依赖从而破坏了整体环境平衡度[^5]。 --- ### 解决方案 #### 方法一:调整 Jackson 版本号 确保所使用的 jackson-databind 和其他相关子模块均处于最新稳定状态并与现有 Spring Framework 完美契合: ```xml <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.8</version><!-- 这里应选用适合您项目的适当版本 --> </dependency> ``` #### 方法二:更新验证API至合适标准 对于 Java EE 平台下的约束校验功能而言,请务必采用支持 JSR-380 的实现形式来替代原有的较早规格: ```xml <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.1.Final</version> </dependency> <!-- Hibernate Validator 实现 --> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.17.Final</version> </dependency> ``` #### 方法三:修正视图解析器声明 仔细核查 spring-mvc.xml 是否存在非法引用,并确认所有必需资源均已妥善部署于工程内部;必要时可替换为更通用的选择方式: ```java @Bean public InternalResourceViewResolver viewResolver(){ InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/views/"); resolver.setSuffix(".jsp"); return resolver; } ``` #### 方法四:完善 Web 描述符设定 通过明确定义 init 参数以辅助定位核心上下文描述文档的位置关系,进而规避加载过程中的不确定性风险: ```xml <servlet> <servlet-name>mvc-dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> ``` #### 方法五:排查新增依赖的影响 逐一审查最近增加的各项外部扩展是否存在隐含隐患,尤其是那些涉及跨平台协作性质的服务端增强工具集——譬如这里提到过的 mobile 设备适配套件: ```xml <dependency> <groupId>org.springframework.mobile</groupId> <artifactId>spring-mobile-device</artifactId> <exclusions> <!-- 排除不必要的附属品 --> <exclusion> <groupId>*</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> ``` --- ### 总结 综合以上各条目可以看出,“Servlet.init() for servlet mvc-dispatcher threw exception”的根本诱因往往集中在以下几个方面:JAR 包之间的相互作用失衡、基础架构层面的关键要素遗漏以及高级特性集成阶段产生的连锁反应等方面。针对不同场景采取相应的补救措施能够有效缓解乃至彻底消除这一难题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值