带变量的Servlet映射(Tomcat 7.0)

时间:2011-11-24 05:06:44

标签: java tomcat servlets servlet-filters

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

/users/{id}/a

/users/{id}/b

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

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

3 个答案:

答案 0 :(得分:6)

您可以将其映射到/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
        // ...
    }

}

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

答案 1 :(得分:5)

这似乎可能是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) { ... }

}

答案 2 :(得分:0)

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