2010-09-27 114 views
8

我强烈需要覆盖JSF 2.0 Content-Type标题。默认情况下它是JSF,覆盖HTTP标头

Content-Type:application/xhtml+xml; charset=UTF-8 

但我需要

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

感谢。

回答

5

如何

<f:view contentType="text/html" /> 
+0

该解决方案是必要的工作与旧版本的iPhone和iPad。似乎稍后的浏览器会覆盖默认的Content-Type并进行最佳猜测。但是较老的浏览器都在考虑Content-Type标题并期待标题。很简单的解决方案。 – JeffJak 2012-12-13 22:38:52

6

使用right doctype

<!DOCTYPE html> 

没有更多。顶部也不要放<?xml?>声明。这是最小模板:

<!DOCTYPE html> 
<html 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets"> 
    <h:head> 
     <title>Insert your title</title> 
    </h:head> 
    <h:body> 
     <h1>Hello World</h1> 
    </h:body> 
</html> 

这是HTML5的文档类型。它与XHTML 1.x标记完全兼容,并增加了更多优势。

+0

删除了我不清楚的答案,并感谢您清除它。 – 2010-09-27 13:58:03

3

以下方法适用于所有的浏览器:

写的PhaseListener:

public class ContentTypePhaseListener implements PhaseListener { 


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

     public void afterPhase(PhaseEvent event) 
     { 
     } 

     public void beforePhase(PhaseEvent event) 
     { 
      FacesContext facesContext = event.getFacesContext(); 
      HttpServletResponse response = (HttpServletResponse) facesContext 
        .getExternalContext().getResponse(); 
      response.addHeader("Content-Type", "text/html; charset=UTF-8"); 

     } 
    } 

,并在faces-context.xml中进行注册:

<lifecycle> 
     <phase-listener>com.mycompnay.listener.ContentTypePhaseListener </phase-listener> 
    </lifecycle> 
+0

对于这个简单问题,“PhaseListener”是不是有点过于复杂的“解决方案”?无论如何,为什么不只是一个'Filter',因为你不会对'FacesContext'感兴趣? – BalusC 2010-09-27 12:55:23

+0

1.它可以在所有的浏览器中运行2.他可能在将来需要它 – Dejell 2010-09-27 12:59:05

+0

1.我不确定如何在'PhaseListener'而不是'Filter'内完成任务,网页浏览器。你能详细说明吗? 2.也许。 – BalusC 2010-09-27 13:05:34