我的java webapp从textarea中提取内容,并通过电子邮件发送内容。
我面临的问题是,使用
读取相同内容时,textarea消息中的换行符不会被保留request.getParameter("message");
有什么线索可以解决?
TIA。
EDIT:
textarea中的内容是:
ABCD
abcd
代码:
String message = request.getParameter("message");
System.out.println("index loc for message "+message+" using \\r\\n : "+message.indexOf("\r\n"));
System.out.println("index loc for message "+message+" using \\n : "+message.indexOf("\n"));
System.out.println("index loc for message "+message+" using \\r : "+message.indexOf("\r"));
System.out.println("index loc for message "+message+" using \\n\\r : "+message.indexOf("\n\r"));
输出:
使用\ r \ n:-1的消息asdfasdf的索引位置 使用\ n:-1的消息asdfasdf的索引位置 使用\ r:-1的消息asdfasdf的索引位置 使用\ n \ r:-1
的消息asdfasdf的索引位置
答案 0 :(得分:3)
这完全取决于你重新显示的方式。
听起来你正在用HTML重新显示它。 “原始”换行符不是HTML标记的一部分。在webbrowser中右键单击查看页面源。你会在所有地方看到换行符。通常在HTML标记之前和/或之后。
为了在HTML演示文稿中直观地显示换行符,您实际上应该使用<br>
标记。您可以按以下<br>
字符串替换换行符:
message = message.replace("\n", "<br>");
如果message
是一个用户控制的变量,这只对XSS attack holes敏感,因为你必须在JSP中没有转义它(即没有<c:out>
)才能获得<br>
{1}}要工作。因此,您需要事先确保message
变量为sanitized。
或者,您也可以在那里设置CSS white-space
属性,将消息重新显示到pre
。如果您想在行元素的上下文中包含行,请设置pre-wrap
。或者,如果您还要折叠空格和制表符,请设置pre-line
。
<div id="message"><c:out value="${message}" /></div>
#message {
white-space: pre-line;
}
这将显示预先格式化的文本(默认情况下为textarea)。
答案 1 :(得分:1)
两个可能的问题:
textarea中的文字是自动换行的,并没有任何换行符。
您使用getParameter()
获得的字符串包含换行符(\n
),但没有按许多电子邮件程序的预期返回(\r
)。
作为第一步,我尝试以您可以检查的方式转储检索到的String。例如,您可以写入文件并使用od
或十六进制编辑器查看该文件。
如果事实证明你只是缺少CR,你可以在字符串上做一些简单的基于正则表达式的替换来修复它。
答案 2 :(得分:1)
搜索ASCII码我发现新行的定义与常用\n
不同,而是定义为\r\n
。
问候。
答案 3 :(得分:1)
您需要encodeURIComponent()
才能在服务器端提交表单和decodeURIComponent()
。