Декомпозиция URL с использованием Wicket

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