Получение статических ресурсов веб-контекста для работы как с закладками, так и без закладок на страницах Wicket
В приложении Wicket 1.4 у меня есть несколько статических ресурсов CSS и JS под [project root]/WebContent/css
а также [project root]/WebContent/js
соответственно.
HTML-файлы моей калитки находятся в src/resources/fi/company/product/pages
с соответствующими классами Java в src/main/fi/company/product/pages
, (В результирующем файле WAR файлы HTML и свойств, разумеется, находятся в тех же местах, что и классы Java.)
HTML-файлы содержат ссылки на ресурсы, такие как:
<head>
<link rel="stylesheet" type="text/css" href="css/main.css"/>
<script type="text/javascript" src="js/calendar.js"></script>
</head>
Это прекрасно работает везде (или так мы думали до недавнего времени). NB: мой код Java вообще не ссылается на эти ресурсы.
Просмотр источника отображаемой страницы (URL которой, например, http://localhost:8080/report/42.4
или же http://localhost:8080/?wicket:interface=:6::::
), ссылка на ресурс выглядит так:
<link rel="stylesheet" type="text/css" href="../css/main.css"/>
Тем не менее, мы только что заметили, что когда приложение разворачивается где-то еще, кроме (Tomcat) root, ресурсы ломаются на страницах без закладок.
Другими словами, когда URL, например,
http://localhost:8080/foobar/?wicket:interface=:2::::
и страница ссылается на
<link rel="stylesheet" type="text/css" href="../css/main.css"/>
... браузер пытается извлечь ресурс по неверному URL
http://localhost:8080/css/main.css
Теперь, каков самый простой (но не хакерский) способ заставить эти статические ресурсы работать независимо от пути развертывания?
Я мог бы перейти на использование исключительно закладок (что потребовало бы изменения конструкторов страниц), но я полагаю, что в этом не должно быть необходимости...
Изменить: Похоже, я получил CSS-ресурсы, работающие (в большинстве мест) просто с помощью <wicket:link>
, как советовали в этом ответе:
<head>
<wicket:link>
<link rel="stylesheet" type="text/css" href="css/main.css"/>
</wicket:link>
</head>
Однако теперь ссылки на CSS ломаются на странице с URL-адресом, например http://localhost:8080/foobar/report/42.9
Wicket пытается сделать что-то странное с путем "css/main.css":
ERROR org.apache.wicket.RequestCycle - Can't instantiate page using constructor public fi.company.product.pages.ReportPage(org.apache.wicket.PageParameters) and argument 0 = "css" 1 = "main"
org.apache.wicket.WicketRuntimeException: Can't instantiate page using constructor public fi.company.product.pages.ReportPage(org.apache.wicket.PageParameters) and argument 0 = "css" 1 = "main"
at org.apache.wicket.session.DefaultPageFactory.createPage(DefaultPageFactory.java:212)
at org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:89)
at org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.newPage(BookmarkablePageRequestTarget.java:305)
Редактировать 2: На самом деле я не уверен, если <wicket:link>
это правильное решение здесь, так как эти файлы ресурсов не являются " ресурсами пути класса". Я предполагаю, что мой вопрос заключается в том, можете ли вы заставить это работать, все еще используя ресурсы веб-контекста (то есть, не делая эти ресурсы пути к классам)?
1 ответ
Правильно, я решил это, и решение оказалось очень удивительным.
Ранее я писал:
Любопытно, что без каких-либо изменений, кажется, я больше не могу воспроизвести проблему...
Это было не совсем верно, так как я сделал одно небольшое изменение (которое я считал несущественным): я удалил файл WebContent/index.jsp
который в нашем проекте был остатком, который не имел смысла.
Когда меня осенило, что это можно исправить, я провел еще несколько тестов, и действительно:
Чтобы статические ресурсы работали должным образом, у вас не должно быть index.html
или же index.jsp
файл в корневом каталоге веб-материалов (т. е. родительский каталог каталогов ресурсов CSS и JS), так как в некоторых случаях он разрывается ../
Рекомендации.
Вероятно, это даже не специфично для Wicket, но, возможно, это специфично для Tomcat- если кто-то знает больше, не стесняйтесь вмешиваться. Я сомневаюсь, поможет ли этот вопрос кому-нибудь еще, но тем не менее, рад, что он сработал!