带变量的Servlet映射(Tomcat 7.0)

是否可以将URL映射到servlet(可能是Tomcat特有的),以便后面的两个URL({id}是从代码中检索的变量),

/users/{id}/a /users/{id}/b 

映射到两个不同的servlet,或者我是否必须为映射到/users/*的servlet实现我自己的某种filter?

更清楚的是,任何带有模式/users/*/a URL都应该映射到同一个servlet。 /users/*/b

您可以将它映射到/users/*并从HttpServletRequest#getPathInfo()提取信息:

 @WebServlet("/users/*") public class UsersController extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String[] pathInfo = request.getPathInfo().split("/"); String id = pathInfo[1]; // {id} String command = pathInfo[2]; // a or b // ... } } 

(省略了对数组大小的明显validation)

看起来它可能是JAX-RS的一个很好的候选者。 我不确定你的servlet当前执行什么业务逻辑,但是这个选项解决了你的servlet映射问题,可能是合适的。

 @Path("/users/{id}") public class User { @Path("a") public String doA(@PathParam("id") final int id) { ... } @Path("b") public String doB(@PathParam("id") final int id) { ... } } 

我不认为这是可能的。 要么使用UrlRewriteFilter要么使用一些能够映射更复杂URL的Spring-MVC框架