1

我想处理对“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/.../...

在最好的情况下,我想像这样编写映射:

<servlet-mapping>
  <servlet-name>ProjectsServlet</servlet-name>
  <url-pattern>/Projects</url-pattern>
  <url-pattern>/Projects/*/</url-pattern>
</servlet-mapping>

但这是不正确的。我该怎么做?

4

2 回答 2

3

您不能将多个 url 模式放入一个 servlet 映射中。您需要具有相同 servlet 名称但不同 url 模式的多个 servlet 映射。

我的建议是将您的 servlet 映射到所有 /Projects/* URL 并实现简单的 servlet 过滤器,它将为具有子路径的任何 URL 返回 404(也可以在您的 servlet 中进行此检查,但如果您无法修改 servlet,请使用筛选)。

于 2013-09-20T09:08:08.987 回答
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> 

您还可以为“/Projects/*/”之类的 url 映射到过滤器(ProjectsServletFilter),并在此过滤器中处理请求(在此处决定是否需要发送 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>

无论如何,如果上述过滤器(ProjectsServletFilter)成功执行而没有返回任何 404 错误代码等,“/Projects” url servlet 将被执行。

我希望它对你有帮助。

于 2013-09-20T09:58:52.323 回答