Получение статических ресурсов веб-контекста для работы как с закладками, так и без закладок на страницах 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- если кто-то знает больше, не стесняйтесь вмешиваться. Я сомневаюсь, поможет ли этот вопрос кому-нибудь еще, но тем не менее, рад, что он сработал!

Другие вопросы по тегам