我有一个web.xml
的servlet,如下所示:
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<welcome-file-list>
<welcome-file>/</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>myservlet</servlet-name>
<servlet-class>com.mydomain.myapp.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myservlet</servlet-name>
<url-pattern>/</url-pattern>
<url-pattern>/rest1*</url-pattern>
<url-pattern>/rest2*</url-pattern>
<url-pattern>/rest3*</url-pattern>
</servlet-mapping>
</web-app>
最终,servlet应支持来自GET
的{{1}}等REST调用。
但是,所发生的情况是,从浏览器开始以http://myserver/myapp/rest1?param=1
开头的所有URL调用显然会导致使用http://myserver/myapp/
调用servlet的doGet()
方法。
但是,如果给定request.pathInfo() == null
s,则网址url-pattern
不会导致http://myserver/myapp/rest1?param=1
,并且"/rest1".equals(request.pathInfo())
等网址格式不会导致HTTP响应404来自servlet?
servlet正在Apache Tomcat 9上运行。
答案 0 :(得分:1)
更改为这些网址模式证明最有效:
<url-pattern></url-pattern>
<url-pattern>/rest1</url-pattern>
<url-pattern>/rest2</url-pattern>
<url-pattern>/rest3</url-pattern>
密钥正在从/
更改为空URL模式。 this上一个答案中很好地解释了两个和其他关键模式之间的差异。
我现在使用getServletPath()
代替getPathInfo()
进一步调度doGet()
。这些与其他函数之间的区别(以及为什么getPathInfo()
现在总是返回null
)在that之前的答案中得到了很好的解释。
答案 1 :(得分:0)
将<url-pattern>/rest1*</url-pattern>
更改为<url-pattern>/rest1/*</url-pattern>