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,这里的*不是通配的含义

  

原文地址:https://www.cnblogs.com/zs-notes/p/9272613.html