【问题标题】:For some reason JSP documents output XML instead of HTML由于某种原因,JSP 文档输出 XML 而不是 HTML
【发布时间】:2010-01-15 21:08:12
【问题描述】:

好的,所以我正在尝试设置一个简单的 JSF 应用程序。我正在使用 NetBeans 6.8、Glassfishv3 和 Maven2。我做了一个这样的JSP文档:

<?xml version="1.0" encoding="utf-8"?>
<html xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html">
<f:view>
    <head>
        <title><h:outputText value="#{Welcome.title}"/></title>
    </head>
    <body>
        <h:outputText value="Welcome"/>
    </body>
</f:view>
</html>

问题是,如果我导航到此页面 (http://myHost/myApp/faces/welcome.jspx),它将作为 XML 文档返回,但填充了 ${Welcome.title} 值:

<?xml version="1.0" encoding="UTF-8"?>
<html><head><title>Gymix - Welcome</title></head><body>Welcome</body></html>

在 Internet Explorer 中,这看起来像是我打开了一个 XML 文档。在谷歌浏览器中,标题打印在欢迎文本旁边,而不是标题,页面的 URL 打印在选项卡上。

如果我将 JSP 文档更改为一个普通的 JSP 页面(taglibs 而不是 xmlns 等),它可以工作并且我会返回一个正确的页面。关于有什么问题的任何想法?谢谢!

编辑:遗憾的是,没有一个快速修复程序可以解决此问题,因此我将对此进行更多研究。顺便说一句,我的 pom.xml 具有 jsf-api 和 jsf-impl 依赖项,两者的版本都设置为 1.2_14

【问题讨论】:

    标签: java jsp jsf


    【解决方案1】:

    除了您需要设置正确的doctypecontent type 以便浏览器知道如何处理页面之外,您还应该摆脱老式的jspx 格式并使用@987654326 @ 格式以充分利用 Java EE 6 提供的 JSF 2.0 和 Facelets。

    给定的代码应改为:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:h="http://java.sun.com/jsf/html">
        <h:head>
            <title>#{welcome.title}</title>
        </h:head>
        <h:body>
            Welcome
        </h:body>
    </html>
    

    请注意,包含文档类型,JSF 2.0 / Facelets 将在&lt;h:head&gt; 组件的帮助下自动处理正确的内容类型。另请注意&lt;f:view&gt; 标签的缺失,这在 Facelets 中不再需要。

    您可能还需要重新配置您的 web 应用程序以利用 JSF 2.0 和 Facelets 的全部功能。要了解有关 JSF 2.0 和 Facelets 的更多信息,我强烈建议您访问Java EE 6 tutorial part II chapters 4-9

    祝你好运。

    更新: 根据comment of bobince:我要添加一个重要说明;确实,XML 声明(第一行)会弄乱某些网络浏览器的呈现模式(另请参阅上面的 doctype 链接后面的站点),但这肯定不是问题。 Facelets 在生成页面的 HTML 期间删除 XML 声明。 XML 声明很简单,因为 Facelets 需要首先使用基于 XML 的工具来解析页面。我们谈论的是基于组件的 MVC 框架和基于 XML 的模板技术,而不是普通的 HTML 页面;)

    【讨论】:

    • 嗯,NetBeans 无法识别 h:head 和 h:body。我是否可能使用旧版本的 jsf-impl 和 jsf-api (1.2_14)?
    • Glassfish v3 已经随 JSF 2.0 一起提供。您不需要自己包含任何库。只需遵循 Java EE 6 和 Netbeans 6.8 教程即可。
    【解决方案2】:

    我认为您需要输入有效的文档类型。

    这将低于您的 xml 声明:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    

    【讨论】:

    • 嗯,我试过了,但是 NetBeans 给我一个错误(无法打开文件或其他东西),看起来像是编译错误...
    【解决方案3】:

    您必须告诉浏览器您要发送什么。不过,我不确定如何在 JSP 中执行此操作,因此您必须自己弄清楚或等到比我更有知识的人告诉您。

    您必须发送 Content-Type HTTP 标头,表明您的文件是 text/html; charset=UTF-8

    Content-Type: text/html, charset=UTF-8

    【讨论】:

    • 哦,正如 Darren 所说,设置 doctype 也无妨。但是,如果您继续以 XML 格式发送页面,Internet Explorer 仍将无法打开页面。
    • 您可以根据请求的扩展名(.jspx)在 web.xml 中使用 元素设置内容类型
    • 您还想丢失&lt;?xml 声明,如果输出将触发 IE6-7 的 doctype 嗅探器,将其置于 Quirks 模式。 &lt;?xml version="1.0" encoding="utf-8"?&gt; 什么都不做,因为它们是 XML 文档的默认属性。
    • bobince 完全正确,但我要补充一点:Facelets 在呈现页面期间删除 XML 声明。 XML 声明就在那里,因为 Facelets 需要首先使用基于 XML 的工具来解析页面 :)
    猜你喜欢
    • 1970-01-01
    • 2014-03-17
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多