Изменение контекста веб-приложения Tomcat - PullRequest
4 голосов
/ 14 января 2010

У меня есть веб-приложение, которое было разработано и всегда работало в корневом контексте ("/"). Таким образом, все css, js и ссылки начинаются с / (например, /css/style.css). Теперь мне нужно переместить это веб-приложение в другой контекст (скажем, /app1). Файл конфигурации server.xml можно легко изменить и запустить веб-приложение в новом контексте app1, используя элемент [Context path=""]. Но веб-страницы не работают, потому что все ссылки теперь некорректны. Они указывают на старый корневой контекст /css/style.css вместо нового app1 контекста. Есть ли волшебный способ исправить эту проблему, не исправляя каждую ссылку, используя префикс с некоторой переменной context? Используемый сервер - Tomcat 5. Приложение написано на Java и использует фильтры JSP, Struts2, Spring и UrlRewrite. Более интересно услышать реальный опыт борьбы с такими проблемами, что теоретические дебаты. Спасибо.

P.S. Я не вижу, как фильтр UrlRewrite может помочь мне, потому что он будет работать только в контексте app1. Поэтому запросы на ссылки типа /css/style.css не будут переданы ему.

Ответы [ 2 ]

3 голосов
/ 14 января 2010

Если вы используете перезапись URL для перенаправления ROOT в свое приложение, не исключит ли это возможность иметь приложение в ROOT? Если это так, что получается переключением контекста?

Я думаю, что общий способ связать ресурсы - это добавить переменную «context» и сделать ссылку абсолютной: ${pagecontext.request.contextpath}/css/style.css или просто сделать ссылку относительной: css/style.css

Если у вас нет особых причин для невозможности изменить код, я бы сделал поиск / замену ссылок и покончил бы с этим. У вас должно быть не более трех или четырех выражений для поиска, / css, / images, / javascript и т. Д.

2 голосов
/ 27 июля 2010

Вы должны всегда создавать URL через переписывание URL, не только для того, чтобы информация о сеансе могла быть добавлена ​​в URL, если требуется, но также и для того, чтобы можно было добавить путь к контексту.Вы должны создать все URL-адреса как абсолютные пути из верхней части приложения, а затем позволить перезаписи URL-адреса обрабатывать добавление контекстного пути в начало, в зависимости от ситуации.1005 * в файл jsp, если у них не включены файлы cookie.Вы также можете использовать тег c: url для рендеринга URL-адреса в переменную, а затем использовать эту переменную несколько раз по всему документу.Просто добавьте атрибут var="x" к тегу, а затем ${x} отобразит URL в вашем документе.Если вы не используете jsp для рендеринга вывода, вам нужно найти подходящий механизм для вашего слоя представления, но у всех будет один.Если вы отображаете URL в коде Java, просто посмотрите на исходный код тега c: url, и вы увидите, как это делается.

Одна неловкость заключается в том, что файлы CSS (и jsфайлы) не обрабатываются, поэтому URL в файлах css и js должны быть относительными путями, иначе они будут ломаться всякий раз, когда вы изменяете контекстный путь.Большинство js уже использует относительные пути, так как сопровождающие библиотеки не знают, по какому пути вы собираетесь устанавливать их библиотеку.С другой стороны, фоновые изображения CSS часто указываются как абсолютные URL, поскольку один и тот же файл CSS может быть включен в файлы html на разных уровнях файловой иерархии.Я не знаю простого решения этой проблемы, кроме создания соответствующих символических ссылок, чтобы относительный URL-адрес всегда работал или же обслуживал проблемные CSS-файлы через JSP, чтобы URL-адреса можно было переписать соответствующим образом.Я уверен, что, возможно, есть фильтры или модули apache, которые вы можете запустить, которые будут выполнять замену URL, но тогда вам все равно придется вручную обновлять свой фильтр / модуль всякий раз, когда вы развертываете по новому пути контекста.

...