java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component...
今天开发犯了一个特lowB的错,记录下来,引以为戒!
严重: A child container failed during start java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/UpLoadExcel]] at java.util.concurrent.FutureTask.report(FutureTask.java:122) at java.util.concurrent.FutureTask.get(FutureTask.java:192) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1122) at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:819) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1574) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1564) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/UpLoadExcel]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154) ... 6 more
问题描述:启动tomcat就报这个错(一个子容器在启动时失败。)
问题解决:从头到尾检查了一通tomcat和servlet的配置,最后发现竟是web.xml中servlet的映射路径配置错误导致的
<servlet> <servlet-name>excelUploader</servlet-name> <servlet-class>com.trs.webframework.controler.servlet.ExcelUploader</servlet-class> </servlet> <servlet-mapping> <servlet-name>excelUploader</servlet-name> <url-pattern>excelUploader.do</url-pattern> //错误配置,前面需加个“/” </servlet-mapping>
总结:url-pattern规则:有精确匹配,最长路径匹配,扩展匹配,如果前三条规则都没有匹配到,则会交给第四种叫default servlet处理。
以”/’开头和以”/*”结尾的是用来做路径映射的; “/” 是用来定义default servlet映射的。 以前缀”*.”开头的是用来做扩展映射的。剩下的都是用来定义详细映射的;比如: /aa/bb/cc.action。
<url-pattern>/</url-pattern>和<url-pattern>/*</url-pattern>的区别:
<url-pattern>/</url-pattern> 会匹配到/login这样的路径型url,不会匹配到模式为*.jsp这样的后缀型url
<url-pattern>/*</url-pattern> 会匹配所有url:路径型的和后缀型的url(包括/login,*.jsp,*.js和*.html等)
注意:路径和扩展名匹配无法同时设置,因为这种匹配即属于路径映射,也属于扩展映射,导致容器无法判断。比如下面的三个<url-pattern>都是非法的,如果设置,启动tomcat服务器会报错。
<url-pattern>/aa/*.jsp</url-pattern>
<url-pattern>/*.jsp</url-pattern>
<url-pattern>bb*.jsp</url-pattern>
另外注意:<url-pattern>/aa/*/bb</url-pattern>
这个是精确匹配,url必须是 /aa/*/bb,这里的*不是通配的含义