我有一个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>
答案 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(后缀部分作为参数传递),而没有用户在地址栏中看到的地址更改。