Jsf 如何使元标记成为<;头>;部门?

Jsf 如何使元标记成为<;头>;部门?,jsf,internet-explorer-9,primefaces,mojarra,Jsf,Internet Explorer 9,Primefaces,Mojarra,我正在使用JSF2、GlassFish 3.1、PrimeFaces 2.x 我在IE9上遇到了奇怪的渲染问题。我应该能够通过插入以下内容强制IE9渲染为IE9: <html> <head> <!-- Enable IE9 Standards mode --> <meta http-equiv="X-UA-Compatible" content="IE=9" /> ... ... 但问题是,它不起作用,因为(我被告知)meta标记必须

我正在使用JSF2、GlassFish 3.1、PrimeFaces 2.x

我在IE9上遇到了奇怪的渲染问题。我应该能够通过插入以下内容强制IE9渲染为IE9:

<html>
<head>
  <!-- Enable IE9 Standards mode -->
  <meta http-equiv="X-UA-Compatible" content="IE=9" />
...

...
但问题是,它不起作用,因为(我被告知)meta标记必须是部分中的第一个标记

当我在XHTML文件中执行此操作时

<html ...>

<f:view contentType="text/html" locale="#{loginHandler.currentLocale}">

<h:head>
    <!-- Enable IE9 Standards mode -->
    <meta http-equiv="X-UA-Compatible" content="IE=9" />

生成的HTML如下所示,其中JSF/PrimeFaces在我的新meta标记之前插入了一堆“link”和“script”标记

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<link type="text/css" rel="stylesheet" href="/orcf-webui/javax.faces.resource/jquery/ui/jquery-ui.css.jsf?ln=primefaces&amp;v=2.2" />
<link type="text/css" rel="stylesheet" href="/orcf-webui/javax.faces.resource/wijmo/wijmo.css.jsf?ln=primefaces&amp;v=2.2" />
<script type="text/javascript" src="/orcf-webui/javax.faces.resource/jquery/jquery.js.jsf?ln=primefaces&amp;v=2.2"></script>
<script type="text/javascript" src="/orcf-webui/javax.faces.resource/jquery/ui/jquery-ui.js.jsf?ln=primefaces&amp;v=2.2"></script>
<!-- Enable IE9 Standards mode -->
<meta http-equiv="X-UA-Compatible" content="IE=9" />


有没有办法把我的meta标签放在正确的位置,这样它就可以工作了?(或者是另一种解决IE9问题的方法?

您可能希望从Mojarra切换到MyFaces。查看源代码-首先呈现元素的内容,然后是其他资源。Mojarra可能正以其他方式进行此操作。如果不想切换JSF实现,您可以实现自己的HEAD元素渲染器

不过,我建议您找出IE9在没有X-UA-Compatible meta标记的情况下无法工作的原因。它应该使较新版本的行为与较旧版本类似。

您可以创建添加标题的新版本:

X-UA-Compatible: IE=9
响应对象


我认为最好的解决方案是创建JSF PhaseListener,它将X-UA兼容头添加到HTTP响应中

public class UACompatibleHeaderPhaseListener implements PhaseListener {
    private static final long serialVersionUID = 1L;

    @Override
    public PhaseId getPhaseId() {
        return PhaseId.RENDER_RESPONSE;
    }

    @Override
    public void beforePhase(PhaseEvent event) {
        final FacesContext facesContext = event.getFacesContext();
        final HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse();
        response.addHeader("X-UA-Compatible", "IE=edge");
    }

    @Override
    public void afterPhase(PhaseEvent event) {
    }

}
并在faces-config.xml中注册它

<faces-config xmlns="http://java.sun.com/xml/ns/javaee" version="2.0">
  <lifecycle>
    <phase-listener>com.example.UACompatibleHeaderPhaseListener</phase-listener>
  </lifecycle>
</faces-config>

com.example.UACompatibleHeaderPhaseListener
另一个选项是创建servlet过滤器并在web.xml中注册它

为什么需要这样做

  • 假设您的web应用程序部署在IE兼容性列表中的域(或子域)上:因此您需要使用X-UA-Compatible头将IE切换回最新模式

  • 假设您的web应用程序部署在WebLogic服务器(使用mojarra 2.0.4)上,因此无法更改JSF实现

  • meta标记必须在所有PrimeFaces内容之前

  • HTTP头和HTML头是完全不同的东西

  • 在PrimeFaces 3.0中,新的刻面添加到
    h:head
    : 因此,解决办法是:


  • 仅就您的答案和之前的评论发表评论:

    如果您在IE8上查看页面(如所示),HTTP标头和HTML标头并不是完全不同的东西(实际上)。如果您设置HTTP标头而不是HTML标头,则HTTP标头中的指令仍然会被考虑在内


    我不知道IE9是如何工作的,但我猜是以类似的方式。

    这是http头和html头部分之间的显著区别。我知道什么是http头和html头部分。在这个问题的上下文中,这些方法之间的区别是什么?我想我的解决方案是“解决IE9问题的替代方法"。这解释了优先顺序:@DanubianSailor只要HTTP头和HTML头之间只有一个X-UA兼容,这两种方法都应该有效,对吗?我认为,这也是一个误解。您正在添加HTTP头,它与HTML头部分完全不同。但是标记会覆盖HTTP头,所以这不会起作用。这对我帮助很大。非常感谢!它对我起了作用。但奇怪的是,与Chrome和Firefox的输出相比,它在某些地方看起来是相同的,在某些地方看起来是完全不同的。我将在deep.for“X-UA-Compatible”(和其他一些标题)中查看我的css定义您可以使用HTTP头或HTML“HTTP等价”头(请参阅“HTTP等价”)根据这篇文章,meta标记无论如何都必须在html头的开头,至少在任何javascripts之前,所以不管doctype如何,问题是头标记的顺序。您的解决方案使用PrimeFaces 3.0,但问题是PrimeFaces 2.x,其中不提供可定制的资源顺序。添加2)-不完全是-用于“X-UA-Compatible”(和一些其他标题)您可以使用HTTP标题或HTML“HTTP equiv”标题(请参阅“HTTP equiv”),它们是两个完全不同的东西,它们(在有限的情况下)都可以用于“引导/指导”浏览器做事情或不做事情。是的,其中一个将覆盖另一个。