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

java jsp servlets

9386 просмотра

4 ответа

Мой java веб-приложение извлекает контент из текстовой области и отправляет по электронной почте то же самое.

Проблема, с которой я сталкиваюсь, заключается в том, что символ новой строки в сообщении textarea не сохраняется при чтении с использованием

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

Автор: James Источник Размещён: 12.11.2019 09:07

Ответы (4)


3 плюса

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

Похоже, что вы перерисовываете его в HTML. «Сырые» переводы строк не являются частью разметки HTML. Сделайте правый клик, View Source Source в веб-браузере. Вы увидите разрывы строк повсюду. Обычно до и / или после тегов HTML.

Чтобы визуально представить разрывы строк в HTML-презентации, вы должны использовать <br>теги. Вы можете заменить символы новой строки на <br>строки, как показано ниже:

message = message.replace("\n", "<br>");

Это чувствительно только к дырам в атаках XSS, если messageэто переменная, управляемая пользователем, потому что вы должны представить ее без экранирования в JSP (т.е. без <c:out>), чтобы приступить <br>к работе. Таким образом, вам необходимо убедиться, что messageпеременная очищена заранее.

Кроме того, вы также можете установить white-spaceсвойство CSS там, где вы переотображаете сообщение pre. Если вы хотите обернуть строки в контексте элемента блока, то установите pre-wrap. Или, если вы хотите также свернуть пробелы и табуляции, установите pre-line.

<div id="message"><c:out value="${message}" /></div>
#message {
    white-space: pre-line;
}

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

Автор: BalusC Размещён: 15.07.2010 12:39

1 плюс

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

  • Текст в текстовой области обернут в слово и на самом деле не имеет новых строк.

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

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

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

Автор: Carl Smotricz Размещён: 15.07.2010 12:39

1 плюс

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

С уважением.

Автор: Estuardolh Размещён: 20.02.2013 05:20

1 плюс

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

Автор: Anon Размещён: 23.09.2013 10:05
Вопросы из категории :
32x32