java - 如何在依赖 JavaScript 的 Struts 表单中处理换行符

标签 java javascript jquery jsp struts

我有一个包含 map 的 Struts 表单:

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

我有这个变量的普通 getter 和 setter(此处未显示),而且我还有 Struts 工作所需的 getter 和 setter(使用 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 中,我动态生成用于输入 map 值的文本区域。这一切工作正常。但是,当表单无效时,我需要再次动态生成文本区域,并将用户文本放回到文本区域中。我目前正在重新填充文本区域,如下所示:

<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)。我尝试在 setQuestionAnswer 方法中将“\r\n”替换为“\n”(使用 String replaceAll 方法),但出现了相同的错误。然后我尝试用“%0A”替换“\r\n”(我相信这是JavaScript换行符)。虽然这消除了 JavaScript 错误,但文本区域现在显示“%0A”而不是换行符。我尝试了各种转义和转义,但没有成功(注意,我还希望保留特殊字符)。

有人知道如何在无效提交时保留文本区域框中的换行符和特殊字符吗?我需要这个才能在 IE 中工作。我想避免任何黑客行为,比如使用一些特殊的字符/字符串来“表示”换行符,然后在 JavaScript 中替换它,等等。

最佳答案

由于 ${questionAnswer.value} 被放入 JavaScript 字符串文字中,因此您需要对其进行转义,就像您想要在 JavaScript 文字中添加换行符一样:Hello 和 World 行必须写为 'Hello\nWorld '。看看commons-lang StringEscapeUtils escapeECMAScript方法。除了转义换行符之外,它还会转义制表符、撇号等。

使该方法成为 EL 方法,并直接在 JSP 中使用它:

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

您还可以静态生成文本区域,而不是使用 JavaScript 生成它们:

关于java - 如何在依赖 JavaScript 的 Struts 表单中处理换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8539696/

相关文章:

jquery - 添加或删除动态内容时,jScrollPane 不会保持其位置 (jQuery)

java - 在适用于 Windows 的最新 IE、Chrome、FF 但不适用于 Safari 5.1.7 的表格上的最小宽度

java - 没有合适的构造函数发现扩展子类构造函数内部发生错误

java - Android - 获取键盘按键

javascript - 无法将值分配给 Angular 工厂内的变量?

jquery - 是否有办法禁用 JQuerymobile 库中选择元素的样式

java - 如何从 OResultSet 获取 JAVA 对象

javascript - 如何将 html 字符串(html 标签)显示为文本区域中的内容?

javascript - 使用 AJAX 更新从数据库(mysql)检索的数据

javascript - JQueryMobile 'not' 错误