Отображения сервлетов с переменными (Tomcat 7.0) - PullRequest
8 голосов
/ 24 ноября 2011

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

/users/{id}/a

/users/{id}/b

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

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

Ответы [ 3 ]

6 голосов
/ 24 ноября 2011

Вы можете отобразить его на /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
        // ...
    }

}

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

5 голосов
/ 29 ноября 2011

Похоже, это может быть хорошим кандидатом на 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) { ... }

}
0 голосов
/ 24 ноября 2011

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

...