今天開發犯了一個特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,這里的*不是通配的含義