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

时间:2011-12-16 20:24:04

标签: 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中,我动态生成用于输入地图值的textareas。这一切都很好。但是,当表单无效时,我需要再次动态生成textareas,并将用户文本放回textareas。我目前正在重新填充像这样的textareas:

<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>

这样可以正常工作,除非您在textarea中输入换行符。然后JavaScript错误抱怨“未终止的字符串常量”。我猜测正在执行换行而不是只读。

setQuestionAnswer方法中,我进行了一些调试,发现在textarea中输入的换行符被读为2个字符,转换为整数是13和10(我相信是\ r和\ N)。我尝试用setQuestionAnswer方法中的“\ n”替换“\ r \ n”(使用字符串replaceAll方法),但发生了同样的错误。然后我尝试将“\ r \ n”替换为“%0A”(我认为是JavaScript换行符)。虽然这消除了JavaScript错误,但textareas现在显示“%0A”而不是换行符。我尝试了各种逃避和失败的运气(注意,我也希望保留特殊字符)。

有没有人知道如何在无效提交的textarea框中保留换行符和特殊字符?我需要这个在IE中工作。我想避免使用一些特殊的字符/字符串来“代表”我在JavaScript中替换的新行等等。

1 个答案:

答案 0 :(得分:1)

由于$ {questionAnswer.value}放在JavaScript String文字中,你需要像在JavaScript文字中想要换行一样转义它:Hello和World必须写成'Hello \ nWorld ”。看看commons-lang StringEscapeUtils的escapeECMAScript方法。在逃避换行的过程中,它也会逃避标签,撇号等。

将此方法设为EL方法,并将其直接用于JSP:

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

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