我希望使用“ProjectsServlet”处理对/Projects
和/Projects/SomeProject/
的请求,但在访问404
时返回/Projects/SomePath/SomeOtherSubPath
错误代码。
项目名称经常更新,所以我不想每次都重写我的Servlet代码,我编写了简单的项目名称解析器和servlet加载指定页面(如果存在)。
那么如何在web.xml中编写配置?现在看起来像:
<servlet>
<servlet-name>ProjectsServlet</servlet-name>
<servlet-class>com.example.ProjectsServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ProjectsServlet</servlet-name>
<url-pattern>/Projects/*</url-pattern>
</servlet-mapping>
但它也试图处理'Projects'根目录/Projects/.../...
在最好的情况下,我想写这样的映射:
<servlet-mapping>
<servlet-name>ProjectsServlet</servlet-name>
<url-pattern>/Projects</url-pattern>
<url-pattern>/Projects/*/</url-pattern>
</servlet-mapping>
但这不正确。我怎么能这样做?
答案 0 :(得分:3)
您不能将多个url-patterns放入一个servlet-mapping中。您需要具有相同servlet-name但具有不同url-pattern的多个servlet-mappings。
我的建议是将您的servlet映射到所有/ Projects / * URL并实现简单的servlet过滤器,对于带有子路径的任何URL,它将返回404(此检查也可以在您的servlet中进行,但如果您无法修改servlet,使用过滤器)。
答案 1 :(得分:2)
正如我对问题的理解:
如果你想要这个东西
<servlet-mapping>
<servlet-name>ProjectsServlet</servlet-name>
<url-pattern>/Projects</url-pattern>
<url-pattern>/Projects/*/</url-pattern>
</servlet-mapping>
您可以使用两个Servlet映射:
<servlet-mapping>
<servlet-name>ProjectsServlet</servlet-name>
<url-pattern>/Projects</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ProjectsServlet</servlet-name>
<url-pattern>/Projects/*/</url-pattern>
</servlet-mapping>
您还可以映射到过滤器(ProjectsServletFilter),例如&#34; / Projects / * /&#34;并在此过滤器中处理请求(在此决定是否需要发送404或继续链到另一个servlet等)。
<filter>
<filter-name>ProjectsServletFilter</filter-name>
<display-name>ProjectsServletFilter</display-name>
<filter-class>ProjectsServletFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ProjectsServletFilter</filter-name>
<url-pattern>/Projects/*/</url-pattern>
</filter-mapping>
无论如何,&#34; / Projects&#34;如果上面的过滤器(ProjectsServletFilter)成功执行而没有返回任何404错误代码等,则url servlet将被执行。
我希望它可以帮到你。