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