Nano Hash - криптовалюты, майнинг, программирование

Как обрабатывать новые строки в форме Struts, основанной на JavaScript

У меня есть форма 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

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

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

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

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

16.12.2011
  • Я удалил экранирование в своем методе setQuestionAnswer (чтобы \r\n все еще оставался) и добавил метод EL с использованием StringEscapeUtils.escapeJavaScript. +1 Спасибо :) 17.12.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..