The project I am currently working on uses Sitemesh with MyFaces, ie the pages being *decorated* are JSF and it works. However the templates themselves will need to be JSP only (not JSF) I believe; that's certainly what we do.

In order for a JSP page containing JSF tags to work correctly, the JSF FacesServlet must handle it. The FacesServlet sets up some JSF infrastructure on entry, then executes the JSP page (using ExternalContext.dispatch). When JSF-specific tags execute the necessary JSF infrastructure is therefore present. However on completion of the servlet that infrastructure is destroyed by the FacesServlet.

What the sitemesh *filter* does is initially pass the incoming request through without change so the primary "decorated" page is fetched, then it determines what decorator template to use and processes that *itself*. Sitemesh sets up the environment for its template to be correctly processed as jsp, but is not smart enough to set up the necessary environment for any JSF tags to execute successfully. And as described above the JSF-specific environment was set up on FacesServlet entry, but removed on FacesServlet exit so it is no longer available.

We work around that somewhat by defining a custom "proxyInclude" tag which uses commons-httpclient to make requests. This tag can then be embedded into a Sitemesh template to insert JSF-generated data (in particular, a common header including a JsCookMenu menubar).

Maybe the Sitemesh PageFilter could be improved to be JSF-aware but we haven't done that. Hmm..presumably the PageFilter does something like ExternalContext.dispatch to execute the jsp servlet for processing its template so maybe it's just as simple as ensuring the decorators file for Sitemesh uses ".jsf" urls rather than ".jsp" urls to its template files, in order to trigger the FacesServlet rather than just the jsp-handler servlet?

Regards,

Simon


Ricardo Tercero Lozano wrote:
As far as I know you cannot use JSF in Sitemesh decorators.

Ricardo.


On 2/26/07, *Garner Shawn* <[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>> wrote:

    I'm trying to use sitmesh with JSF and am getting the following
    exception:
    This is my template decorator page and has a f:view page.
    Is there something I have to do with this to initialize the
    FacesContext for the decorators/templates?


    javax.faces.FacesException: Faces context not found. getResponseWriter
    will fail. Check if the FacesServlet has been initialized at all in
    your web.xml configuration fileand if you are accessing your jsf-pages
    through the correct mapping. E.g.: if your FacesServlet is mapped to
    *.jsf (with the <servlet-mapping>-element), you need to access your
    pages as 'sample.jsf'. If you tried to access 'sample.jsp', you'd get
    this error-message.
           javax.faces.webapp.UIComponentTag.setupResponseWriter
    (UIComponentTag.java:926)
javax.faces.webapp.UIComponentTag.doStartTag(UIComponentTag.java:313) org.apache.myfaces.taglib.core.ViewTag.doStartTag(ViewTag.java:73) org.apache.jsp.decorators.andreasTemplate_jsp._jspx_meth_f_view_0
    (andreasTemplate_jsp.java:146)
org.apache.jsp.decorators.andreasTemplate_jsp._jspService(andreasTemplate_jsp.java:122) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
           javax.servlet.http.HttpServlet.service (HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
           org.apache.jasper.servlet.JspServlet.service
    (JspServlet.java:264)
           javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
com.age.j.soft.sitemesh.TemplateFilterImpl.applyDecorator(TemplateFilterImpl.java:49)
           com.opensymphony.module.sitemesh.filter.PageFilter.doFilter
    (PageFilter.java:62)
org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:144)



Reply via email to