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

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


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


Ответы (4)


Это полностью зависит от того, как вы его повторно отображаете.

Похоже, вы повторно отображаете его в 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;
}

Это отобразит предварительно отформатированный текст (как текстовое поле по умолчанию).

person BalusC    schedule 15.07.2010
comment
Мы знаем, что он отправляет текст по электронной почте, но мы не знаем, как текст отображается после получения. Если он действительно отображается в виде HTML, то действительно предстоит проделать большую работу. Просто сохранение разрывов строк было бы лишь небольшой частью проблемы, поскольку пользователи могли бы злонамеренно или случайно ввести в текст всевозможные вредоносные теги. - person Carl Smotricz; 15.07.2010
comment
Хороший ответ. ты имеешь в виду replaceAll? - person mdma; 15.07.2010
comment
@mdma: Нет, конечно нет. Regex является излишним для простой замены char (s) char (s). - person BalusC; 15.07.2010
comment
@BalusC. Я не заметил, что replace() также принимает CharSequence, и он был там только с версии 1.5, поэтому у меня было всего 4 года или около того, чтобы заметить... ;-) - person mdma; 15.07.2010
comment
@mdma: К сожалению, это действительно один из наименее известных методов в String. Я даже когда-либо отрицал это здесь, в SO, потому что грустный придира думал, что это не скомпилируется! - person BalusC; 15.07.2010
comment
@balusc, что неудивительно, поскольку Google часто указывает вам на 1.4 javadocs, когда вы гуглите класс java, например. google.com/search?hl=en&q=java.util.hashmap< /а> - person Sean Patrick Floyd; 15.07.2010
comment
Я показываю это как обычный текст. - person James; 16.07.2010
comment
@BalusC: Во-первых, спасибо за приложенные усилия. Я попробовал код, и он работает отлично. Но в моей реальной реализации это не так. Может быть, потому что я отправляю параметры с помощью javascript? (Я использую ajax). - person James; 20.07.2010

Две возможные проблемы:

  • Текст в текстовом поле переносится по словам и на самом деле не имеет новых строк.

  • Строка, которую вы получаете с помощью getParameter(), содержит новые строки (\n), но не возвращает каретку (\r), как ожидается многими почтовыми программами.

В качестве первого шага я бы попытался сбросить полученную строку таким образом, чтобы вы могли это проверить. Например, вы можете записать файл и использовать od или шестнадцатеричный редактор для просмотра файла.

Если выяснится, что вам просто не хватает CR, вы можете выполнить простую замену строки на основе регулярных выражений, чтобы исправить это.

person Carl Smotricz    schedule 15.07.2010
comment
getParameter() определенно не содержит символов новой строки (\n). Поскольку строка, объединенная с ней и имеющая новые строки (\n), отображается правильно, но не сообщение, полученное из текстовой области. - person James; 16.07.2010
comment
Хм. Может КР? Мне трудно поверить, что браузер не отправил бы какой-либо признак конца строки. - person Carl Smotricz; 16.07.2010
comment
Браузер делает на самом деле. Когда я отображаю значение из javascript с помощью alert, оно отображает содержимое в соответствующих строках. - person James; 16.07.2010
comment
Хорошо, я сдаюсь. Единственный способ, который я вижу, чтобы решить вашу проблему, - это создать проект, чтобы дублировать некоторые из ваших действий, а это больше работы, чем я готов сделать. Надеюсь, вам или кому-то еще удастся прийти к яркому выводу, удачи! - person Carl Smotricz; 16.07.2010

Просматривая коды ASCII, я обнаружил, что новая строка определяется не как часто \n, а как \r\n.

С Уважением.

person Estuardolh    schedule 20.02.2013

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

person Anon    schedule 23.09.2013