我把编译好的一个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加载和初始化过程的信息。此外,也可以尝试在一个干净的环境中重新部署应用,以排除环境因素的影响。