这可能不是预期的答案,但您必须使用 Java EE 提供的功能。 Servlet 3.0 规范说:
在 Web 应用程序部署描述符中,使用以下语法来定义映射:
- 以
/ 字符开头并以/* 后缀结尾的字符串用于路径映射。
- 以
*. 前缀开头的字符串用作扩展映射。
- 空字符串 ("") 是一种特殊的 URL 模式,它完全映射到
应用程序的上下文根,即http://host:port// 形式的请求。在这种情况下,路径信息为
/,而 servlet 路径和上下文路径为空字符串 ("")。
- 仅包含
/ 字符的字符串表示应用程序的“默认”servlet。在这种情况下,servlet 路径是请求 URI 减去上下文路径,并且路径信息为空。
- 所有其他字符串仅用于完全匹配。
这意味着你不能做你想做的事,除了你可以使用容器将使用的事实:
例如,如果您想将/show.jsp/asd 映射到一个servlet 并将/show.jsp/* 映射到另一个,这是可能的。但是没有办法区分字符的类型。
它与您想要的不匹配,但它是它的工作方式......
如果你真的想这样做,你将不得不开发一个映射到`/show.jsp/*' 的中继servlet。它将分析 PathInfo 字符串并转发到其他(未映射的)servlet 之一,具体取决于它是否包含非字母字符。
在 web.xml 中:
<servlet>
<servlet-name>relay</servlet-name>
<servlet-class>distinguished.classof.Relay</servlet-class>
</servlet>
<servlet>
<servlet-name>show</servlet-name>
<jsp-file>/show.jsp</jsp-file>
</servlet>
<servlet>
<servlet-name>other</servlet-name>
<jsp-file>/other.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>relay</servlet-name>
<url-pattern>/show.jsp/*</url-pattern>
</servlet-mapping>
中继:
public class Relay extends HttpServlet {
static final String SHOW = "show";
static final String OTHER= "other";
private Pattern pattern;
@Override
protected void service(HttpServletRequest hsr, HttpServletResponse hsr1) throws ServletException, IOException {
String info= hsr.getPathInfo();
RequestDispatcher dispatcher = getServletContext.getNamedDispatcher(
pattern.matcher(info).matches() ? SHOW : OTHER);
dispatcher.forward(hsr, hsr1);
}
@Override
public void init() throws ServletException {
pattern = Pattern.compile("\\w*");
}
}