【问题标题】:Why do I need to set content-type to html in this Java Servlet?为什么我需要在这个 Java Servlet 中将 content-type 设置为 html?
【发布时间】:2011-05-04 16:13:46
【问题描述】:
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
import java.util.Date;

public class HelloServlet extends HttpServlet
{
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException
    {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.println("<html><head><title>only for test</title></head><body>Hello, world!html version</body></html>");
        out.flush();
        out.close();
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException
    {
        doGet(request, response);
    }
}

如果我将内容类型设置为xhtml,那么网络浏览器将自动打开保存文件对话框。为什么会这样?

【问题讨论】:

  • 您是 XHTML 过度炒作的另一个受害者。将鼠标放在您放置在问题上的[xhtml] 标签上,直到出现一个弹出框,然后单击其中的 "info" 链接,并获得启发。只需使用text/html

标签: html servlets xhtml content-type


【解决方案1】:

首先,请注意,xhtml 的正确内容类型不是xhtmltext/xhtml,而是application/xhtml+xml

无论如何,您需要通过检查Accept HTTP 请求标头来检查用户代理是否可以实际接受此内容类型。根据the W3C recommendation

  1. 如果 Accept 标头明确包含 application/xhtml+xml(没有“q”参数或正“q”值),则使用该媒体类型交付文档。
  2. 如果 Accept 标头明确包含 text/html(没有“q”参数或正的“q”值),则使用该媒体类型交付文档。
  3. 如果接受标头包含“/”(一些用户代理用来表示他们将接受任何内容的约定),请使用text/html 传递文档。

【讨论】:

    【解决方案2】:

    text/xhtml 不是有效的内容类型,因此您的浏览器将不知道如何正确呈现它。

    对于 XHTML 1.0,内容类型应该是 text/html http://www.w3.org/TR/xhtml-media-types/#compatGuidelines(参见第 A.9 点)

    编辑:

    这是一个更好的链接,专门讨论 XHTML 及其各种允许的 Content-Type

    http://www.w3.org/International/articles/serving-xhtml/

    【讨论】:

    【解决方案3】:

    要么:

    1. 当您说 将内容类型设置为 xhtml 时,您的字面意思是 xhtmltext/xhtml — 在这种情况下,问题在于 XHTML 的内容类型是 application/xhtml+xml
    2. 您使用的是不支持 XHTML 的 Internet Explorer 8 或更低版本。 IE9 中正在添加支持,并且仅在您使用测试版时可用。

    【讨论】:

      【解决方案4】:

      这不是浏览器的基本功能吗?

      如果浏览器知道文件格式(如 html 或 xml 或 text ..),它将直接在浏览器上显示内容

      否则,它会尝试保存或使用其他应用程序打开

      【讨论】:

      • 浏览器“知道”基于Content-Type 标头。这就是这个问题的全部意义所在:)
      【解决方案5】:

      它的方法接受字符串参数并且不返回任何内容。

      response.setContentType("text/html");
      

      这里的“text”是类型,html是子类型。

      setContentType() 方法设置“正在传递的响应”的内容类型,当响应尚未发送过来时。 你可以对 css 说:

      response.setContentType("text/css");
      

      【讨论】:

        猜你喜欢
        • 2016-02-27
        • 2012-02-17
        • 2014-04-15
        • 1970-01-01
        • 2011-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-03
        相关资源
        最近更新 更多