JSF嵌套模板文件未找到异常

时间:2013-09-10 14:01:07

标签: templates jsf-2 path facelets

我在使用其中包含另一个嵌套模板的模板时遇到问题。

我得到了

 java.io.FileNotFoundException
at     org.apache.naming.resources.DirContextURLConnection.getInputStream(DirContextURLConnection.java:403)

我有这个基本模板:

(./resources/css/template.xhtml)
<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">

<h:head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <h:outputStylesheet library="css" name="stylesheet.css"/>
    <title><ui:insert name="title"> Facelets template </ui:insert></title>
</h:head>
<h:body>
    <div id="top" class="top_content">
       <ui:insert name="top">Top</ui:insert>
    </div>
    <div>            
    <div id="content" class="center_content">
        <ui:insert name="content">Content</ui:insert>
    </div>
    </div>        
</h:body>

和“继承”模板的templateLogin:

(./resources/css/templateLogin.xhtml)

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
template="./resources/css/template.xhtml">
        <ui:define name="title">
            Some title
        </ui:define>
        <ui:define name="top">
            <div id="top">
                   ...code here
             </div>
        </ui:define>
</ui:composition>

我有欢迎文件,这是使用templateLogin的Web应用程序的欢迎文件:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
            xmlns:ui="http://java.sun.com/jsf/facelets"
            xmlns:f="http://java.sun.com/jsf/core"
            xmlns:h="http://java.sun.com/jsf/html"
            template="./resources/css/templateLogin.xhtml">
<ui:define name="title">
    Welcome title
</ui:define>

正如我所说,我找不到文件异常。当我为欢迎文件定义模板template.xhtml时,没有错误。因为它没有在指定的路径中看到templateLogin.xhtml,但它在那里是定义的。

有什么想法吗?感谢。

3 个答案:

答案 0 :(得分:2)

摆脱模板路径中的前导期。前导期间使其相对于模板客户端的当前文件夹。如果模板路径以/开头,那么它将成为Web内容根目录的绝对路径。

因此,所以:

template="/resources/css/template.xhtml"

template="/resources/css/templateLogin.xhtml"

对具体问题

无关,这些路径有2个问题:

  1. 模板文件不是CSS文件。
  2. 模板文件不应公开访问。
  3. 将它们放在/WEB-INF文件夹中。 E.g。

    template="/WEB-INF/templates/layout.xhtml"
    

    template="/WEB-INF/templates/login.xhtml"
    

    另见:

答案 1 :(得分:0)

如果我查看你的代码,那么我会看到一些奇怪的事情。您的主模板位于 resources / css很好。但是,您的其他模板也位于/ resources / css

在你的包含中你说:

template="./resources/css/template.xhtml"

所以你建议它在/ resources / resources / css中,是的,文件不存在。

所以请你包括这个:

template="template.xhtml"

我不知道你的templateLogin.xhtml在哪里,但是这里也要注意你的include

答案 2 :(得分:0)

使用:

#{request.contextPath}/resources/css/default.css