将 servlet 映射设置为空字符串时无效 <url-pattern>

Invalid <url-pattern> in servlet mapping when set it to empty string

为了拥有一个生成主页内容的主页 servlet,我在 servlet-mapping 中将 url-pattern 保留为空,AFAIK 映射到上下文根,比如 mysite.com / 或 http://{host}:{port}/mysite/

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_0.xsd"
     version="3.0">

<display-name>My site</display-name>

<servlet>
  <servlet-name>controller</servlet-name>
  <servlet-class>com.mysite.control.MainController</servlet-class>
  <!-- Load this servlet at server startup time -->
  <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
  <servlet-name>controller</servlet-name>
  <url-pattern></url-pattern>
</servlet-mapping>  

以上是完整的 web.xml(根元素 web-app 除外)。 但是 Tomcat 7.0.26 在启动期间出现以下错误,导致 war 未部署。

SEVERE: ContainerBase.addChild: start: 
org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/mysite]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:895)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:871)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:615)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:958)
    ...
Caused by: java.lang.IllegalArgumentException: Invalid <url-pattern>  in servlet mapping
    at org.apache.catalina.core.StandardContext.addServletMapping(StandardContext.java:3208)
...

注1:这不是spring项目,它是纯servlet 3.0项目,目前只有web.xml配置。

注2: class com.mysite.control.MainController确实存在。

我该如何解决这个问题?我知道欢迎文件是模仿主页的一个选项,但这不是最佳选择,我更愿意修复它。这是 tomcat 7.0.26 错误还是其他问题?

这是 Tomcat 的错误,自 7.0.28 以来已修复。 请参考this page。所以你应该更新 Tomcat.