Hi,

Just FYI: I opened JAVASERVERFACES_SPEC_PUBLIC-946 (see [1]) to
discuss your misinterpretation of #{resource['...']} with the JSF EG
in order to find a more convenient way to address this issue than the
custom method in the managed bean, because I think it is a "mistake"
many users make.

Regards,
Jakob

[1] http://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-946

2011/2/20 Jakob Korherr <[email protected]>:
> Hi,
>
> Resource resource = facesContext.getApplication().getResourceHandler()
>               .createResource("templateInClasspath.xhtml", "mytempl");
>
> exactly implements this functionality. It looks for
> templateInClasspath.xhtml in /mytempl and in
> /META-INF/resources/mytempl just like your tutorial says.
>
> Regards,
> Jakob
>
> 2011/2/19 Younes Ouadi <[email protected]>:
>> Hi Jakob,
>> Many thanks for your prompt reply. I really appreciate it.
>> I got your point. It is clear that I'm misusing the '#{resource['...']}'
>> mechanism.
>> Apart from your proposed solution, how I can instruct MyFaces to behave as
>> described in the JEE 6 Tutorial: 'The JavaServer Faces runtime will look for
>> the resources in the preceding listed locations, in that order (Web Context
>> then Classpath)'?
>> You might telling your self: what a lazy guy I'm dealing with. Please,
>> forgive me please, it is not my intention.
>> I was developing ZK application (v3.6) where I have developed a mechanism to
>> load resources from where I need. When I read this part of the Tutorial, I
>> said to my self: some code is there to avoid with JSF.
>> Many thanks for your valuable help.
>> Younes Ouadi
>>
>> On Sat, Feb 19, 2011 at 1:20 PM, Jakob Korherr <[email protected]>
>> wrote:
>>>
>>> Hi,
>>>
>>> That is all true. However, #{resource['...']} gives you a path like
>>> /context-root/faces/javax.faces.resource/resourceName.suffix, thus a
>>> URL for the browser. In <ui:composition template="..."> you need the
>>> path to the file on the server! And this is something else entirely!
>>>
>>> Regards,
>>> Jakob
>>>
>>> 2011/2/19 Younes Ouadi <[email protected]>:
>>> > Hi Jakob,
>>> > Many thanks for your prompt feedback.
>>> > In fact, I have understood from 'JEE 6 Tutorial' that JSF
>>> > implementations
>>> > are expected to manage templates like CSS and JS resources. Please refer
>>> > to
>>> > the bold parts of below section extracted from the Tutorial page 118:
>>> > Web resources are any software artifacts that the web application
>>> > requires
>>> > for proper rendering, including images, script files, and any
>>> > user-created
>>> > component libraries. Resources must be collected in a standard location,
>>> > which can be one of the following.
>>> > ■ A resource packaged in the web application root must be in a
>>> > subdirectory
>>> > of a resources directory at the web application root:
>>> > resources/resource-identifier.
>>> > ■ A resource packaged in the web application’s classpath must be in a
>>> > subdirectory of the META-INF/resources directory within a web
>>> > application: META-INF/resources/resource-identifier.
>>> > The JavaServer Faces runtime will look for the resources in the
>>> > preceding
>>> > listed locations, in that order.
>>> > Resource identifiers are unique strings that conform to the following
>>> >
>>> > format: [locale-prefix/][library-name/][library-version/]resource-name[/resource-version]. Elements
>>> > of the resource identifier in brackets ([]) are optional, indicating
>>> > that
>>> > only a resource-name, which is usually a file name, is a required
>>> > element.
>>> > Resources can be considered as a library location. Any artifact, such as
>>> > a
>>> > composite component or a template that is stored in the resources
>>> > directory,
>>> > becomes accessible to the other application components, which can use it
>>> > to
>>> > create a resource instance.
>>> > END OF JEE 6 TUTORIAL
>>> >
>>> > From the above, I was expecting that MyFaces would found my resource
>>> > 'templateInClasspath.xhtml'.
>>> > Anyway, I will use your proposed solution as a workaround for the time
>>> > being.
>>> > Warm regards.
>>> >
>>> > Younes Ouadi
>>> >
>>> > On Sat, Feb 19, 2011 at 12:12 PM, Jakob Korherr
>>> > <[email protected]>
>>> > wrote:
>>> >>
>>> >> Hi Younes,
>>> >>
>>> >> Unfortunately #resource['...'] does not work that way. You should only
>>> >> use it for getting the browser path to HTML resources like css or
>>> >> javascript files, e.g.:
>>> >>
>>> >> <link href="#resource['lib:style.css']" rel="stylesheet" />
>>> >>
>>> >>
>>> >> In your example you need to use Resource.getUrl() in a managed bean,
>>> >> so something like that:
>>> >>
>>> >> <ui:composition template="#{myBean.templatePath}">
>>> >>
>>> >>
>>> >> public String getTemplatePath()
>>> >> {
>>> >>        FacesContext facesContext = FacesContext.getCurrentInstance();
>>> >>
>>> >>        Resource resource =
>>> >> facesContext.getApplication().getResourceHandler()
>>> >>                .createResource("templateInClasspath.xhtml", "mytempl");
>>> >>        URL url = resource.getURL();
>>> >>
>>> >>        return url.toExternalForm();
>>> >> }
>>> >>
>>> >> I hope this helps.
>>> >>
>>> >> Regards,
>>> >> Jakob
>>> >>
>>> >>
>>> >> 2011/2/19 Younes Ouadi <[email protected]>:
>>> >> > Hello deras,
>>> >> >
>>> >> > I have a hands-on experience with JSF. I have been able to develop a
>>> >> > first
>>> >> > application. And I'm now in the stage of reorganizing it for a better
>>> >> > management. I'm trying to move 'templates' to classpath in order to
>>> >> > share
>>> >> > them in jar for different applications. But I'm stack there. Pages
>>> >> > that
>>> >> > reference that template are not rendered and MyFaces returns the
>>> >> > error
>>> >> > (see
>>> >> > below for full details of the error): java.io.FileNotFoundException:
>>> >> >
>>> >> >
>>> >> > /lab-jsf-rsrcmng/javax.faces.resource/templateInClasspath.xhtml.xhtml?ln=mytempl
>>> >> > Not Found in ExternalContext as a Resource
>>> >> >
>>> >> > Please help in pointing the missing part in my application.
>>> >> >
>>> >> > *1) Project:*
>>> >> > *1.1) Hierarchy*
>>> >> > lab-jsf-rsrcmng
>>> >> > *    pom.xml*
>>> >> >    src/main/webapp
>>> >> > *        home2.xhtml*
>>> >> >        WEB-INF
>>> >> > *            faces-config.xml*
>>> >> > *            web.xml*
>>> >> >    src/main/resources/META-INF/resources/mytempl
>>> >> > *        templateInClasspath.xhtml*
>>> >> > *
>>> >> > *
>>> >> > *1.2) pom.xml*
>>> >> > <project
>>> >> > xmlns="http://maven.apache.org/POM/4.0.0";
>>> >> > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
>>> >> > xsi:schemaLocation="
>>> >> > http://maven.apache.org/POM/4.0.0
>>> >> > http://maven.apache.org/xsd/maven-4.0.0.xsd
>>> >> > "
>>> >> >>
>>> >> > <modelVersion>4.0.0</modelVersion>
>>> >> >
>>> >> > <groupId>lab-jsf</groupId>
>>> >> > <artifactId>lab-jsf-rsrcmng</artifactId>
>>> >> > <packaging>war</packaging>
>>> >> > <version>0.0.1-SNAPSHOT</version>
>>> >> >
>>> >> > <name>LAB::JSF::RESOURCE MANAGEMENT</name>
>>> >> > <url>http://maven.apache.org</url>
>>> >> >
>>> >> > <properties>
>>> >> > <servlet.version>2.5</servlet.version>
>>> >> > <jsp.version>2.1</jsp.version>
>>> >> > <myfaces.version>2.0.3</myfaces.version>
>>> >> > </properties>
>>> >> >
>>> >> > <dependencies>
>>> >> > <dependency>
>>> >> > <groupId>javax.servlet</groupId>
>>> >> > <artifactId>servlet-api</artifactId>
>>> >> > <version>${servlet.version}</version>
>>> >> > <scope>provided</scope>
>>> >> > </dependency>
>>> >> > <dependency>
>>> >> > <groupId>javax.servlet.jsp</groupId>
>>> >> > <artifactId>jsp-api</artifactId>
>>> >> > <version>${jsp.version}</version>
>>> >> > <scope>provided</scope>
>>> >> > </dependency>
>>> >> > <dependency>
>>> >> > <groupId>org.apache.myfaces.core</groupId>
>>> >> > <artifactId>myfaces-api</artifactId>
>>> >> > <version>${myfaces.version}</version>
>>> >> > </dependency>
>>> >> > <dependency>
>>> >> > <groupId>org.apache.myfaces.core</groupId>
>>> >> > <artifactId>myfaces-impl</artifactId>
>>> >> > <version>${myfaces.version}</version>
>>> >> > </dependency>
>>> >> > <dependency>
>>> >> > <groupId>junit</groupId>
>>> >> > <artifactId>junit</artifactId>
>>> >> > <version>4.8.2</version>
>>> >> > <scope>test</scope>
>>> >> > </dependency>
>>> >> > </dependencies>
>>> >> >
>>> >> > <build>
>>> >> > <plugins>
>>> >> > <plugin>
>>> >> > <groupId>org.apache.maven.plugins</groupId>
>>> >> > <artifactId>maven-compiler-plugin</artifactId>
>>> >> > <version>2.0.2</version>
>>> >> > <configuration>
>>> >> > <source>1.5</source>
>>> >> > <target>1.5</target>
>>> >> > </configuration>
>>> >> > </plugin>
>>> >> > </plugins>
>>> >> > <finalName>${project.artifactId}</finalName>
>>> >> > </build>
>>> >> > </project>
>>> >> >
>>> >> > *1.3) home2.xhtml*
>>> >> > <?xml version="1.0" encoding="UTF-8"?>
>>> >> >
>>> >> > <!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:h="http://java.sun.com/jsf/html";
>>> >> > xmlns:ui="http://java.sun.com/jsf/facelets";
>>> >> >>
>>> >> > <h:body>
>>> >> > <ui:composition
>>> >> > template="#{resource['mytempl:templateInClasspath.xhtml']}">
>>> >> > </ui:composition>
>>> >> > </h:body>
>>> >> > </html>
>>> >> >
>>> >> >
>>> >> >
>>> >> > *1.4) faces-config.xml*
>>> >> > <?xml version="1.0" encoding="UTF-8"?>
>>> >> >
>>> >> > <faces-config
>>> >> > xmlns="http://java.sun.com/xml/ns/javaee";
>>> >> > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
>>> >> > xsi:schemaLocation="
>>> >> > http://java.sun.com/xml/ns/javaee
>>> >> > http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd
>>> >> > "
>>> >> > version="2.0"
>>> >> >>
>>> >> > </faces-config>
>>> >> >
>>> >> >
>>> >> > *1.5) web.xml:*
>>> >> > <?xml version="1.0" encoding="UTF-8"?>
>>> >> >
>>> >> > <web-app
>>> >> > version="2.5"
>>> >> > xmlns="http://java.sun.com/xml/ns/javaee";
>>> >> > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
>>> >> > xsi:schemaLocation="
>>> >> > http://java.sun.com/xml/ns/javaee
>>> >> > http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd
>>> >> > "
>>> >> >>
>>> >> > <display-name>lab-jsf-rsrcmng</display-name>
>>> >> > <session-config>
>>> >> > <session-timeout>30</session-timeout>
>>> >> > </session-config>
>>> >> > <welcome-file-list>
>>> >> > <welcome-file>home2.xhtml</welcome-file>
>>> >> > </welcome-file-list>
>>> >> > <servlet>
>>> >> > <servlet-name>Faces Servlet</servlet-name>
>>> >> > <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
>>> >> > <load-on-startup>1</load-on-startup>
>>> >> > </servlet>
>>> >> > <servlet-mapping>
>>> >> > <servlet-name>Faces Servlet</servlet-name>
>>> >> > <url-pattern>/faces/*</url-pattern>
>>> >> > <url-pattern>*.xhtml</url-pattern>
>>> >> > </servlet-mapping>
>>> >> > <context-param>
>>> >> > <description>
>>> >> > If true, a javascript function will be rendered that is able to
>>> >> > restore
>>> >> > the
>>> >> > former vertical scroll on every request. Convenient feature if you
>>> >> > have
>>> >> > pages
>>> >> > with long lists and you do not want the browser page to always jump
>>> >> > to
>>> >> > the
>>> >> > top
>>> >> > if you trigger a link or button action that stays on the same page.
>>> >> > Default is 'false'
>>> >> > </description>
>>> >> > <param-name>org.apache.myfaces.AUTO_SCROLL</param-name>
>>> >> > <param-value>true</param-value>
>>> >> > </context-param>
>>> >> > <context-param>
>>> >> > <param-name>org.apache.myfaces.USE_ENCRYPTION</param-name>
>>> >> > <param-value>false</param-value>
>>> >> > </context-param>
>>> >> > </web-app>
>>> >> >
>>> >> >
>>> >> > *1.6) templateInClasspath.xhtml*
>>> >> > <!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:c="http://java.sun.com/jsp/jstl/core";
>>> >> > xmlns:f="http://java.sun.com/jsf/core";
>>> >> > xmlns:h="http://java.sun.com/jsf/html";
>>> >> > xmlns:ui="http://java.sun.com/jsf/facelets";
>>> >> >>
>>> >> > <f:view contentType="text/html">
>>> >> > <h:head>
>>> >> > <title>LAB::JSF::RSRCMNG</title>
>>> >> > <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
>>> >> > </h:head>
>>> >> > <h:body styleClass="natisoft-body" >
>>> >> > <h:panelGrid columns="1">
>>> >> > <f:facet name="header">
>>> >> > <ui:insert name="header">Header</ui:insert>
>>> >> > </f:facet>
>>> >> >
>>> >> > <f:facet name="footer">
>>> >> > <ui:insert name="trailer">Trailer</ui:insert>
>>> >> > </f:facet>
>>> >> >
>>> >> > <h:panelGroup>
>>> >> > <ui:insert name="content">Content</ui:insert>
>>> >> > </h:panelGroup>
>>> >> > </h:panelGrid>
>>> >> > </h:body>
>>> >> > </f:view>
>>> >> > </html>
>>> >> >
>>> >> > *2) Error details*
>>> >> >
>>> >> > An Error Occurred:
>>> >> > java.io.FileNotFoundException:
>>> >> >
>>> >> >
>>> >> > /lab-jsf-rsrcmng/javax.faces.resource/templateInClasspath.xhtml.xhtml?ln=mytempl
>>> >> > Not Found in ExternalContext as a Resource
>>> >> >
>>> >> > Caused by:
>>> >> > java.io.FileNotFoundException -
>>> >> >
>>> >> >
>>> >> > /lab-jsf-rsrcmng/javax.faces.resource/templateInClasspath.xhtml.xhtml?ln=mytempl
>>> >> > Not Found in ExternalContext as a Resource
>>> >> > - Stack Trace <http://localhost:17080/lab-jsf-rsrcmng/home2.xhtml#>
>>> >> >
>>> >> > javax.faces.FacesException: java.io.FileNotFoundException:
>>> >> >
>>> >> >
>>> >> > /lab-jsf-rsrcmng/javax.faces.resource/templateInClasspath.xhtml.xhtml?ln=mytempl
>>> >> > Not Found in ExternalContext as a Resource
>>> >> >        at
>>> >> >
>>> >> > org.apache.myfaces.shared_impl.context.ExceptionHandlerImpl.wrap(ExceptionHandlerImpl.java:241)
>>> >> >        at
>>> >> >
>>> >> > org.apache.myfaces.shared_impl.context.ExceptionHandlerImpl.handle(ExceptionHandlerImpl.java:156)
>>> >> >        at
>>> >> >
>>> >> > org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:258)
>>> >> >        at
>>> >> > javax.faces.webapp.FacesServlet.service(FacesServlet.java:191)
>>> >> >        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:108)
>>> >> >        at
>>> >> >
>>> >> > org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:558)
>>> >> >        at
>>> >> >
>>> >> > org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
>>> >> >        at
>>> >> >
>>> >> > org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:379)
>>> >> >        at
>>> >> >
>>> >> > org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
>>> >> >        at
>>> >> >
>>> >> > org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:259)
>>> >> >        at
>>> >> >
>>> >> > org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:281)
>>> >> >        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:619)
>>> >> > Caused by: java.io.FileNotFoundException:
>>> >> >
>>> >> >
>>> >> > /lab-jsf-rsrcmng/javax.faces.resource/templateInClasspath.xhtml.xhtml?ln=mytempl
>>> >> > Not Found in ExternalContext as a Resource
>>> >> >        at
>>> >> >
>>> >> > org.apache.myfaces.view.facelets.impl.DefaultFaceletFactory.resolveURL(DefaultFaceletFactory.java:199)
>>> >> >        at
>>> >> >
>>> >> > org.apache.myfaces.view.facelets.impl.DefaultFacelet.getRelativePath(DefaultFacelet.java:289)
>>> >> >        at
>>> >> >
>>> >> > org.apache.myfaces.view.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:346)
>>> >> >        at
>>> >> >
>>> >> > org.apache.myfaces.view.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:215)
>>> >> >        at
>>> >> >
>>> >> > org.apache.myfaces.view.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:140)
>>> >> >        at
>>> >> >
>>> >> > org.apache.myfaces.view.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:57)
>>> >> >        at
>>> >> >
>>> >> > org.apache.myfaces.view.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:45)
>>> >> >        at
>>> >> >
>>> >> > org.apache.myfaces.view.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:143)
>>> >> >        at
>>> >> >
>>> >> > org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.buildView(FaceletViewDeclarationLanguage.java:329)
>>> >> >        at
>>> >> >
>>> >> > org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:66)
>>> >> >        at
>>> >> >
>>> >> > org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:239)
>>> >> >        ... 16 more
>>> >> >
>>> >> > - Component Tree
>>> >> > <http://localhost:17080/lab-jsf-rsrcmng/home2.xhtml#>
>>> >> > <UIViewRoot id="j_id0" inView="true" locale="en_US"
>>> >> > renderKitId="HTML_BASIC"
>>> >> > rendered="true" transient="false" viewId="/home2.xhtml"/> - State
>>> >> > size:548
>>> >> > bytes
>>> >> > - Scoped Variables
>>> >> > <http://localhost:17080/lab-jsf-rsrcmng/home2.xhtml#>
>>> >> > Request ParametersNameValue*None*Request
>>> >> > AttributesNameValue*None*View
>>> >> > AttributesNameValue*None*Flash AttributesNameValue*None*Application
>>> >> > AttributesNameValue*None*
>>> >> > Feb 19, 2011 9:52:09 AM - Generated by MyFaces - for information on
>>> >> > disabling or modifying this error-page, see Disabling error handling
>>> >> > in
>>> >> > MyFaces <http://wiki.apache.org/myfaces/Handling_Server_Errors>
>>> >> >
>>> >> > Thank you in advance
>>> >> >
>>> >> > Younes Ouadi
>>> >> >
>>> >>
>>> >>
>>> >>
>>> >> --
>>> >> Jakob Korherr
>>> >>
>>> >> blog: http://www.jakobk.com
>>> >> twitter: http://twitter.com/jakobkorherr
>>> >> work: http://www.irian.at
>>> >
>>> >
>>>
>>>
>>>
>>> --
>>> Jakob Korherr
>>>
>>> blog: http://www.jakobk.com
>>> twitter: http://twitter.com/jakobkorherr
>>> work: http://www.irian.at
>>
>>
>
>
>
> --
> Jakob Korherr
>
> blog: http://www.jakobk.com
> twitter: http://twitter.com/jakobkorherr
> work: http://www.irian.at
>



-- 
Jakob Korherr

blog: http://www.jakobk.com
twitter: http://twitter.com/jakobkorherr
work: http://www.irian.at

Reply via email to