开发者社区 问答 正文

tomcat初始化servlet几次? 403.10 禁止访问:配置无效

我把编译好的一个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>

展开
收起
kun坤 2020-05-27 14:01:53 501 分享 版权
阿里云 AI 助理回答

在Servlet生命周期中,init()方法确实设计为只在Servlet被加载进内存时执行一次,用于进行一些初始化设置。根据您的描述,您提到的“在启动Tomcat的时候初始化一次”符合预期行为,这表明init()方法在Tomcat启动并部署应用时已经被调用。

然而,您提到的“在第一次访问该servlet的时候,又初始化一次”,这通常不应该发生。如果确认看到这样的现象,可能的原因有以下几点:

  1. 配置问题:请确保您的web.xml配置正确无误,特别是部分。从您提供的代码片段看,这部分配置看似是正确的,但请再次检查是否有其他配置错误或遗漏。

  2. 类路径问题:确保没有同名的Servlet类存在于不同的类路径下,导致Tomcat实际上加载了两个不同的Servlet实例。

  3. Tomcat或应用重启:有时候,如果您在访问Servlet之前对应用进行了重新部署或者Tomcat服务有某种形式的重启,可能会导致Servlet被重新加载和初始化。

  4. 并发或多线程问题:虽然不太常见,但如果存在多个请求同时到达且Servlet容器处理不当,理论上可能存在感知上的“多次初始化”。但现代Servlet容器如Tomcat对此有很好的管理,一般不会出现这种情况。

  5. 日志查看:仔细检查控制台输出或日志文件,确认是否真的有两次明确的“初始化”打印信息,有时日志的输出顺序或重复可能是由于其他原因造成的混淆。

  6. 自定义类加载器:如果有使用自定义类加载器,可能会导致类被多次加载和初始化。

如果以上排查均未发现问题,建议直接在Tomcat的日志级别中设置更详细的输出,以便于捕捉到更多关于Servlet加载和初始化过程的信息。此外,也可以尝试在一个干净的环境中重新部署应用,以排除环境因素的影响。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答