2013-05-16 1 views
7

Это быстрый вопрос, но я не смог найти быстрый ответ. Теперь у меня есть сервлет BaseServlet, когда запрос пользователя любого из ниже URL:Servlet @WebServlet urlPatterns

host 
host/ 
host/BaseServlet 

Он всегда должен относиться к тому же сервлета и перенаправлять на главную страницу.

Когда я установил

@WebServlet({"/BaseServlet", ""}) 

Только

host/ 
host/BaseServlet 

работы

Если установить

@WebServlet({"/BaseServlet", "", "/"}) 

BaseServlet будет предложено постоянно в цикле ...

Почему?

Редактировать: BaseServlet делает пересылку index.html в папку WEB-INF, и все.

getServletContext().getRequestDispatcher("/WEB-INF/index.html").forward(request,response); 

Спецификация сервлета говорит: «Строка, содержащая только символ /, указывает« сервлет »по умолчанию приложения». Поэтому я хочу, чтобы BaseServlet был моим дефолтом. Почему это не работает?

+0

Что вы будете делать с ответом? –

+0

Сделайте некоторую предварительную обработку, а затем ответьте на веб-страницу. – kakacii

+0

Эта веб-страница может заставить сервлет повторно выполнить в цикле, о котором вы говорили. Показать нам. –

ответ

2

Edit:

Если вы хотите предварительно обработать, то вы можете использовать фильтр с URL-шаблон «/ *» и диспетчерская набор просить о том, как он будет игнорировать вперед.

Последнее значение "/" означает все запросы.

Checkout обсуждение на: http://www.coderanch.com/t/366340/Servlets/java/servlet-mapping-url-pattern

А внутри Servlet другой прямой запрос на index.html генерируется, который также перехвачены сервлета.

Если вы попробуете @WebServlet ({"/ BaseServlet", "/"}), то же самое, что и @WebServlet ({"/ BaseServlet", "", "/"}) приведет к такой же ошибке.

Вы можете проверить это, введя следующий оператор вывода в сервлет:

System.out.println(req.getRequestURL()); 
+0

Спасибо. Извините, что я не ответил вовремя, но я действительно не понимаю, что вы говорите. Спецификация сервлета говорит: «Строка, содержащая только символ /, указывает« сервлет »по умолчанию приложения.» Поэтому я хочу, чтобы BaseServlet был моим дефолтом. Почему это не работает? – kakacii

9
  1. Как вы укажите в Q, если вы хотите следующее:

    host/ 
    host/BaseServlet 
    

    Использование

    @WebServlet({"/BaseServlet", ""}) 
    
  2. Если вы нт следующее:

    host 
    

    Добавить это в приветственном файл (не позволяющий задать приветственные файлы с помощью аннотаций)

    <welcome-file-list> 
        <welcome-file>/BaseServlet</welcome-file> 
    </welcome-file-list> 
    
  3. сервлета спецификация говорит «строка, содержащая только '/'указывает сервлет приложения по умолчанию.

    Но он говорит прямо после

    В этом случае путь сервлета запрос URI минус путь контекст и информация пути является недействительной.

    Другими словами, если ваш URL является

    host 
    

    тогда путь сервлет будет

    "" (empty string) 
    

    так что вам потребуется приветственное список файлов (но index.htm [л ] и index.jsp в каталоге webapp, а не WEB-INF, включены неявно в качестве списка стартовых файлов приветствия)