我把编译好的一个servlet的字节码文件放在tomcat的ROOT文件夹的WEB-INF下的classes文件夹下,web.xml的servlet配置中加入<loadon-startup>1</loadon-startup>,该servlet已经重写了init方法,在启动tomcat的时候初始化一次,为什么在第一次访问该servlet的时候,又初始化一次?求解。这样不是相当于
<loadon-startup>1</loadon-startup>没有起到作用了吗?
代码:
package com.zdj.servlet;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class FirstSimpleServlet extends HttpServlet{
protected void service(HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException{
// response.setContentType("text/html");
PrintWriter out = response.getWriter();
// out.println("<HTML><TITLE>First servlet</TITLE><BODY>");
// out.println("<H2>This is your first servlet</H2>");
// out.println("</BODY></HTML>");
out.println("123wo shi zhangdengjie");
}
@Override
public void init() throws ServletException{
System.out.println("初始化");
}
}
xml配置:
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name>Welcome to Tomcat</display-name>
<description>
Welcome to Tomcat
</description>
<servlet>
<servlet-name>FirstSimpleServlet</servlet-name>
<servlet-class>com.zdj.servlet.FirstSimpleServlet</servlet-class>
<loadon-startup>1</loadon-startup>
</servlet>
<servlet-mapping>
<servlet-name>FirstSimpleServlet</servlet-name>
<url-pattern>/servlet/FirstSimpleServlet</url-pattern>
</servlet-mapping>
</web-app>
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在Servlet生命周期中,init()方法确实设计为只在Servlet被加载进内存时执行一次,用于进行一些初始化设置。根据您的描述,您提到的“在启动Tomcat的时候初始化一次”符合预期行为,这表明init()方法在Tomcat启动并部署应用时已经被调用。
然而,您提到的“在第一次访问该servlet的时候,又初始化一次”,这通常不应该发生。如果确认看到这样的现象,可能的原因有以下几点:
配置问题:请确保您的web.xml配置正确无误,特别是
类路径问题:确保没有同名的Servlet类存在于不同的类路径下,导致Tomcat实际上加载了两个不同的Servlet实例。
Tomcat或应用重启:有时候,如果您在访问Servlet之前对应用进行了重新部署或者Tomcat服务有某种形式的重启,可能会导致Servlet被重新加载和初始化。
并发或多线程问题:虽然不太常见,但如果存在多个请求同时到达且Servlet容器处理不当,理论上可能存在感知上的“多次初始化”。但现代Servlet容器如Tomcat对此有很好的管理,一般不会出现这种情况。
日志查看:仔细检查控制台输出或日志文件,确认是否真的有两次明确的“初始化”打印信息,有时日志的输出顺序或重复可能是由于其他原因造成的混淆。
自定义类加载器:如果有使用自定义类加载器,可能会导致类被多次加载和初始化。
如果以上排查均未发现问题,建议直接在Tomcat的日志级别中设置更详细的输出,以便于捕捉到更多关于Servlet加载和初始化过程的信息。此外,也可以尝试在一个干净的环境中重新部署应用,以排除环境因素的影响。