Отображения сервлета с переменными (Tomcat 7.0)

Можно ли сопоставлять URL-адреса сервлетам (возможно, что-то конкретное с Tomcat), чтобы два следующих URL-адреса (с {id} были переменными, извлекаемыми из кода),

/users/{id}/a

/users/{id}/b

сопоставить два разных сервлета, или мне придется реализовать какой-то собственный фильтр для сервлета, отображаемого на /users/*?

Чтобы быть более понятным, любой URL с шаблоном /users/*/a должен отображаться на тот же сервлет. То же самое относится к /users/*/b.

Ответ 1

Вы можете сопоставить его на /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
        // ...
    }

}

(очевидная проверка размера массива опущена)

Ответ 2

Похоже, это может быть хорошим кандидатом для JAX-RS. Я не уверен, какая бизнес-логика выполняет ваш сервлет в настоящий момент, но этот параметр касается вашего вопроса о наборе сервлетов и может быть уместным.

@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) { ... }

}

Ответ 3

Я не думаю, что это возможно. Либо используйте UrlRewriteFilter, либо некоторые фреймворки вроде Spring -MVC, способные отображать более сложные URL-адреса