严重[RMI TCP Connection(5)-127.0.0.1]
org.apache.catalina.core.ContainerBase.addChildInternal ContainerBase.addChild: start:
org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/demo]]
tomcat用得好好的,但就在我新建了一个Servlet之后,他就突然暴毙,真的心疼。。
不怕你们笑话,我被这个低级错误整了一个多小时,浪费生命。
先来看一下粗心的我写的源码
注意看这个段代码有什么问题?
我想细心的华生已经发现了盲点
很好
没错就是他
@WebServlet(name = “Demo02ForwardServlet”, urlPatterns =“ForwardServlet”【加上一个斜杠就万事大吉】"/ForwardServlet" )
告诫各位:注解虽爽,但也要细心啊!!
===============================
如果还有耐心,看我分析一下原因。
网上找了一下tomcat的初始化大致的步骤,原作者在下方链接,黄底色部分是我个人分析
文档中显示大体分为两步
1:当接受到启动命令时 初始化类加载器 初始化核心类的 init()
2:初始化Tomcat 的信息 加载资源 等待请求的到来
当接受到启动命令时 详细动作(第一步)
在 org.apache.catalina.startup.Bootstrap 类的 init() 方法中
1:装配类加载器 commonLoader / sharedLoader / catalinaLoader
2:加载启动管理类 org.apache.catalina.startup.Catalina
第二步又分多小步
1:初始化Tomcat 信息
- 设置等待参数为true
- 初始化堆栈/读取配置/启动监听/初始化多个结果集/输出加载信息/初始化以及注册所有对象为JMX代理
(在这一步中设置了单一的入口链接 http://127.0.0.1:8080)
2:Catalina 的初始化
1)首先是加载服务StandardService -> starts Engine (ContainerBase ->Logger,Loader,Realm,Cluster etc)类的加载与初始化 / 开启线程上下文/加载需要部署的项目寻找路径是(webapps & conf/Catalina/localhost/*.xml) 然后加载处理应用的web.xml。
我想问题应该出在这里:在JavaEE6.0的及之后,我们可以使用Servlet3.0版本的@WebServlet注解,从而省去web.xml文件,于是这个步骤应该会变成去加载我们在注解里添加的配置,所以如果注解中的urlPatterns写错了的话,那么应该会导致tomcat初始化失败,从而突然暴毙。以上就是我的分析,欢迎大佬指正。
2)启动一个线程来监听context/web.xml 如果更改就重新加载
3:当接收到请求 (会一直调用协议处理器)
1)单独开启的一个线程 等待接受请求的到来
2)获取到一个请求时分配一个TCP链接来处理请求(提供了一个容器)
(HTTP 请求在一个内部缓冲区中解析 [请求行/标头] 并将结果存储在结果集中 request )
3)解析完请求之后会将参数绑定到线程/并装载要使用的类以及实例的编译JSP
4)调用Servlet
本文来自 DoZX 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/qq_30436259/article/details/72817511?utm_source=copy