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

如何在依赖JavaScript的Struts表单中处理换行符,java,javascript,jquery,jsp,struts,Java,Javascript,Jquery,Jsp,Struts,我有一个Struts表单,其中包含一个映射: private Map<Long, String> questionAnswers = new TreeMap<Long, String>(); 在我的JSP中,我动态生成用于输入地图值的textareas。这一切都很好。但是,当表单无效时,我需要再次动态生成textareas,并将用户文本放回textareas。我目前正在重新填充文本区域,如下所示: <c:forEach items="${myForm.questi

我有一个Struts表单,其中包含一个映射:

private Map<Long, String> questionAnswers = new TreeMap<Long, String>();
在我的JSP中,我动态生成用于输入地图值的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>

var textareaBoxName=“questionAnswer(“+”${questionAnswer.key}'+”);
var textareaBox=document.getElementsByName(textareaBoxName)[0];
如果(文本区域框){
$('textarea[name='+textareaBoxName+']').val('${questionAnswer.value}');
}
除非在文本区域中输入换行符,否则此操作正常。然后,JavaScript错误会抱怨“未终止的字符串常量”。我猜新词是在表演,而不是仅仅阅读

setQuestionAnswer
方法中,我进行了一些调试,发现在textarea中输入的换行符被读取为2个字符,转换为整数是13和10(我认为是\r和\n)。我尝试在
setQuestionAnswer
方法中将“\r\n”替换为“\n”(使用字符串
replaceAll
方法),但出现了相同的错误。然后,我尝试将“\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生成它们:


我删除了我的
setQuestionAnswer
方法中的转义(以便\r\n仍然保留),并使用
StringEscapeUtils.escapeJavaScript
添加了一个EL方法+1谢谢:)
$('textarea[name=' + textareaBoxName + ']').val('${myFn:escapeJs(questionAnswer.value)}');