2011-12-15 2 views
2

У меня есть два сервлета (MainServlet и LoginServlet), а MainServlet обрабатывает весь запрос и отображает его на /*. LoginServlet обрабатывает запрос и отображается в/login. У меня есть один html-файл /html/login.html. Теперь я хочу показать этот html-файл, когда я нажму http://localhost:8080/app/login.сервлет url mapping

В LoginServlet doGet методе я делаю httpServletRequest.getRequestDispatcher("login/login.html").include(httpServletRequest, httpServletResponse);

, но этот запрос переадресации на MainServlet. Я не могу изменить отображение url MainSerlvet от /* к чему-то еще.

Любая идея, как я могу достичь выше? PS: Если вопрос непонятен, скажите, пожалуйста.

+0

Вы указали, что ваш html-файл находится в «/html/login.html», но похоже, что вы получаете диспетчер запросов для «login/login.html». Это опечатка в вашем вопросе? В противном случае это может представлять собой, по меньшей мере, часть проблемы. – shelley

ответ

1

Вы картировали MainServlet по шаблону глобального URL-адреса /*, который является довольно плохой практикой для сервлетов (это также охватывает статические ресурсы, такие как CSS/JS/images/etc!). Это также перехватит все отправленные и включенные запросы. Вам нужно сопоставить MainServlet по более конкретному шаблону URL, например. /main/*, /app/* или что-то в этом роде и создайте Filter, который отображается на /* и пересылает все, кроме /login, запросы на MainServlet.

String uri = ((HttpServletRequest) request).getRequestURI(); 

if (uri.startsWith("/login/")) { 
    // Just continue to login servlet. 
    chain.doFilter(request, response); 
} else { 
    // Forward to main servlet. 
    request.getRequestDispatcher("/main" + uri).forward(request, response); 
} 

Кстати, с помощью RequestDispatcher#include(), чтобы отобразить представление не совсем правильно, как хорошо. Вместо этого вы должны использовать RequestDispatcher#forward().