2011-02-15 23 views
5

Mi estructura del proyecto JSF 2 es la siguiente:JSF2 y Facelets - java.io.FileNotFoundException

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

me encuentro con este error cuando intenté ver mi página en 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) 

El el contenido de index.xhtml es:

<!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> 

He estado atascado en este tema durante los últimos dos días. ¿Alguien puede ver cuál es el problema? No tengo idea en todo

Respuesta

7

dos cosas:

En primer lugar, la estructura de su proyecto es incorrecta. Todos los archivos web deben ir dentro de WebContent.

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

Sin embargo, esto habría producido un error 404 en lugar de esta excepción. Entonces asumiré que fue solo su descuido al formular la pregunta.

En segundo lugar, si la ruta template en ui:composition comienza con , entonces es relativa a WebContent. Pero si no comienza con /, entonces es relativo al archivo actual. Como actualmente tiene, Facelets intentará cargar la plantilla desde /views/main/templates/commonLayout.xhtml, que de hecho es incorrecta. Por lo tanto, corrija su ruta template de la siguiente manera:

<ui:composition template="/templates/commonLayout.xhtml"> 
+0

@BalusC Gracias por la sugerencia. Estoy un poco confundido acerca de la configuración de todo este proyecto JSF 2. Este enlace [link] http://www.coreservlets.com/JSF-Tutorial/jsf2/#Overview dice que todos los archivos web deben ir dentro de WebContent, igual que lo que usted dijo. Otro enlace [enlace] http://www.mkyong.com/jsf2/jsf-2-templating-with-facelets-example/ tiene los archivos web fuera de WebContent en su descarga de ejemplo. ¿Puede indicarme un sitio web autorizado que explique este punto más claramente? – ChuongPham

+0

@BalusC Ignora mi último comentario ya que no puedo borrarlo. De todos modos, creo que el formato del código anterior no salió bien, pero todos mis archivos ESTÁN en la carpeta WebContent. Además, ¿los recursos, plantillas, carpetas de vistas deben estar bajo WEB-INF según los requisitos? O, ¿depende de las preferencias personales? – ChuongPham

+0

No están fuera de WebContent. La carpeta simplemente se llama 'webapp'. No hay especificaciones sobre el nombre de la carpeta, el nombre "WebContent" es específico de Eclipse. Al final, son exactamente los archivos que se implementan en la carpeta raíz de la aplicación web del servletcontainer. En cuanto a WEB-INF, los archivos en WEB-INF no son de acceso público, pero son accesibles por la propia API de servlet (requestdispatcher, include, etc.). – BalusC

Cuestiones relacionadas