Добавить виртуальную папку в динамический веб-проект

Прямо сейчас я пытаюсь выполнить проект на Eclipse Juno и Tomcat 7, для которого требуется «виртуальная папка» для хранения мультимедийных файлов (например, изображений, других подстраниц и т. д.). У меня уже есть несколько способов указать путь к файлу в синтаксисе на основе URI (скажем, я хочу получить доступ к изображениям в /Content/Image), и я хочу сопоставить этот URI с C:\Users\MyUser\Content\image (я я знаю, что я привязываю проект к системам Windows, но позже в этой проблеме я найду обходной путь).

В настоящее время мой проект называется pj, и Eclipse создал контекст с именем pj внутри экземпляра eclipse tomcat (и это имеет большой смысл). Когда я тестирую свой проект с

> http://localhost:8080/pj

работает нормально (так и должно быть).

Но здесь есть проблема: до сих пор я не нашел способа создать URI в tomcat, чтобы фактически перейти к пути содержимого/изображения, чтобы захватить контент для добавления на мои страницы (прочитал где-то, что нездорово хранить контент в WEB -INF, поэтому я пытаюсь сделать это правильно). Также где-то читал, что для достижения этой цели мне нужно сделать что-то вроде этого в контекстах:

<context docbase="d:/images" path="/Content/Images"></context>

Также прочитайте там, что в tomcat для разрешения URI вы должны использовать контексты для достижения этой цели (предоставляя мост между значением URI и его расположением в файловой системе). Тем не менее, как и в Tomcat 4 (если не ошибаюсь), он не должен возиться с server.xml, поэтому в ДРУГОЙ попытке сделать это правильно я пытаюсь фактически добавить контекст в META-INF внутри context.xml с показанным кодом до. Но есть здесь ДРУГАЯ проблема! Кажется, что добавление тега пути сводит Tomcat с ума, как сказано здесь: http://tomcat.apache.org/tomcat-7.0-doc/config/context.html .

Так что я действительно в затруднительном положении.... Что я хочу спросить:

  1. Каков наилучший способ добавить внешнюю папку в веб-проект для получения мультимедийного контента и
  2. Как это должно работать внутри Eclipse?

PS: я спрашиваю об этом, потому что в одном из моих методов внутри моего проекта я использую метод getLoader для возврата InputStream (java.io InputStream NOT Corba), и он возвращает нули (что означает, что он его не находит).

РЕДАКТИРОВАТЬ: Пытался фактически возиться с server.xml, вставив контекст вручную, но не сработал, вставка относительного URI не работает на сервере (локальный: 8080/Content/Image с действительными файлами внутри) или зайдя внутрь моего основной проект и сделать getstream тоже не работает


person John    schedule 12.09.2012    source источник
comment
Если вам нужно получить содержимое программно, мне кажется более логичным хранить его в папке WEB-INF.   -  person wds    schedule 12.09.2012
comment
Это правда, тем не менее я где-то читал, что хранение вещей в WEB-INF - не очень хороший подход, поскольку для этого требуется, чтобы tomcat взорвал веб-приложение, а это не очень надежно. И в тесте я понял, пытался получить доступ к вещам на WEB-INF и по какой-то причине я не мог получить файл JPG (но я могу получить файл .properties...)   -  person John    schedule 12.09.2012
comment
Это может иметь значение: stackoverflow.com/questions/5915425/   -  person wds    schedule 13.09.2012
comment
Я очень благодарен, что вы поделились этим вопросом! Кажется, что classLoader не может извлекать файлы за пределами WEB-INF, и это может быть причиной этого беспорядка... Я буду работать над этим сегодня и опубликую подробный пост о проблеме/решении, описывающий его, если я смогу найти решение   -  person John    schedule 13.09.2012


Ответы (2)


После некоторой возни, настройки и т. д. я нашел обходной путь для этой ситуации. Как я уже сказал, на самом деле возможно, чтобы внешняя папка содержала все мультимедиа и/или страницы по вашему желанию. Одна из ссылок на это решение находится здесь: http://harkiran-howtos.blogspot.pt/2009/08/map-external-directory-into-your.html .

Тем не менее, по какой-то причине это не совсем возможно заставить это работать внутри Eclipse (или я что-то потерпел неудачу и не смог заставить это работать). Но для этого есть альтернативное решение. Также возможно иметь папку для этой цели ВНУТРИ веб-приложения, но ВНЕ папки WEB-INF и META-INF. Другими словами, папка, расположенная в ROOT веб-приложения. Чтобы получить доступ к этим файлам в этой папке, вы можете использовать нечто, называемое ServletContext. Этот контекст фактически содержит все возможные ссылки на структуру папок вашего веб-приложения. Чтобы получить доступ к этим файлам с заданным контекстом, вы должны использовать getResourceAsStream из контекста сервлета (или использовать getRealPath, если это необходимо, и/или вы можете гарантировать, что веб-приложение будет развернуто внутри Tomcat). Другими словами, для доступа к папкам внутри веб-приложения, но вне WEB-INF и META-INF, вы должны использовать ServletContext и заданные им методы для получения файлов/потоков.

PS: Ty wds за указание на ServletContext

person John    schedule 14.09.2012

Я заставил решение harkiran работать, но это не очень хорошее решение.

Люди не одобряют использование getRealPath. Сопоставление внешней папки полезно по многим причинам.

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

рабочая область/.метаданные/.плагины/org.eclipse.wst.server.core/tmp0/

Внутри этой папки вы должны создать структуру каталогов и файл из решения harkiran. У меня работает до тех пор, пока вы не удалите и не создадите заново сервер в Eclipse.

После этого вам нужно сделать это снова.

person Marko    schedule 21.03.2015