如何配置web.xml url-pattern以获取指定位置?

时间:2013-09-20 07:16:35

标签: java-ee tomcat servlets web.xml

我希望使用“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>

但这不正确。我怎么能这样做?

2 个答案:

答案 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将被执行。

我希望它可以帮到你。