Вы неправильно понимаете, что такое URL. ?p=2
- это строка запроса , а не относительный URL. (Вы также можете найти #foo
, который обычно называется идентификатором фрагмента или ссылка и чаще всего используется для перехода к разделу длинного документа). Полная схема для URI описана в Википедии среди многих других мест (вы также можете найти различия между URI и URL-адресами в разных местах).
В любом случае, относительные URL-адреса относятся только к части пути - это абсолютный или относительный путь. Если у вас есть строка запроса и вы хотите присоединить ее к существующему URL (у которого нет строки запроса), просто добавьте ее в строку. Если вы не знаете, есть ли у вас строка запроса, вы можете использовать методы класса URL для ее проверки.
Если вы хотите повторить действия браузеров, укажите полный URL-адрес url
и строку s
,
if (s.startsWith("?") || s.startsWith("#")) new java.net.URL(url.toString + s)
else new java.net.URL(url, s)
должен сделать трюк. (Я не знаю точный код, который используют разные браузеры, но это повторяет поведение, которое вы описываете при добавлении строки запроса, если это все, что предоставляется в href.) Если вы не знаете, могут ли ваши существующие URL-адреса есть строки запроса или нет, тогда вы можете
if (s.startsWith("#")) new java.net.URL(url.toString.takeWhile(_ != '#') + s)
else if (s.startsWith("?")) new java.net.URL(url.toString.takeWhile(_ != '?') + s)
else new java.net.URL(url, s)