2009-06-23 3 views
52

Я пытаюсь построить сервлет, который вызывает страницу JSP, подобный следующему:Как я могу сопоставить «корневой» сервлет, чтобы другие скрипты все еще выполнялись?

public void doGet(HttpServletRequest req, HttpServletResponse resp) 
     throws IOException, ServletException { 
    req.getRequestDispatcher("/WEB-INF/main.jsp").forward(req, resp); 
} 

мне нужен этот Servlet, чтобы ответить на корень домена (например: http://example.com/), поэтому я использую следующее отображение в web.xml:

<servlet-mapping> 
    <servlet-name>MainServlet</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

проблема у меня в том, что это соответствует ВСЁ, так что, когда диспетчер направляет «/WEB-INF/main.jsp» это соответствует URL-шаблон так сервлет снова запускается. Это приводит к циклу, который выполняется до тех пор, пока он не умрет с java.lang.StackOverflowError.

Как я могу сопоставить корень, не препятствуя выполнению других сценариев?

+0

вы не сможете сделать это, вы должны использовать хаки, я попробовал sa я на appengine см. здесь http://stackoverflow.com/questions/870150/how-to-access-static-resources-when-using-default-servlet, но не работает –

+3

Может быть, время для принятого ответа? – Jeb

ответ

4

Вы можете создать файл приветствия с именем index.jsp в корневом каталоге с помощью следующего кода с использованием JSTL или иным способом.

<c:redirect url="/main"/> 

Таким образом, в файле web.xml вы будете иметь это:

<welcome-file-list> 
    <welcome-file>index.jsp</welcome-file>   
</welcome-file-list> 

Таким образом, любой запрос корень будет перенаправлен/главный. Теперь ваш сервлет можно сопоставить с основным.

<servlet-mapping> 
    <servlet-name>MainServlet</servlet-name> 
    <url-pattern>/main</url-pattern> 
</servlet-mapping> 
+2

Хорошо, я понимаю, что это сработает, но оно упало, как такой хак. Действительно ли невозможно, чтобы сервлет обрабатывал корень самостоятельно? –

+0

Извините за голосование, но есть лучшее решение - http://stackoverflow.com/questions/1030302/how-can-i-map-a-root-servlet-so-that-other-scripts-are-still- runnable/4443581 # 4443581 –

+0

Это решение имеет то преимущество, что оно не создает сопоставление в каждом каталоге, как это делают приветственные файлы. Поэтому я использовал его (хотя с простым <% scriptlet, а не тегом), и я голосую за него. –

0

Вы не можете перенаправить на WEB-INF. Контейнер сервлета никогда не будет обслуживать запросы на документы в этой папке.

Если вы хотите, чтобы ваше приложение (а не только сервлет, но все приложение) было доступно в корневом контексте («/» из «http://www.domainname.com/»), вам нужно настроить для него контекстную запись - а не отображение сервлетов.

С Tomcat вы добавляете новый (в одном из трех возможных возможных мест).

+1

Я не делаю перенаправления, я делаю вперед. Это внутреннее, так что неважно, публично ли они публично видны, не так ли? В любом случае, перемещение их из WEB-INF не помогло. Я не использую Tomcat, но я посмотрю на контекстное сопоставление, спасибо. –

+0

Контейнер будет обслуживать ресурсы под WEB-INF при отправке запроса. Это действительная и полезная парадигма структуры сайта. –

+0

@fiXedd вы правы, я неправильно понял –

0

Вы пробовали нижеследующее? (Обратите внимание на недостающую *, который является джокером и является причиной того, что ваша конфигурация ловит все.)

<servlet-mapping> 
     <servlet-name>MainServlet</servlet-name> 
     <url-pattern>/index.jsp</url-pattern> 
</servlet-mapping> 

(ред согласно комментариям от всего /.)

+0

Я сделал ... у него был тот же результат. Я должен был упомянуть, что я делаю это в App Engine. Я начинаю думать, что они картографируют, а, неуклюже. –

+0

Хорошо, попробуйте index.jsp, тогда? –

1

Попробуйте просто удалить «*» от образца, т.е.

<url-pattern>/</url-pattern> 
+0

@fiXedd, по-видимому, пробовал это, и он не работает. (См. Историю изменений моего ответа.) Может быть, что-то делать с запуском в App Engine ... –

+0

Это работает на причале и tomcat. – chrismarx

1

раствор упоминается в другом потоке URL Pattern for servlet mapping in web.xml использованием URLrewrite ->http://tuckey.org/urlrewrite/

+1

Спасибо, что включил меня в эту вещь urlrewrite. Это заставило мой java webapp работать с durandal, у меня возникла какая-то странная проблема с добавлением псевдонима маршрутизации в URL-адрес URL-адреса. –

7

В оригинальном вопросе не упоминается, что они пытаются сопоставить корневой сервлет в App Engine - на Tomcat (и других контейнерах сервлетов, насколько я знаю) это легко, но App Engine не является обычным контейнером сервлета.

Мой обычный способ создания веб-приложения с сервлетами заключается в расширении HttpServlet, добавлении объекта «страницы» с заголовком, содержимым, ошибками, сообщениями и т. Д. И для вывода вперед в шаблон JSP. Это был абсолютный кошмар, работающий в App Engine.

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

Вот мой web.xml (отредактированный для краткости), который в итоге работал.

<web-app> 
    <servlet> 
    <!-- this servlet needs to redirect to a NamedDispatcher 
     called "template" --> 
    <servlet-name>Home</servlet-name> 
    <servlet-class>my.domain.HomeSv</servlet-class> 
    </servlet> 
    <servlet> 
    <!-- jsp file must apparently be in root directory and have "/" at 
     start of path --> 
    <servlet-name>template</servlet-name> 
    <jsp-file>/template.jsp</jsp-file> 
    </servlet> 
    <servlet-mapping> 
    <!-- map your home servlet to somewhere other than "/" --> 
    <servlet-name>Home</servlet-name> 
    <url-pattern>/home</url-pattern> 
    </servlet-mapping> 
    <welcome-file-list> 
    <!-- make your Home servlet the welcome file --> 
    <welcome-file>home</welcome-file> 
    </welcome-file-list> 
</web-app> 

Я не был особенно научной о проверке все это - но это, кажется, работает для меня теперь, и я очень рад этому поводу.

+1

На сервере-разработчике кажется, что добавление резервного файла index.html приведет к тому, что index.html будет иметь приоритет над вашим сервлетом, если он существует, даже если он указан _after_ <добро-файл> Главная. – hraban

29

Использование файла приветственного файла web.xml для меня работало, на движке приложения. Вот мой:

<web-app> 
    <servlet> 
     <servlet-name>RootServlet</servlet-name> 
     <servlet-class>com.foo.RootServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>RootServlet</servlet-name> 
     <url-pattern>/foo</url-pattern> 
    </servlet-mapping> 
    <welcome-file-list> 
     <welcome-file>foo</welcome-file> 
    </welcome-file-list> 
</web-app> 
+1

Это отлично работает.Просто знайте, что «имя сервлета» не может быть таким же, как «приветственный файл». – nunaxe

+0

Кажется, не работает для меня на Jetty или Tomcat. Только когда файл приветствия является фактическим файлом, он открывает его правильно. – Jus12

+0

Работает как очарование в Apache Tomcat, хотя решение, предлагаемое @nilskp, немного легче :) – user3856210

41

Использовать пустой шаблон, например.

<servlet-mapping> 
    <servlet-name>MainServlet</servlet-name> 
    <url-pattern></url-pattern> 
</servlet-mapping> 

сервлет 3,0 спецификации прояснила это:

пустой строки («») является специальным шаблоном URL, который точно отображает контекстного корень приложения

Так это должен по крайней мере работать с контейнером 3.0, и я проверял, что он работает на Jetty 8

+0

Не работает на Jboss 5.1 (сервлет spec 2.5) –

+2

Не работает в WebSphere 8.5 (сервлет 3.0) – Cypher

+0

Запишите отчет об ошибке. – nilskp

 Смежные вопросы

  • Нет связанных вопросов^_^