Jsf 如何使元标记成为<;头>;部门?
我正在使用JSF2、GlassFish 3.1、PrimeFaces 2.x 我在IE9上遇到了奇怪的渲染问题。我应该能够通过插入以下内容强制IE9渲染为IE9: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标记必须
<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&v=2.2" />
<link type="text/css" rel="stylesheet" href="/orcf-webui/javax.faces.resource/wijmo/wijmo.css.jsf?ln=primefaces&v=2.2" />
<script type="text/javascript" src="/orcf-webui/javax.faces.resource/jquery/jquery.js.jsf?ln=primefaces&v=2.2"></script>
<script type="text/javascript" src="/orcf-webui/javax.faces.resource/jquery/ui/jquery-ui.js.jsf?ln=primefaces&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中注册它
为什么需要这样做
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”),它们是两个完全不同的东西,它们(在有限的情况下)都可以用于“引导/指导”浏览器做事情或不做事情。是的,其中一个将覆盖另一个。