我有一个包含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中替换的新行等等。
答案 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生成它们: