#java #url #wicket
#java #url #wicket
Вопрос:
Как я могу декомпозировать URL в Wicket? У меня есть следующий URL:
http://www.example.com[:8080]/context/wicket/[bookmarkable/]WICKET-RELATED-URL
|---------------------------|-------|----------------------------------------|
A B C
Я нашел способ получить полный URL-адрес (A, B, C):
RequestCycle.get().getUrlRenderer().renderFullUrl(
RequestCycle.get().getRequest().getUrl())
и способ получить только контекст (B):
RequestCycle.get().getRequest().getContextPath()
Есть ли аналогичный способ получить часть (A) URL-адреса? Или мне нужно работать с подстроками?
Комментарии:
1. Используйте регулярные выражения.
Ответ №1:
Не используйте регулярные выражения! 😉
Существует java.net.URL
объект, который анализирует URL-адрес и разрешает доступ к любой его части отдельно. Кроме того, вы можете объединить новый URL-адрес из частей и составить обратно строковую форму URL-адреса.
Зависит от того, что именно вы хотите в wicket, возможно, есть готовый к использованию метод, чтобы сделать это с помощью wicket. Вы рассказали не о своей проблеме, а только о вероятном решении.
Комментарии:
1. Спасибо за ваш совет. Да, я надеюсь, что есть готовый к использованию метод, который я еще не нашел. 😉 Что мне нужно сделать, так это: динамически генерировать ссылку на другое веб-приложение, которое находится на том же сервере. Я хочу использовать этот метод на разных серверах, поэтому попробуйте генерировать ist динамически. У меня есть решение, но я хочу найти более «чистое» решение.
2. Если вы создаете ссылку, я рекомендую вам создать специальный параметр для абсолютного URL-адреса для этого другого приложения, имя хоста, порт и т. Д. Из HTTP-запроса могут отличаться от того, что может получить пользователь. HTTP-сервер может скрываться за интерфейсным веб-сервером или брандмауэром. Более того, это делает веб-приложения менее гибкими, когда вы могли бы легко перемещать их по серверам. Если вы полностью уверены, что веб-приложения находятся в одном контейнере, просто используйте относительный URL как
/otherappctx/somepage.html
.
Ответ №2:
Вы могли бы использовать wicket RequestUtil.toAbsolutePath(String relativePagePath)
.
Согласно JavaDoc, он «вычисляет абсолютный путь к URL относительно другого абсолютного URL».
Я использовал его с помощью ‘urlFor ()’ для создания ссылок для отправки в письма, но пока вы можете определить относительный путь к своей цели, это должно быть вашим решением.
Ответ №3:
RequestCycle.get().getRequest().getUrl().get(Protocol|Host|Port)()
Комментарии:
1. Привет, спасибо за ваш совет. Вызов этих методов возвращает только
null
значения… :-(Из-за относительного URL?String url = RequestCycle.get().getRequest().getUrl().toAbsoluteString();
Строка url содержит/?0-1.ILinkListener-header-logout-logout
какие-либо идеи? Спасибо.
Ответ №4:
Регулярные выражения могут соответствовать вашим требованиям
Комментарии:
1. Регулярные выражения сделают свою работу! Но если есть решение с использованием метода wicket, я предпочту это.
2. Никогда не используйте регулярные выражения для анализа URL-адресов. По крайней мере, не в Java, для этого есть надлежащие библиотечные методы.
3. Регулярные выражения не должны использоваться, когда есть библиотечные методы для архивирования того же (а они есть).
4. @Andrey Atapin: Ну, во-первых, есть
java.net.URL
класс, который делает это за вас. Дублирование встроенной функциональности никогда не является хорошей идеей. Другая причина заключается в том, что, без обид, но вы, вероятно, ошибаетесь. (Не только вы, я уверен, что я бы тоже ошибся.) Спецификация URL может быть довольно сложной, и многие самодельные анализаторы регулярных выражений, которые я видел, не покрывали ее полностью. Конечно, можно попробовать это в качестве упражнения или в домашнем проекте, но в производственном коде проще и безопаснее использовать встроенный класс.