ui:包括Facelets模板不包含的内容

时间:2012-07-03 19:56:41

标签: templates jsf-2 insert include facelets

我无法将facelets文件加载到模板中。

我有一个名为frontpage.xhtml的内容facelet,它被设置为web.xml中的欢迎页面。这会加载模板。然后,模板将包含许多其他文件。当他们不加载我把它削减到一个(header.xhtml)尝试进行故障排除。当我将标题xhtml文件放在与模板和首页文件相同的目录中时,它甚至不会加载。

运行应用程序时,frontpage.xhtml在模板内运行。我可以看到这个,因为我可以看到模板中加载的css的效果。我可以在标题栏中看到“Hello World”和“Hello World!”显示在页面中。但是标题没有加载到顶部。

我也尝试从模板主体中删除所有div和类信息。小面孔中没有。它没有帮助。

有人可以在这里提供一些见解吗?也许我不在基础,但我想我可以这样定义模板,这样我就可以调用加载到模板内容区域的不同facelets。

这款应用无需模板即可正常运行。即当所有内容都集中在一页时,我正试图摆脱模块化。

目录结构(从网页的根目录开始)

/frontpage.xhtml
/soulard_base_template.xhtml
/sections/base/header.xhtml

web.xml(我认为是相关部分)

<context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
</context-param>
<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>
</servlet-mapping>
<welcome-file-list>
    <!--<welcome-file>faces/welcome.xhtml</welcome-file>-->
    <welcome-file>faces/frontpage.xhtml</welcome-file>
</welcome-file-list>

frontpage.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:ui="http://java.sun.com/jsf/facelets">
  <body>
    <ui:composition template="soulard_base_template.xhtml">
      <ui:define name="windowTitle">
        Hello World
      </ui:define>
      <ui:define name="content">
        <h2>Hello World!</h2> 
      </ui:define>
    </ui:composition>
  </body>
</html>

soulard_base_template.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"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.org/ui">

  <h:head>
    <title><ui:insert name="windowTitle" /></title>
    <link href="${facesContext.externalContext.requestContextPath}/css/print.css" rel="stylesheet" type="text/css" media="print" />
    <link href="${facesContext.externalContext.requestContextPath}/css/screen.css" rel="stylesheet" type="text/css" media="screen, projection" />
    <!--[if lt IE 8]>
    <link href="${facesContext.externalContext.requestContextPath}/css/ie.css" rel="stylesheet" type="text/css" media="screen, projection" />
    <![endif]-->
    <link href="${facesContext.externalContext.requestContextPath}/css/soulardtheme.css" rel="stylesheet" type="text/css" media="screen, projection" />
    <link href="${facesContext.externalContext.requestContextPath}/css/soulard_base.css" rel="stylesheet" type="text/css" media="screen, projection" />

  </h:head>
  <h:body>
    <div class="container showgrid" title="Container">
      <div class="span-24" title="Banner">
        <ui:insert name="header">
          <ui:include src="sections/base/header.xhtml"/>
        </ui:insert>
      </div><!-- End of Banner -->

      <div class="span-16" title="Content Column">
        <ui:insert name="content" />
      </div><!-- End of Centre Column -->
    </div><!-- End of Container -->
  </h:body>

</html>

header.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:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html">
  <body>
    <ui:composition>
      <ui:define name="header">
        <h2>Header</h2>
        <h:graphicImage url="/images/header.png" 
                        width="950"
                        height="175"/>
      </ui:define>
    </ui:composition>
  </body>
</html>

2 个答案:

答案 0 :(得分:1)

好吧,它的数字。经过数小时的拧紧和挫折之后,我在stackoverflow上提出问题。然后我走了几个小时。去健身房,放松一下,10分钟后回来看看。

与教科书(Core JSF 2.0)不同,我删除了一堆插入和定义,并且它有效。

e.g。 header.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:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html">
  <body>
    <ui:composition>

      <h2>Header</h2>
      <h:graphicImage url="/images/williamrosmusdotcomHeader.png" 
                      width="950"
                      height="175"/>

    </ui:composition>
  </body>
</html>

,模板如下所示:

<?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"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.org/ui">

  <h:head>
    <title><ui:insert name="windowTitle" /></title>
    <link href="${facesContext.externalContext.requestContextPath}/css/print.css" rel="stylesheet" type="text/css" media="print" />
    <link href="${facesContext.externalContext.requestContextPath}/css/screen.css" rel="stylesheet" type="text/css" media="screen, projection" />
    <!--[if lt IE 8]>
    <link href="${facesContext.externalContext.requestContextPath}/css/ie.css" rel="stylesheet" type="text/css" media="screen, projection" />
    <![endif]-->
    <link href="${facesContext.externalContext.requestContextPath}/css/soulardtheme.css" rel="stylesheet" type="text/css" media="screen, projection" />
    <link href="${facesContext.externalContext.requestContextPath}/css/soulard_base.css" rel="stylesheet" type="text/css" media="screen, projection" />

  </h:head>
  <h:body>
    <div class="container showgrid" title="Container">
      <div class="span-24" title="Banner">
          <ui:include src="sections/base/header.xhtml"/>
      </div><!-- End of Banner -->

      <div class="span-24" title="Menu">
        <ui:include src="sections/base/menu.xhtml"/>
      </div><!-- End of Menu -->

      <div class="span-4" title="Left Column">
        <ui:include src="sections/base/leftsidebar.xhtml"/>
      </div><!-- End of Left Column -->

      <div class="span-16" title="Content Column">
        <ui:insert name="content" />
      </div><!-- End of Centre Column -->

      <div class="span-4 last" title="Right Column">
        <ui:include src="sections/base/rightsidebar.xhtml"/>
      </div><!-- End of Right Column -->


      <div title="Footer" class ="span-24">
        <ui:include src="sections/base/footer.xhtml"/>
      </div><!-- End of Footer -->


    </div><!-- End of Container -->
  </h:body>

</html>

所以现在的问题是,“插入”和“定义”有什么意义,因为他们似乎所做的就是让工作。那是另一天。

答案 1 :(得分:1)

问题是header.xhtml <ui:define name="header">中的附加“define”条目。您使用ui:通常定义来替换模板中的某些内容,但请注意外部<ui:composition>没有对模板的引用。因此,如果没有模板,facelets就不知道应用它的位置,最后内部内容永远不会被使用。