Отображения сервлетов с переменными (Tomcat 7.0)
Можно ли сопоставить URL-адреса с сервлетами (возможно, что-то конкретное с Tomcat), чтобы два следующих URL-адреса (с переменными {id}, извлекаемыми из кода),
/users/{id}/a
/users/{id}/b
сопоставить с двумя различными сервлетами, или мне придется реализовать какой-то собственный фильтр для сервлета, сопоставленного с /users/*
?
Чтобы быть более понятным, любой URL с шаблоном /users/*/a
должен отображаться на тот же сервлет. То же самое касается /users/*/b
,
3 ответа
Вы можете отобразить это на /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
// ...
}
}
(очевидная проверка размера массива опущена)
Похоже, это может быть хорошим кандидатом на 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) { ... }
}
Я не думаю, что это возможно. Либо использовать UrlRewriteFilter
или какой-то фреймворк, такой как Spring-MVC, который способен отображать более сложные URL