В веб-приложении я хочу создать «виртуальный каталог», который находится в каталоге WEB-INF. По сути, то, что я пытаюсь достичь, - это тот же эффект, что и создание мягкой ссылки в файловой системе, если приложение было запущено в разорванном виде. Я пытаюсь добиться этого как в (что наиболее важно), так и в веб-логике, а также (в идеальном мире) на пристани.
Мне известны конфигурации виртуальных каталогов, однако они не подходят для моих целей, поскольку я не хочу, чтобы контент обслуживался напрямую через URL-адрес (поэтому он живет в WEB-INF). Я не нашел ничего в документе конфигурации для причала или веб-логики, который, кажется, предоставляет аналогичную концепцию разрешения ресурсов (я пытался добавить «extraClassPath» к причалу, но это не увенчалось успехом). В качестве дополнительного фона приложения используют Spring MVC, а преобразователи представлений указывают на JSP в WEB-INF.
<bean id="myResolverBean"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:viewClass="org.springframework.web.servlet.view.JstlView"
p:prefix="/WEB-INF/foo/baz/" p:suffix=".jsp" />
После просмотра кода Spring я убежден, что он ничего не делает в отношении загрузки ресурсов, это контейнер (weblogic / jetty), который разрешает пути. Я также пробовал использовать URI файлов, но кажется, что контейнер всегда будет интерпретировать путь относительно корня контекста (т.е. абсолютных путей нет).
Итак, мой вопрос: можно ли для этого добавить какие-либо директивы конфигурации в web.xml, конфигурации сервера или конфигурацию Spring?
Неудивительно, что ответ на этот вопрос в weblogic - это виртуальный каталог. Директива обеспечивает как (что я считаю) стандартное поведение сопоставления URL-адреса с некоторым набором (обычно статических файлов) для обслуживания, но также действует как «виртуальная программная ссылка», когда путь находится в WEB-INF и по-прежнему обеспечивает желаемое поведение - выдачу 404, если вы делаете запрос в браузер для такого URL-адреса (я думаю, что я неправильно настроил что-то в первый раз, когда попробовал это). Таким образом, следующее приведет к желаемому поведению:
<virtual-directory-mapping>
<local-path>/absolute/path/outside/of/webapp</local-path>
<url-pattern>/WEB-INF/foo/*</url-pattern>
</virtual-directory-mapping>
Я также обнаружил аналогичную функциональность в Jetty. Это достигается путем указания нескольких «базовых ресурсов» в конфигурации. Там есть некоторая документация по причалу это дает объяснение и несколько примеров. Одна особенность (я вижу, что это как полезно, так и вредно в зависимости от ситуации) заключается в том, что структуры объединяются, поэтому у вас могут быть пути, которые конфликтуют, и они будут разрешены в порядке спецификации. Приведенный выше пример для причала:
<Set name="baseResource">
<New class="org.mortbay.resource.ResourceCollection">
<Arg>
<Array type="java.lang.String">
<Item>/path/to/normal/webapp</Item>
<Item>/absolute/path/outside/of/webapp</Item>
</Array>
</Arg>
</New>
</Set>
Уловка для обоих из них заключается в том, что структура каталогов должна быть воссоздана во внешних каталогах (т.е. она должна быть / absolute / path / outside / of / webapp / WEB-INF / foo) для правильной работы, насколько я могу там сказать Невозможно сопоставить один каталог с другим каталогом с произвольным именем.