Как обрабатывать переводы строк в форме Struts, основанной на JavaScript - PullRequest
0 голосов
/ 17 декабря 2011

У меня есть форма Struts, которая содержит карту:

private Map<Long, String> questionAnswers = new TreeMap<Long, String>();

У меня есть нормальный метод получения и установки для этой переменной (здесь не показан), и у меня также есть методы получения и установки, необходимые для того, чтобы Strutsработа (используя String / Object):

public Object getQuestionAnswer(String questionId) {
    return getQuestionAnswers().get(questionId);
}

public void setQuestionAnswer(String questionId, Object answerText) {
    String answer = (answerText == null) ? "" : answerText.toString();
    getQuestionAnswers().put(Long.valueOf(questionId), answer);
}

В моем JSP я динамически генерирую текстовые области, которые используются для ввода значений для карты.Это все работает нормально.Однако, когда форма недействительна, мне нужно снова динамически генерировать текстовые области и помещать текст пользователя обратно в текстовые области.В настоящее время я снова заполняю текстовые области следующим образом:

<c:forEach items="${myForm.questionAnswers}" var="questionAnswer">
    var textareaBoxName = "questionAnswer(" + '${questionAnswer.key}' + ")";
    var textareaBox = document.getElementsByName(textareaBoxName)[0];
    if (textareaBox) {
        $('textarea[name=' + textareaBoxName + ']').val('${questionAnswer.value}');
    }
</c:forEach>

Это прекрасно работает, кроме случаев, когда вы вводите новую строку в текстовой области.Затем ошибка JavaScript жалуется на «неопределенную строковую константу».Я предполагаю, что вместо новой строки выполняются новые строки.

В методе setQuestionAnswer я включил некоторую отладку и обнаружил, что новая строка, введенная в текстовую область, читается как 2 символа, которые преобразованы вИнтенты 13 и 10 (которые, я считаю, \ r и \ n).Я попытался заменить "\ r \ n" просто "\ n" в методе setQuestionAnswer (используя метод String replaceAll), но произошла та же ошибка.Затем я попытался заменить "\ r \ n" на "% 0A" (который, я считаю, является новой строкой JavaScript).Хотя это и избавило от ошибки JavaScript, текстовые области теперь отображают «% 0A» вместо новой строки.Я безуспешно пробовал все виды побега и побега (заметьте, я также хочу сохранить специальные символы).

Кто-нибудь знает, как сохранить символы новой строки и специальные символы в полях текстовой области при недопустимых отправках?Мне это нужно для работы в IE.И я хотел бы избежать чего-либо хакерского, например, использовать какой-нибудь специальный символ / строку для «представления» новой строки, которую я затем заменяю в JavaScript и т. Д.

1 Ответ

1 голос
/ 17 декабря 2011

Поскольку $ {questionAnswer.value} помещается в литерал JavaScript String, вам нужно экранировать его, как если бы вы хотели новую строку в литерале JavaScript: строки Hello и World должны быть записаны как «Hello \ nWorld ». Посмотрите на метод commone-lang StringEscapeUtils escapeECMAScript. В дополнение к выходу из новой строки, он также избегает вкладок, апострофов и т. Д.

Сделайте этот метод методом EL и используйте его непосредственно в вашем JSP:

$('textarea[name=' + textareaBoxName + ']').val('${myFn:escapeJs(questionAnswer.value)}');

Вы можете также генерировать текстовые области статически вместо генерации их с помощью JavaScript:

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