Проблемы с параметрами, связанными с пробелами - PullRequest
0 голосов
/ 28 февраля 2019

У меня следующая ситуация с Freemarker.

При возврате на страницу в .ftl я отправляю с Java параметр на URL-адрес, аналогично «AAA% BBB@DDD.COM» в Javaэто нормально.

При просмотре URL-адреса вместо этого пишите: «AAA%25+BBB@DDD.COM», а затем с помощью следующего кода:

<#if myCase??>
    value = ${user}
</#if>

Он пишетв моем html-поле "AAA%", но не в остальных.

Как я могу попытаться решить эту проблему?Заранее спасибо.

РЕДАКТИРОВАТЬ: После дальнейших исследований я вижу код, который я поставил перед, записать это в Html:

value="AAA%" BBB@CCC.com=""

EDIT2: Давайте посмотрим, если я могу дать вам большепрежде всего, вот соответствующий код Java:

Map mapping = new HashMap();
if(user != null && !user.isEmpty()){
 mapping.put("user",user); //EG: AAA% BBB@DDD.COM (Checked in debug)
}

У меня есть URL-адрес, похожий на: mysite.xx?user=AAA%25+BBB@DDD.COM, так что пользователь присоединяется в качестве параметра запросаURL-адреса.

Мне нужно повторно использовать параметр «user» для повторного заполнения поля Form относительно имени пользователя, я знаю, что это не действительный адрес электронной почты, но система псевдонимов, уже установленная клиентом, делаетсистема наложения имен таким образом.

1 Ответ

0 голосов
/ 28 февраля 2019

Что может быть причиной проблемы

Учитывая ваш шаблон:

<#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).

В противном случае это может не дать желаемого эффекта.

См. Также

Смежные вопросы:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...