Отображения сервлета с переменными (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-адреса