I thought that might be the problem. Thanks for confirming my vague
suspicion. This morning, I wrote my own filter based on FacesServlet. I am
pretty sure it would work if it weren't for limitations in myfaces code.
When I invoke javax.faces.lifecycle.Lifecycle.render(facesContext),
org.apache.myfaces.application.jsp.JspViewHandlerImpl.getServletMapping()
invokes org.apache.myfaces.webapp.webxml.WebXml.getFacesServletMappings(),
which adds servlet mapping entries from web.xml. The problem is, it checks
to see whether my JSP page is a FacesServlet. If it's not, the mapping does
not get added to the list. This is bullshit; I'm submitting a bug report,
and a request to provide a "FacesFilter" for use with precompiled web-apps.
We would probably also need some kind of context param to indicate that we
are using precompiled pages.
Has no one ever tried to precompile a MyFaces webapp? Is their a workaround
for this?
Lines 103-118 of WebXml:
if (FacesServlet.class.isAssignableFrom(servletClass))
{
List urlPatterns = (List)_servletMappings.get(servletName);
for (Iterator it2 = urlPatterns.iterator(); it2.hasNext(); )
{
String urlpattern = (String)it2.next();
_facesServletMappings.add(new ServletMapping(servletName,
servletClass,
urlpattern));
if (log.isTraceEnabled())
log.trace("adding mapping for servlet + " + servletName +
" urlpattern = " + urlpattern); }
}
else
{
if (log.isTraceEnabled()) log.trace("ignoring servlet + " +
servletName + " " + servletClass + " (no FacesServlet)");
}
Maybe we could change it to something like:
if (FacesServlet.class.isAssignableFrom(servletClass) || precompiling) {
where precompiling is a switch set by a context parm.
Regards,
John Schneider
On Wednesday 03 August 2005 05:03, Mathias Broekelmann wrote:
> It´s because the facesservlet doesn´t handle the request.
>
> You should be able to create a servlet filter which contains the code of
> the facesservlet to initialize the stuff and process the jsf request.
>
> Hope that´s helps a little bit.
>
> Regards,
> Mathias
>
> John Schneider schrieb:
> > I have set up precompilation of a myfaces web app according to the
> > instructions found at
> > http://jakarta.apache.org/tomcat/tomcat-5.5-doc/jasper-howto.html
> >
> > Precompilation completes successfully. There are no errors; only a
> > warning about not being able to initialize Log4J.
> >
> > Not precompiling things, everything works fine. However, when I
> > precompile, I get a NullPointerException when the servlet tries to render
> > the f:view. Please review the relevent information below, and help me
> > figure out what I am doing wrong!
> >
> > Thanks,
> >
> > John Schneider
> >
> >
> > ----- web.xml ------
> >
> > <?xml version="1.0" encoding="UTF-8"?>
> > <web-app version="2.4"
> > xmlns="http://java.sun.com/xml/ns/j2ee"
> > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> > xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
> > http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
> >
> > <servlet>
> > <servlet-name>org.apache.jsp.success_jsp</servlet-name>
> > <servlet-class>org.apache.jsp.success_jsp</servlet-class>
> > </servlet>
> > <servlet-mapping>
> > <servlet-name>org.apache.jsp.success_jsp</servlet-name>
> > <url-pattern>/success.jsf</url-pattern>
> > </servlet-mapping>
> > <context-param>
> > <param-name>javax.faces.CONFIG_FILES</param-name>
> >
> > <param-value>/WEB-INF/faces-config.xml,/WEB-INF/faces-managed-beans.xml,/
> >WEB-INF/faces-navigation.xml</param-value> </context-param>
> > <context-param>
> > <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
> > <param-value>server</param-value>
> > </context-param>
> > <!-- Listener, that does all the startup work (configuration, init).
> > --> <listener>
> >
> > <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</
> >listener-class> </listener>
> > </web-app>
> >
> >
> > ----- success.jsp ------
> >
> > <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
> > <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
> > <html>
> > <head>
> > <title>Success Page</title>
> > </head>
> > <body>
> > <f:view>
> > <h:outputText value="success"/>
> > </f:view>
> > </body>
> > </html>
> >
> >
> > ----- And here is the Error ------
> >
> > 15:20:26,099 INFO FacesConfigurator:226 - Reading standard config
> > org/apache/myfaces/resource/standard-faces-config.xml
> > 15:20:31,016 INFO FacesConfigurator:385 - Reading config
> > jar:file:/var/tmp/myfaces57459.jar!/META-INF/faces-config.xml
> > 15:20:34,835 INFO FacesConfigurator:385 - Reading config
> > jar:file:/var/tmp/myfaces57460.jar!/META-INF/faces-config.xml
> > 15:20:35,044 INFO FacesConfigurator:420 - Reading
> > config /WEB-INF/faces-config.xml
> > 15:20:35,124 INFO FacesConfigurator:420 - Reading
> > config /WEB-INF/faces-managed-beans.xml
> > 15:20:35,352 INFO FacesConfigurator:420 - Reading
> > config /WEB-INF/faces-navigation.xml
> > 15:20:35,511 INFO FacesConfigurator:435 - Reading
> > config /WEB-INF/faces-config.xml
> > 15:20:41,497 INFO StartupServletContextListener:122 - ServletContext
> > '/usr/local/jakarta-tomcat5.5/webapps/urban4life.com-0.1-dev/'
> > initialized. 15:21:38,933 ERROR success_jsp]:260 - Servlet.service() for
> > servlet org.apache.jsp.success_jsp threw exception
> > java.lang.NullPointerException
> > at
> > javax.faces.webapp.UIComponentTag.setupResponseWriter(UIComponentTag.java
> >:646) at
> > javax.faces.webapp.UIComponentTag.doStartTag(UIComponentTag.java:254)
> > at
> > org.apache.myfaces.taglib.core.ViewTag.doStartTag(ViewTag.java:90) at
> > org.apache.jsp.success_jsp._jspx_meth_f_view_0(success_jsp.java:79) at
> > org.apache.jsp.success_jsp._jspService(success_jsp.java:56) at
> > org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97) at
> > javax.servlet.http.HttpServlet.service(HttpServlet.java:802) at
> > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applicat
> >ionFilterChain.java:252) at
> > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilte
> >rChain.java:173) at
> > org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve
> >.java:213) at
> > org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve
> >.java:178) at
> > org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:
> >126) at
> > org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:
> >105) at
> > org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.j
> >ava:107) at
> > org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:14
> >8) at
> > org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856
> >) at
> > org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processCo
> >nnection(Http11Protocol.java:744) at
> > org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.
> >java:527) at
> > org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowe
> >rWorkerThread.java:80) at
> > org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.
> >java:684) at java.lang.Thread.run(Thread.java:595)