0

facelets ファイルをテンプレートにロードできません。

web.xml でウェルカム ページとして設定されている frontpage.xhtml というコンテンツ フェイスレットがあります。これにより、テンプレートが読み込まれます。テンプレートには、他の多くのファイルが含まれます。それらがロードされないとき、トラブルシューティングを試みるために、それを 1 つ (header.xhtml) に減らしました。テンプレートとフロントページ ファイルと同じディレクトリにヘッダー xhtml ファイルを配置しても、読み込まれません。

アプリが実行されると、テンプレート内で frontpage.xhtml が実行されます。これは、テンプレートに読み込まれた css の効果を見ることができるため、わかります。タイトル バーに「Hello World」と表示され、「Hello World!」と表示されます。ページに表示されます。ただし、ヘッダーは上部にロードされません。

テンプレート本体からもすべての div およびクラス情報を削除してみました。フェイスレットには何もありません。役に立ちませんでした。

誰かがここで洞察を提供できますか? たぶん私はベースから外れているかもしれませんが、テンプレートのコンテンツ領域にロードするさまざまな facelets を呼び出すことができるように、この方法でテンプレートを定義できると思いました。

このアプリは、テンプレートなしで正しく実行されます。つまり、すべてが 1 つのページにまとめられている場合です。これは、モジュール性のために回避しようとしています。

ディレクトリ構造 (Web ページのルートから開始)

/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>
4

2 に答える 2

1

OK、それは数字です。何時間もねじ込んで欲求不満を感じた後、私はスタックオーバーフローについて質問します。それから私は数時間立ち去ります。ジムに行き、リラックスして、戻ってきて、10分でそれを理解してください。

教科書(Core JSF 2.0)とは異なり、私はたくさんの挿入物と定義を削除し、それは機能しました。

たとえば、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>

だから今問題は、「挿入」と「定義」のポイントは何であるかということです。なぜなら、彼らがしているように見えたのは、物事を機能させないようにすることだけだからです。それはまた別の日です。

于 2012-07-03T23:48:14.447 に答える
1

問題は、 header.xhtml の追加の「define」エントリです<ui:define name="header">。通常、ui:define を使用してテンプレートの一部のコンテンツを置き換えますが、外側<ui:composition>にはテンプレートへの参照がないことに注意してください。したがって、テンプレートがない場合、Facelets はテンプレートを適用する場所を認識できず、最終的に内部コンテンツは使用されません。

于 2012-07-04T08:04:04.450 に答える