FreeMarkerチュートリアル


B/Sプログラミングでは、美工とプログラマーの2つの役割があり、彼らは異なる専門技能を持っています.美工は表現に専念しています.ページ、スタイル、レイアウト、効果などの可視要素を作成します.プログラマーは、プログラムのビジネスプロセスの作成、設計ページに表示されるデータの生成などに追われています.
多くの場合、表示する資料は設計時に存在しません.一般的には、実行時にプログラムによって生成されます.例えば、「800 NT以下のUSB Disk」クエリーの戻り結果を実行します.この技術の需要はJSPなどのScriptletを生んで、JSPは非常に強大で、しかしよく乱用されて、そしていくつかの不良な結果を招きます
  • は論理と表現を混合する.
  • は、米工とプログラマーの職責の正常な分解を破壊した.
  • JSPページの読み取りとメンテナンスを困難にします.

  • テンプレートエンジンは、上記の問題を解決するために発生します.HTMLを設計する際には、どのデータを挿入するかを指定するために特定のコマンドを追加し、特殊なコマンドを追加したHTMLや他のテキストをテンプレート(Template)と呼びます.テンプレートエンジンは、ページを出力するときに、これらのコードの代わりに適切なデータを使用します.
    テンプレートとJSPを埋め込むHTMLは異なり,テンプレート命令は限られたプログラミング能力しかなく,ビジネスロジックの混入を避けることができる.
    3万フィートでFreeMarkerを見下ろす
    簡単に言えば、FreeMarkerはJavaで作成されたテンプレートエンジンで、テンプレートに基づいて複数の仕様のテキストを出力します.特に、FreeMarkerは、Webアプリケーションフレームワークに関係なく、非Webアプリケーション環境にも適用可能であることが指摘されている.
    次にFreeMarkerのテンプレートを見てみましょう:(product.ftl)
    <html>
    <head>
     <title>Welcome!</title>
    </head>
    <body>
     <h1>Welcome ${user}!</h1>
     <p>Our latest product:
     <a href="${latestProduct.url}">${latestProduct.name}</a>!
    </body>
    </html>

    この例は、単純なHTMLに${...}で囲まれた特定のコードがいくつか組み込まれており、これらの特定のコードがFreeMarkerの命令である.
    user、latestProductについて.urlとlatestProduct.nameの具体的な内容はデータモデル(data model)から来ている.データモデルはプログラマがプログラミングして作成し、データベース、ファイル、さらにはプログラムで直接生成されるテンプレートに変化する情報を提供します.
    テンプレート設計者はデータがそこから来ることに関心を持たず、すでに構築されたデータモデルを使用することしか知らない.
    FMPP(FreeMarker PreProcessor)によるFreeMarkerの実行
    まず、FreeMarkerの動作はFMPPに依存しないことを説明する.FMPPはFreeMarkerの補助ツールにすぎません.これにより、Javaプログラミングを必要とせずに、FreeMarkerの出力結果を迅速にデバッグすることができます.これにより、アメリカのデザイナーのデバッグの難易度を大幅に軽減することができます.http://fmpp.sourceforge.net/から入手できます.
    Freemakerを使用する場合は、関連するプログラムをダウンロードする必要があります.
    freemarker: http://freemarker.sourceforge.net/
    ディスクに関連するフォルダを作成するには、次の手順に従います.
    D:/work/src/product.ftl
    D:/work/out/
    D:/work/data/product.tdd
    D:/work/config.fmpp

    使用するプロファイル(config.fmpp)は、次のように設定されています.
    sourceRoot: src
    outputRoot: out
    logFile: log.fmpp
    modes: [
     copy(common/**/*.*, resource/*.*)
     execute(*.ftl)
     ignore(templates/*.*, .project, **/*.xml, xml/*.*, *.js)
    ]
    replaceExtensions: [ftl, html]
    sourceEncoding: gb2312
    data: tdd(../data/product.tdd)

    注:「data:tdd(../data/product.tdd)」はテンプレートのデータソースを指定します.TDDはfmppでサポートされているデータフォーマットの1つです.TDDの説明についてはfmppドキュメントを参照してください.TDDも参照してください.product.tddの内容は次のとおりです.
    {
     user: "Big Joe"
     latestProduct: {url: "products/greenmouse.html", name: "Green Mouse"} 
    }

    今dosの下で実行します(FMPPがD:/FMPPの下にインストールされていると仮定します):
    D:/work/>D:/FMPP/bin/fmpp

    最後の出力結果は、ファイルout/productに格納.html:
    <html>
    <head>
      <title>Welcome!</title>
    </head>
    <body>
      <h1>Welcome Big Joe!</h1>
      <p>Our latest product:
      <a href="products/greenmouse.html">green mouse</a>!
    </body>
    </html>

    FreeMarkerドキュメントに記載されているように、FreeMarkerの動作原理は次のとおりです.
    テンプレート+データ=出力!
    FreeMarkerはhtmlの生成に限らずjavaコードを生成することもできます.これはテンプレートの設計方法に依存します.
    FMPPという強力なツールがあり、次にFreeMarkerの関連命令を迅速に学ぶことができます.let us go!
    FreeMarkerテンプレートで使用される3つの基本オブジェクトタイプ:Scalars、Hashes、Sequences.これらのオブジェクトタイプを説明する前に、データモデルを見てみましょう.
    典型的なデータモデルはツリー型構造であり、任意の深さの階層を持つことができます.たとえば、次のようになります.
    (root)
      |
      +- animals
      |   |
      |   +- mouse
      |   |   |   
      |   |   +- size = "small"
      |   |   |   
      |   |   +- price = 50
      |   |
      |   +- elephant
      |   |   |   
      |   |   +- size = "large"
      |   |   |   
      |   |   +- price = 5000
      |   |
      |   +- python
      |       |   
      |       +- size = "medium"
      |       |   
      |       +- price = 4999

    この木の各葉はFreeMarkerでScalarsと呼ばれ、単一の値を格納します.Scalarsが保存する値には、文字列(引用符で囲まれ、単一引用符または二重引用符で囲まれます)、数値(引用符で囲まないでください.これは文字列として処理されます)、日付、boolean値の2種類があります.scalarsへのアクセスはrootから開始し、各セクションで「.」を使用します.animalsなどの区切りmouse.price.
    ツリーの各ブランチには、「mouse」、「elephant」などの一意のクエリー名が関連付けられています.これらのブランチは、HashesのTDD定義参照の他のオブジェクト(size,price)のコンテナとして機能します.
    Sequencesの役割はHashesと同様に、変数名ではなく数値インデックスを使用する他のオブジェクトのコンテナとして機能することもできます.
    (root)
      |
      +- animals
      |   |
      |   +- (1st)
      |   |   |
      |   |   +- name = "mouse"
      |   |   |
      |   |   +- size = "small"
      |   |   |
      |   |   +- price = 50
      |   |
      |   +- (2nd)
      |   |   |
      |   |   +- name = "elephant"
      |   |   |
      |   |   +- size = "large"
      |   |   |
      |   |   +- price = 5000
      |   |
      |   +- (3rd)
      |       |
      |       +- name = "python"
      |       |
      |       +- size = "medium"
      |       |
      |       +- price = 4999

    animals[0]を通ることができる.nameは対応するScalarsにアクセスします.参照SequencesのTDD定義
    上記の3つのオブジェクトタイプの操作については、オブジェクトタイプのさまざまな操作を参照してください.
    テンプレートと命令
    関連するテキストに加えて、FreeMarkerテンプレートには、次の3つの特定の部分が含まれます.
  • ${...}:補間(interpolations)と呼ばれ、FreeMarkerは出力時に実際の値で置き換えられます.
  • 命令:FreeMarkerタグとも呼ばれ、HTMLタグと似ていますが、#で始まります(@で始まる場合もありますが、後述します).
  • 注記:(ではなく)の間に含まれるテキスト.

  • せいぎょめいれい
    if命令
    if命令はほとんどのプログラム言語と同様に<#else if.>,余計なことは言わない.
    <#if animals.python.price < animals.elephant.price>
      Pythons are cheaper than elephants today.
    <#else>
      Pythons are not cheaper than elephants today.
    </#if>

    リストめいれい
    リストコマンドは、Sequences内の各要素を巡回します.List命令には、2つの隠れた特殊変数があります.
  • item_indexこの変数は、Sequences内の要素のインデックス値を返します.
  • item_has_nextこの変数はboolean型でありfalseはこの要素がSequencesの最後の要素であることを示している.
  • <p>We have these animals:
    <table border=1>
      <tr><th>Id<th>Name<th>Price
      <#list animals as being>
      <tr><td>${being_index+1}<td>${being.name}<td>${being.price} Euros
      </#list>
    </table>

    上のテンプレートは3種類の動物の名前と価格を順番に印刷することができます.being_indexとbeing_has_nextはその特殊な変数です.
    リストサイクルは<#break>コマンドで早期に終了できます.
    switch命令
    他の言語のswitch文と似ています.
    <#switch being.size>
      <#case "small">
         This will be processed if it is small
         <#break>
      <#case "medium">
         This will be processed if it is medium
         <#break>
      <#case "large">
         This will be processed if it is large
         <#break>
      <#default>
         This will be processed if it is neither
    </#switch>

    注意事項
  • FTLは大文字と小文字を区別するので、listは正しいFTL命令であり、Listはではない.${name}と${NAME}は異なる
  • Interpolationはテキストでのみ
  • を使用できます.
  • FTLタグは、別のFTLタグの内部に配置できません.
  • 注記は、FTLタグおよびInterpolationの内部にあってもよい.
  • 余分な空白文字はテンプレート出力時に
  • を削除します.
  • 使用可能[#if...]代わりに<#if..>、HTMLタグの混同を避ける.