views:

71

answers:

3

Hi, I strongly need to override JSF 2.0 Content-Type header. Default it is

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

But I need

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

Thanks.

+1  A: 

How about

<f:view contentType="text/html" />
Vivien Barousse
+1  A: 

Use the right doctype.

<!DOCTYPE html>

Nothing more. Also don't put <?xml?> declaration at top. Here's a minimum template:

<!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"&gt;
    <h:head>
        <title>Insert your title</title>
    </h:head>
    <h:body>
        <h1>Hello World</h1>
    </h:body>
</html>

It's the HTML5 doctype. It's fully compatible with XHTML 1.x markup and adds more advantages.

BalusC
@BalusC deleted my unclear answer,and thanks for clearing it.
org.life.java
A: 

The following approach works in all the browsers:

Write a 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");

        }
    }

and register it in faces-context.xml:

<lifecycle>
        <phase-listener>com.mycompnay.listener.ContentTypePhaseListener </phase-listener>
    </lifecycle>
Odelya
Isn't a `PhaseListener` a bit too overcomplicated "solution" for this simple issue? Regardless of this, why not just a `Filter` since you won't have any interest in the `FacesContext`?
BalusC
1. it works in all the browser 2. He may need it in the future
Odelya
1. I am not sure how doing the job inside a `PhaseListener` instead of a `Filter` or just straight in the view is been detected by the webbrowser. Can you elaborate? 2. Maybe.
BalusC
From my experience - when I had to add No-Cache to Header in this way it worked in all the browsers. using f:view or other tricks didn't do it.
Odelya
That's correct for *particularly* the cache headers. But that concerns a different problem. Hints in [this answer](http://stackoverflow.com/questions/49547/making-sure-a-web-page-is-not-cached-across-all-browsers/2068407#2068407).
BalusC
it will not work well for Chrome
Odelya
I think you misunderstood the hints and/or core-problem-cause: HTTP response headers have precedence over HTML meta headers. When not explicitly set, the webserver will supply some default HTTP response headers which may cause that HTML meta headers on same name don't have any effect.
BalusC