我有一个接受值列表的表单,每个值都列在textArea的单独行中。在我的Servlet中,我根据新的行字符“\ r \ n”来标记我从textArea接收到的字符串,如下所示:
String[] partNumberList = originalPartNumberString.split("\r\n");
这似乎工作正常。我按预期获得了一系列值。我相信这是因为浏览器处理标准化新行发送到服务器的方式,无论表单数据从哪个OS /浏览器发送(see this post)。我已经在IE,Firefox,Chrome中进行了测试......一切看起来都很好用,我对此非常有信心。
在服务器端接收到值后,我会将这些值用于某些查找等,然后我将它们写回textArea以获取响应。为了做到这一点,我正在以与我收到它相同的方式写回来...我只是构建一个新的String,并用“\ r \ n”分隔每个值。然后我将textArea的值设置为该String。
StringBuffer invalidReturnPartList = new StringBuffer("");
for (int i = 0; i < requestedPartList.length; i++)
{
invalidReturnPartList.append(requestedPartList[i]);
invalidReturnPartList.append("\r\n");
}
return invalidReturnPartList.toString();
在我尝试的所有浏览器中,这也适用于我。但是,我只是担心我是否覆盖了我的所有基础...如果有人在运行Mac,那么“\ r \ n”会在浏览器上正确翻译吗? Linux怎么样?我认为一切都会在浏览器中处理,但我不确定这里...所以我的问题是,这看起来对你来说,还是我错过了什么?
答案 0 :(得分:3)
我打算在这里回答我自己的问题。
由于textArea的值是表单数据,并且表单以内容类型“application / x-www-form-urlencoded”提交给服务器,因此新行将被浏览器转换为“CR LF”根据HTML规范提交到服务器(请参阅http://www.w3.org/MarkUp/html-spec/html-spec_8.html#SEC8.2.1)。
因此,在这种情况下,无论浏览器或操作系统如何,我的代码都应该始终如一。
但是,如果我试图在客户端实现相同的代码(比方说,使用JavaScript),也许在提交之前验证表单......这可能是一个不同的故事。由于此时表单数据尚未规范化,因此很可能取决于平台/浏览器用于新行的任何内容。在这种情况下,我可能不仅要检查“\ r \ n”,还要检查“\ r”和“\ n”。
答案 1 :(得分:2)
如果您查找HTTP协议定义,您会发现:
HTTP / 1.1定义了序列CR LF 作为所有的终点标记 协议元素除了 实体 - 体(见附录19.3) 宽容的申请)。该 一个内的行尾标记 entity-body由其定义 相关媒体类型,如中所述 第3.7节。
但这对身体无效。我假设您发送带有帖子请求的表单信息,因此我假设使用了内容类型text / plain,在这种情况下,我认为以下情况适用:
3.7.1规范化和文本默认值
注册了互联网媒体类型 以规范形式。一个
通过HTTP传输的实体主体 消息必须在
中表示 适当的规范形式 它的传输除了“文本” 类型,如下所述 段落。当以规范形式,媒体 “text”类型的子类型使用CRLF 作为文本行中断。 HTTP 放宽这个要求并允许 文本媒体的传输 单独的普通CR或LF表示 完成后换行 始终如一 实体主体。 HTTP应用程序必须 接受CRLF,裸CR和裸LF作为 代表一条线 通过HTTP收到的文本媒体中断。
这意味着,浏览器可以向您发送UNIX样式端线。