У меня есть форма 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 и т. д.
setQuestionAnswer
(чтобы \r\n все еще оставался) и добавил метод EL с использованиемStringEscapeUtils.escapeJavaScript
. +1 Спасибо :) 17.12.2011