Ответ 1
RequestUtils.toAbsolutePath(RequestCycle.get().getRequest().
getRelativePathPrefixToWicketHandler());
работал у меня.
Если у меня есть относительный путь к статическому ресурсу (flash/blah.swf), что лучший способ программно преобразовать это в абсолютный URL (http://localhost/app/flash/blah.swf)? Или какой лучший способ получить базовый URL-адрес приложения Wicket? Я попытался использовать RequestUtils.toAbsolutePath, но он не работает надежно и часто бросает исключения. Это необходимо для работы на всех серверах, на которые развертывается приложение.
RequestUtils.toAbsolutePath(RequestCycle.get().getRequest().
getRelativePathPrefixToWicketHandler());
работал у меня.
Для калитки 6 это
String absoluteUrl = RequestCycle.get().getUrlRenderer().renderFullUrl(Url.parse("my-relative-url.html"));
Для Wicket 1.5 есть информация здесь
org.apache.wicket.protocol.http.servlet.ServletWebRequest
имеет метод getRelativePathPrefixToContextRoot()
(фактически определенный как абстрактный в суперклассе).
Стандартная идиома для ее использования
RequestCycle.get().getRequest().getRelativePathPrefixToContextRoot() + location;
В результате я использовал что-то вроде этого после добавления свойства base_url
в мой класс MyApplication
, который расширяет приложение калитки.
MyApplication app = (MyApplication)getApplication();
String appBaseUrl = app.getBaseUrl();
if (StringUtils.isEmpty(appBaseUrl)) {
appBaseUrl = RequestUtils.toAbsolutePath(urlFor(app.getHomePage(), new PageParameters()).toString());
app.setBaseUrl(appBaseUrl);
}
// Add base URL to <script wicket:id="base_url"></script> to use with Flash
add(new Label("base_url", "base_url = \"" + appBaseUrl + "\";").setEscapeModelStrings(false));