Загрузка ресурсов в Tomcat

Я пробую простое веб-приложение в tomcat 7. У него есть вызов javascript в index.html, который загружает файл свойств. Используя приведенный ниже код, чтобы сделать звонок,

var req = new XMLHttpRequest();
req.open("GET", "xyz.properties");
req.onreadystatechange = function() {
    if (req.readyState == 4) {
        if (req.status == 200) {
        }
    }
}
req.send();

Пробовал следующие варианты использования,

  1. Сохранил файл свойств непосредственно внутри файла войны, то есть вне WEB-INF - Это работает.
  2. Сохранил его под WEB-INF/classes - Не работает.
  3. Завернул его в банку и держал под WEB-INF/lib — не работало.
  4. Поместите банку под Tomcat/lib - Не работает.

Насколько я понимаю, каждый запрос ресурса/класса проходит через WebAppClassloader, который смотрит на вещи в следующем порядке:

  1. Ремешок для загрузки JVM
  2. системный загрузчик
  3. веб-инф/классы
  4. веб-инф/библиотека
  5. общий / библиотека

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

Может ли кто-нибудь пролить свет на то, чего не хватает в приведенных выше тестах. Обычно, если запрос на получение проходит через загрузчик классов, разве он не сможет найти файл во всех случаях.


person Victor    schedule 25.08.2014    source источник


Ответы (1)


Насколько я понимаю, каждый запрос ресурса/класса проходит через загрузчик WebAppClassloader, который смотрит на вещи в следующем порядке...

И да и нет.

Да, именно это происходит, когда код веб-приложения (или что-то еще) пытается найти ресурс через загрузчик классов, используя Class.getResource или аналогичный.

Но это НЕ то, что происходит, когда вы просто отправляете запрос GET в свое веб-приложение. Запрос GET вообще не задействует загрузчик классов. Скорее, он должен обрабатываться сервлетом; например тот, который вы написали сами, тот, который был сгенерирован из JSP, или сервлет "по умолчанию"... который можно использовать для обслуживания файлов содержимого.

Предполагая, что вы хотите обслуживать файл свойств, расположенный через загрузчик классов, метод doRequest или doGet вашего сервлета должен:

  • найти ресурс и открыть его как входной поток,
  • открыть поток вывода запроса
  • скопируйте входной поток в выходной поток, а затем
  • закрыть входной поток.

Если вы сделаете это, метод должен убедиться, что он обслуживает только те ресурсы, которые вам нужны. Было бы действительно плохой идеей разрешить клиенту извлекать любой ресурс, который может найти загрузчик классов.

person Stephen C    schedule 25.08.2014
comment
Я думал, что контейнер OOB будет использовать загрузчик классов для загрузки ресурсов. Но, судя по вашему объяснению, это не так. Тогда он просто пытается найти относительный путь к этому ресурсу в веб-архиве? А что касается загрузчика классов, чтобы его использовать, его нужно будет явно вызывать через сервлет/фильтр/и т.д. - person Victor; 26.08.2014