Мое веб-приложение java извлекает содержимое из текстовой области и отправляет то же самое по электронной почте.
Проблема, с которой я сталкиваюсь, заключается в том, что символ новой строки в текстовом сообщении не сохраняется при чтении того же с помощью
request.getParameter("message");
Любые подсказки, как это можно решить?
ТИА.
EDIT:
Содержимое текстовой области:
abcd
abcd
КОД:
String message = request.getParameter("message");
System.out.println("index loc for message "+message+" using \\r\\n : "+message.indexOf("\r\n"));
System.out.println("index loc for message "+message+" using \\n : "+message.indexOf("\n"));
System.out.println("index loc for message "+message+" using \\r : "+message.indexOf("\r"));
System.out.println("index loc for message "+message+" using \\n\\r : "+message.indexOf("\n\r"));
ВЫВОД:
index loc для сообщения asdfasdf с использованием \r\n : -1
index loc для сообщения asdfasdf с использованием \n : -1
index loc для сообщения asdfasdf с использованием \r : -1
index loc для сообщения asdfasdf с использованием \n\r : -1
Ответ 1 · рейтинг 3 · BalusC
Это полностью зависит от того, как вы его повторно отображаете.
Похоже, вы повторно отображаете его в HTML. "Необработанные" новые строки не являются частью разметки HTML. Щелкните правой кнопкой мыши Просмотреть исходный код страницы в веб-браузере. Вы увидите разрывы строк повсюду. Обычно до и/или после тегов HTML.
Чтобы визуально отображать разрывы строк в HTML-презентации, вы должны использовать теги <br>. Вы можете заменить новые строки на <br> строк, как показано ниже:
message = message.replace("\n", "<br>");
Это чувствительно только к уязвимости для XSS-атак, если message является пользователем -управляемая переменная, потому что вы должны представить ее неэкранированной в JSP (т.е. без <c:out>), чтобы заставить <br> работать. Таким образом, вам необходимо убедиться, что переменная message имеет значение продезинфицировать заранее.
В качестве альтернативы вы также можете установить свойство CSS white-space там, где вы повторно отображаете сообщение, на pre. Если вы хотите переносить строки внутри контекста блочного элемента, установите pre-wrap. Или, если вы хотите также свернуть пробелы и вкладки, установите pre-line.
<div id="message"><c:out value="${message}" /></div>
#message {
white-space: pre-line;
}
Это отобразит предварительно отформатированный текст (как текстовое поле по умолчанию).
Ответ 2 · рейтинг 1 · Carl Smotricz
Две возможные проблемы:
Текст в текстовом поле переносится по словам и на самом деле не имеет новых строк.
Строка, которую вы получаете с помощью getParameter(), содержит новые строки (\n), но не возвращает каретку (\r), как ожидается многими почтовыми программами.
В качестве первого шага я бы попытался сбросить полученную строку таким образом, чтобы вы могли это проверить. Например, вы можете записать файл и использовать od или шестнадцатеричный редактор для просмотра файла.
Если выяснится, что вам просто не хватает CR, вы можете выполнить простую замену строки на основе регулярных выражений, чтобы исправить это.
Ответ 3 · рейтинг 1 · Estuardolh
Просматривая коды ASCII, я обнаружил, что новая строка определяется не как часто \n, а как \r\n.
С Уважением.