Что может быть причиной проблемы
Учитывая ваш шаблон:
<#if myCase??>
value = ${user}
</#if>
Вывод, написанный Freemarker в HTML-режиме вывода, приводит к следующему:
value = AAA% BBB@DDD.COM
Freemarker не понимает, что (из вашего контекста) значение user
должно быть значением атрибута (присваивания).Вместо этого он обрабатывает содержимое строки user
как сам HTML (это может быть полный HTML-источник как поле ввода, отдельные теги и т. Д.).Он просто вставляет содержимое модель в позицию в вашем шаблоне, где вы установили переменную-интерполяцию ${user}
.
Результат Freemarker не является допустимым HTML (атрибут-значениепара), потому что каждый атрибут должен придерживаться некоторых соглашений об именах (то есть без специальных символов).Если у атрибута есть значение, за ним следует знак равенства, за которым следует значение, заключенное в двойные кавычки.
Так что большинство браузеров преобразуют ваш результат в действительный атрибут HTML - фактически два атрибута: value="AAA%"
и BBB@CCC.com=""
.Открыв выходной HTML в Firefox, вы увидите это в Inspector (НЕ В сыром исходном представлении):
<input type="text" value="AAA%" bbb@ddd.com="">
Что не является причиной
FreeMarker автоматически экранируется (особенно в HTML-формате OutputMode), когда записывает окончательный HTML.
@ ddekany Спасибо за ваш комментарий !Это заставило меня воспроизвести и обнаружить настоящую причину.
Кодирование / декодирование URL
В Java вы даже можете кодировать строковую переменную user
.Таким образом, он преобразует %
(то есть знак процента , за которым следует пробел ) в %25+
, который является допустимым для использования внутри URL.
Run этот фрагмент java онлайн на IDEONE о последствиях кодирования и декодирования URL.
Решения
Используйте любое из этих решений, чтобы получить желаемый результат, исправив HTML-атрибутприсваивание значения в шаблоне:
(1) используйте двойные кавычки:
<#if myCase??>
value="${user}"
</#if>
(2) используйте некоторые встроенные модули для преобразования простого строкового вывода:
Используйте некоторые из встроенных модулей FreeMarker для строк.В вашем случае вы можете добавить ? Url к имени переменной и использовать двойные кавычки вокруг вашей интерполяции переменных в вашем шаблонеНапример:
<#if myCase??>
href="mailto:${user?url}"
</#if>
Внимание: как можно скорее проверьте URL-адрес или адрес электронной почты (даже его части).
BBB@DDD.COM
- действительный адрес электронной почты.Но %
и пробелы недопустимы внутри адреса электронной почты.
С другой стороны @
обычно не является частью URL, за исключением части внутри параметр запроса значение.Но ваш user
(URL) не начинается с http://
и т. Д.
Таким образом, в зависимости от варианта использования / цели вашего (так называемого URL) user
со значением AAA% BBB@DDD.COM
он может в конечном итогепредставляют собой часть URL-адреса или адреса электронной почты.
В вашем особом случае сказано:
заполнить поле формы относительно имени пользователя.Переменная модели user
не содержит действительного адреса электронной почты.Он используется вместе с системой псевдонимов , уже установленной заказчиком.Таким образом, псевдоним будет работать таким образом.
Предположим, что конечный пользователь, который позже редактирует поле формы, отвечает за то, чтобы сделать его действительным (или скрипт выполняет эту проверку).
В любом случае имейте в виду, что интернет-адрес (например, URL / электронная почта) нуждается в некоторой проверке :
- либо перед записью в окончательный HTML (используяJava или Freemarker)
- или после дальнейшей обработки внутри вашей веб-страницы (с использованием JavaScript).
В противном случае это может не дать желаемого эффекта.
См. Также
Смежные вопросы: