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

How to handle newlines in a Struts form that relies on JavaScript

本文关键字:表单 处理 换行符 Struts 依赖 JavaScript      更新时间:2023-09-26

我有一个包含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中,我动态地生成用于输入映射值的文本区域。这一切都很好。但是,当表单无效时,我需要再次动态生成文本区域,并将用户文本放回文本区域。我现在重新填充文本区域,如下所示:

<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方法(使用字符串replaceAll方法)中将"'r'n"替换为"'n",但发生了同样的错误。然后我尝试将"'r'n"替换为"%0A"(我认为这是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生成它们: