在servlet中,通常我们会指定一个contentType,然后我们就可以打印出html代码了。
response.setContentType("text/html");
PrintWriter out = response.getWriter();
什么IF,我们没有指定contentType,任何contentType都会默认设置?我通过添加response.setContentType("text/html");
进行了测试,然后删除它,但我的网站能够呈现html?这是为什么?
答案 0 :(得分:8)
您的问题有两个不同的部分。让我分开回答一下
Content-Type
标头值如果我们没有指定
contentType
,那么任何contentType
都会被设置为默认值?
根据Javadoc判断ServletResponse#getContentType
返回用于此响应中发送的MIME正文的内容类型。 必须在提交响应之前使用
setContentType(java.lang.String)
指定适当的内容类型。如果未指定任何内容类型,则此方法返回null
。
就ServletResponse
而言,没有默认值。响应将不包含Content-Type
标头。
Java Servlet规范(版本2.4和版本3)明确指出Servlet容器不得定义默认内容类型。
这里摘录自Java Servlet 3.0 Specification - JSR-315,强调我的
Servlet程序员负责确保
Content-Type
标头 适当地设置servlet正在生成的内容的响应对象。该 HTTP 1.1规范不要求在HTTP响应中设置此标头。 Servlet容器在servlet程序员时不能设置默认内容类型 没有设置类型。
您是否能够观察到这一点取决于外部因素。可以有适当的servlet过滤器填充Content-Type
标头,您的机器和执行它的服务器之间可能有代理,但所有特定于给定应用程序或其部署方式的代理而不是由Servlet容器决定。
这可能因应用程序服务器不同甚至依赖于一段配置(您可以使用mime-mapping
in web.xml
指定扩展和内容类型之间的映射)
最重要的是,您可以通过多种方式在Java Web应用程序中设置Content-Type
标头,但就与Servlet API相关的而言,没有默认
Content-Type
标题的回复如果我们没有指定
contentType
,那么任何contentType
都会设置为默认值?我通过添加response.setContentType("text/html");
进行了测试,然后删除它,但我的网站能够呈现html?那是为什么?
如前所述,某些内容可能正在设置内容类型。但即使情况并非如此,您的网络浏览器也可以在大多数时间处理它。
当浏览器遇到缺少内容类型标题的响应时,他们只是尝试进行有根据的猜测。
Firefox,例如,uses a thing called the Unknown Decoder
此处what Internet Explorer/Edge does
不幸的是,我无法找到描述Chrome / Chromium行为的良好来源。