在web.xml中映射两个servlet,其中一个URL模式是另一个的子模式

时间:2014-05-08 10:11:23

标签: google-app-engine url servlets web.xml

我有一个Web应用程序,我希望将JSP绑定到地址http://host:port/status,并将servlet绑定到http://host:port/status/...之类的地址。这可能吗?根据{{​​3}}文章,它应该是可能的(“容器更喜欢在通配符路径上匹配的精确路径匹配”),至少对于某些容器而言,Java Servlet规范包含类似的示例(尽管没有通配符,第12页 - 123(2013年4月版)123,但是如果我在web.xml中尝试以下操作,则看起来好像从未调用过JSP,并且所有请求(也是http://host:port/status)都被路由到servlet。我的JSP和servlet托管在Google App Engine上。

<servlet>
    <servlet-name>Status</servlet-name>
    <jsp-file>/Status.jsp</jsp-file>
</servlet>
<servlet-mapping>
    <servlet-name>Status</servlet-name>
    <url-pattern>/status</url-pattern>
</servlet-mapping>
<servlet>
    <servlet-name>StatusUpload</servlet-name>
    <servlet-class>com.example.StatusUploadServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>StatusUpload</servlet-name>
    <url-pattern>/status/*</url-pattern>
</servlet-mapping>

1 个答案:

答案 0 :(得分:1)

不是将相同的URL映射到web.xml中的两个不同的JSP / Servlet,而是使用像Tuckey UrlRewriteFilter这样的URL重写过滤器,它使用配置文件urlrewrite.xml,它也可以放在WEB-INF中。它在规则中使用正则表达式。

这两条规则应该做你想要的:

      <rule>
        <from>^/status$</from>
        <to>/Status.jsp</to>
      </rule>
      <rule>
        <from>^/status/(.*)$</from>
        <to>/StatusUpload/?param=$1</to>
      </rule>

然后在WEB-INF中,您不再映射JSP,而是将Servlet映射到StatusUpload。当用户转到/status/postfix时,URL重写过滤器将转发到后端的servlet(后缀部分作为参数传递),而没有用户在地址栏中看到的地址更改。