为什么没有为所有请求调用 servlet

Why is servlet not being called for all requests

我正在将 Web 应用程序部署到 tomcat 8(重命名为 ROOT.war),因为 url 模式设置为 / 我认为所有请求都会定向到 servlet。但事实并非如此,最终我意识到如果我开始 url 与?比如

http://localhost:8080/?search=fred

它不会工作,但没有?它会起作用

http://localhost:8080/search=fred

这是为什么?

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"> 
<display-name>Widget</display-name>
<servlet>
<servlet-name>WidgetServlet</servlet-name>
<servlet-class>com.jthink.WidgetServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>WidgetServlet</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>

servlet 映射是特定的。您需要添加一个通配符。

<servlet-mapping>
    <servlet-name>WidgetServlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

如果您希望您的 Servlet 为所有 URL 提供服务,那么 url-pattern 应该像这样

<url-pattern>/*</url-pattern>

顾名思义,应该是RegEx模式。当您说 / 时 - 这意味着在 URL 中查找 / 的单次出现。但是当你在 URL 中有多个斜杠时,比如

那么它应该是 /*,这意味着您要求它查找零次或多次出现的斜杠。

希望说清楚:)