JSF2 and Facelets - java.io.FileNotFoundException
Asked Answered
C

1

5

My JSF 2 project structure is as follow:

root
...
   WebContent
      META-INF
      resources
         css
         images
         javascript
   templates
      commonLayout.xhtml
      footer.xhtml
      header.xhtml  
   views
      main
         index.xhtml
   WEB-INF
   index.jsp

I encounter this error when I tried to view my page at http://localhost/home/main/index.jsf:

java.io.FileNotFoundException
at org.apache.naming.resources.DirContextURLConnection.getInputStream(DirContextURLConnection.java:381)
at com.sun.faces.facelets.impl.DefaultFaceletCache._getLastModified(DefaultFaceletCache.java:161)
at com.sun.faces.facelets.impl.DefaultFaceletCache.access$000(DefaultFaceletCache.java:62)
at com.sun.faces.facelets.impl.DefaultFaceletCache$1.newInstance(DefaultFaceletCache.java:82)
at com.sun.faces.facelets.impl.DefaultFaceletCache$1.newInstance(DefaultFaceletCache.java:79)
at com.sun.faces.util.ExpiringConcurrentCache$1.call(ExpiringConcurrentCache.java:99)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at com.sun.faces.util.ExpiringConcurrentCache.get(ExpiringConcurrentCache.java:114)
at com.sun.faces.facelets.impl.DefaultFaceletCache.getFacelet(DefaultFaceletCache.java:119)
at com.sun.faces.facelets.impl.DefaultFaceletCache.getFacelet(DefaultFaceletCache.java:62)
at com.sun.faces.facelets.impl.DefaultFaceletFactory.getFacelet(DefaultFaceletFactory.java:248)
at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:366)
at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:346)
at com.sun.faces.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:199)
at com.sun.faces.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:155)
at com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:93)
at com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:82)
at com.sun.faces.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:152)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.buildView(FaceletViewHandlingStrategy.java:744)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:100)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:313)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:306)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:541)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:383)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:288)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)

The content of index.xhtml is:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">

<ui:composition template="templates/commonLayout.xhtml">
    <ui:define name="header">
        Add your header here or delete to use the default
    </ui:define>
    <ui:define name="content">
        Add your content here or delete to use the default
    </ui:define>
    <ui:define name="footer">
        Add your footer here or delete to use the default
    </ui:define>
</ui:composition>
</html>

I have been stuck on this issue for the last two days. Can anyone see what the problem is? I have no idea at all

Czardom answered 15/2, 2011 at 12:31 Comment(0)
H
7

Two things:

First, your project structure is incorrect. All web files have to go inside WebContent.

root
...
   WebContent
      META-INF
      resources
         css
         images
         javascript
      templates
         commonLayout.xhtml
         footer.xhtml
         header.xhtml  
      views
         main
            index.xhtml
      WEB-INF
      index.jsp

This would however have produced a 404 error rather than this exception. So I'll assume that it was just your carelessness during formulating the question.

Second, if the template path in ui:composition starts with /, then it is relative to the WebContent. But if it does not start with /, then it is relative to the current file. As you currently have, Facelets will attempt to load the template from /views/main/templates/commonLayout.xhtml which is indeed incorrect. So, fix your template path as follows:

<ui:composition template="/templates/commonLayout.xhtml">
Hydrocele answered 15/2, 2011 at 15:46 Comment(3)
@Hydrocele Thanks for the tip. I'm just a bit confused about this whole JSF 2 project setup. This link [link]coreservlets.com/JSF-Tutorial/jsf2/#Overview said that all web files have to go inside WebContent - same as what you said. Another link [link]mkyong.com/jsf2/jsf-2-templating-with-facelets-example have the web files outside of WebContent in their example download. Can you please point me to an authoritative website which would explain this point more clearly.Czardom
@Hydrocele Ignore my last comment as I can't delete it. Anyway, I think the code formatting above didn't come out right, but all my files ARE under the WebContent folder. Also, should the resources, templates, views folders go under WEB-INF as per requirement? Or, is it up to personal preference?Czardom
They're not outside WebContent. The folder is just named webapp. There is no spec about the folder name, the name "WebContent" is just specific to Eclipse. In the end, it are exactly those files which are deployed in webapp root folder of the servletcontainer. As to WEB-INF, the files in WEB-INF are not public accessible, but they are accessible by servlet API itself (requestdispatcher, include, etc).Hydrocele

© 2022 - 2024 — McMap. All rights reserved.