Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Новая строка не сохраняется при чтении из Textarea

Автор вопроса: JamesОтветов: 4

Мое веб-приложение 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

  • вам просто нужно сделать encodeURIComponent($(#idOfTextArea)) в URL-адресе запроса в javascript и получить значение только по запросу.getParameter(textareaname) и сохранить в БД 23.12.2017

javaservletsjsp

Ответы

Ответ 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.

С Уважением.

Ответ 4 · рейтинг 1 · Anon

Вам нужно encodeURIComponent() перед отправкой формы и decodeURIComponent() на стороне сервера.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы