<c:url>
не кодирует URI, как указано в его значении, а только параметры запроса URL, которые указываются вложенным <c:param>
.Статья IBM, на которую вы ссылались, также не говорит об обратном.Я думаю, что вы перепутали это с «перезаписью URL» (который по сути является не чем иным, как добавлением jsessionid всякий раз, когда это необходимо).
Чтобы удовлетворить ваши требования, лучше всего создать собственную функцию EL, которая делегирует URLEncoder#encode()
и изменяет результат в соответствии с правилами URI.
<a href="/user/${util:encodeURI(user.name)}">view profile</a>
с
public static String encodeURI(String value) throws UnsupportedEncodingException {
return URLEncoder.encode(value, "UTF-8")
.replace("+", "%20")
.replace("%21", "!")
.replace("%27", "'")
.replace("%28", "(")
.replace("%29", ")")
.replace("%7E", "~");
}
Во 2-й части этот ответ вы можете найтиосновной базовый пример того, как объявлять и регистрировать пользовательские функции EL.