1。概要
Freemarkerはテンプレートエンジンであり、テンプレートに基づいてテキスト出力を生成するための一般的なツールです。純粋なジャワで書かれています。 Freemarkerは、特にMVCパターンに基づいたHTML Webページ、特にアプリケーションを生成するように設計されています。 Freemarkerにはいくつかのプログラミング機能がありますが、通常、Javaプログラムによって表示されるデータを準備し、Freemarkerによってページを生成し、テンプレートを介して準備されたデータを表示します(以下に示すように)。
FreemarkerはWebアプリケーションフレームワークではありませんが、Webアプリケーションフレームワークのコンポーネントとして適しています。 Freemarkerは、HTTPやサーブレットについて知らないため、コンテナとは関係ありません。 Freemarkerは非Webアプリケーション環境にも適用できます。Freemarkerは、Model2 Frameworks(Strutsなど)のビューコンポーネントとしてより適しており、JSPタグライブラリをテンプレートで使用することもできます。また、Freemarkerは無料です。
2。フリーマーカーの準備条件
freemarker.2.3.16.jar、ダウンロードアドレスはここに投稿されません...(このJARパッケージは実際にはstruts2です)
3。静的ページを生成するフリーマーカーの原則
FreeMarkerは静的ページを生成します。まず、自分で定義するテンプレートページを使用する必要があります。このテンプレートページは、最も普通のHTMLであるか、フリーマーカーではネストされた値の表現、ラベル、またはカスタムタグなどになる場合があります。次に、テンプレートページがバックグラウンドで読み取られ、そのタグを解析して対応する操作を完了し、キー値ペアのパラメーターを渡してテンプレートの値式を置き換えます。その後、静的アクセスの目的を達成するために、構成されたパスに従って新しいHTMLページを生成できます。
4。Freemarkerが提供するラベル
Freemarkerは、多くの便利で一般的に使用されるタグを提供します。 FreeMarkerタグは、このように<#タグ名>という名前です。 $ {value}は、次のように、出力変数名のコンテンツを表します。
1。リスト:このタグは、主にサーバー側から繰り返されるリストコレクションです。
<#list namelist as names> $ {names} </#list>名前は、リストループのときに撮影されたループ変数です。 Freemarkerがリストタグを解析する場合、それは以下に相当します。
for(string names:namelist){system.out.println(names); }2。場合:このタグは、主に判断の場合に使用されます。
<#if(names == "Chen Jingchou")>彼の武器は:15 ~~ </#if>です
これは条件付き判断ラベルです。条件方程式は括弧内に囲まれている必要があることに注意する必要があります。これは以下に相当します。
if(names.equals( "chen jingchou")){system.out.println( "彼の武器は:15 ~~"); }
3。含める:このタグはファイルのインポートに使用されます。
<#include "include.html"/>
このインポートタグは、特にページの再利用に非常に便利です。
さらに、$ {}を使用して、静的ファイルで値を取得できます。値法はEL式と同じであり、非常に便利です。
これが例です(static.html):
<!doctype html public " - // w3c // dtd html 4.01 transitional // en" "http://www.w3.org/tr/html4/loose.dtd"> <html> <head> <meta http- equiv = "content-type" content-type " <Title>タイトルを挿入ここに</title> </head> <body>説明:$ {説明} <br/>コレクションサイズ:$ {namelist?size} <br/> iterative list collection:<br/> <#List NAMELIST AS NAMES>これは$ {names_index+1}人、人、 (names == "chen jingchou")>彼の武器は次のとおりです。15~~ <#elseif(names == "yuwentuo")> <# - 最後には戻りはありません - >彼の武器は:xuanyuanの剣〜キーとしてキー>キー>キー> key ---> $ {key} <br/> value -----> $ {weaponmap [key]!( "null")} <# - fremarkerはnullをサポートしません、使用できます!空の値の代わりに。実際、デフォルト値を指定することもできます----- $ {weaponmap [key]?default( "null")}出力の前にnullかどうかを判断することもできます<#if weaponmap [key] ??> </#</#</#</#list>インポートファイルを含める:<br/> <#include "実際のコード:
パッケージcom.chenghui.test; java.io.fileをインポートします。 java.io.fileoutputStreamをインポートします。 java.io.ioexceptionをインポートします。 java.io.outputStreamWriterをインポートします。 java.io.writerをインポートします。 java.util.arraylistをインポートします。 java.util.hashmapをインポートします。 java.util.listをインポートします。 java.util.mapをインポートします。 freemarker.template.configurationをインポートします。 freemarker.template.defaultObjectwrapperをインポートします。 freemarker.template.templateをインポートします。 freemarker.template.templateExceptionをインポートします。 public class createhtml {public static void main(string [] args){try {//適切な構成オブジェクト構成= new Configuration(); configuration.setDirectoryForteMplateloading(new File( "d:// project // webproject // webcontent // web-inf //テンプレート")); configuration.setObjectWrapper(new DefaultObjectWrapper()); configuration.setDefaultEncoding( "utf-8"); //これを設定する必要があります。そうしないと、生成されたページに文字化けされます//テンプレートを取得または作成します。 Template Template = configuration.getTemplate( "static.html"); map <string、object> parammap = new hashmap <string、object>(); parammap.put( "description"、 "Freemarkerを使用して静的ファイルを生成することを学んでいます!");リスト<String> nameList = new ArrayList <String>(); namelist.add( "Chen Jingchou"); namelist.add( "yuer"); namelist.add( "yuwentuo"); parammap.put( "namelist"、nameList); map <string、object> weaponmap = new hashmap <string、object>(); weaponmap.put( "first"、 "xuanyuan sword"); weaponmap.put( "second"、 "kongtongシール"); weaponmap.put( "third"、 "nuwa Stone"); weaponmap.put( "fourth"、 "shennong ding"); weaponmap.put( "fifth"、 "fuxi qin"); weaponmap.put( "Sixth"、 "Kunlun Mirror"); weaponmap.put( "seventh"、null); parammap.put( "武器マップ"、武器マップ); Writer Writer = new OutputStreamWriter(new FileOutputStream( "success.html")、 "utf-8"); template.process(parammap、writer); System.out.println(「おめでとうございます、世代は成功しました~~」); } catch(ioexception e){e.printstacktrace(); } catch(templateException e){e.printstacktrace(); }}}
これは基本的にシンプルでシンプルな世代と見なすことができますが、Freemarkerが提供するタグは私たちのニーズをまったく満たすことができないため、実際には使用されるとはほど遠いものです。現時点では、ニーズを完了するにはカスタムタグが必要です。 。
5。フリーマーカーカスタムタグ
Freemarkerカスタムタグは、タグを自分で書き、自分で解析することです。彼らはそれ自体でタグの入力と出力を完全に制御します。これにより、プログラマーはプレイする余地がたくさんあります。
手順に基づいて:
過去には、タグを作成するときは、<後に#を追加する必要がありますが、カスタムタグを認識するには、その後 @を追加する必要があります。その後、後でいくつかのパラメーターを定義できます。プログラムがtemplate.process(parammap、out)を実行すると、ページ全体のすべてのフリーマーカータグを解析します。
タグをカスタマイズするには、クラスをカスタマイズしてから、テンプレートIrectiveModelの実装、実行方法の書き換え、パラメーターの取得の完了、パラメーターなどに従って何かを実行する必要があります。
クラスを解析するためにカスタムタグをバインドするには、ParaMmapに解析クラスのインスタンスを配置する必要があり、保存されたキーはカスタムタグと同じです。 。
注:カスタムタグでは、タグに何もない場合、startタグとエンドタグが同じ行である必要はありません。そうしないと、エラーが報告されます。
freemarker.log.jdk14LoggerFactory $ jdk14loggerエラー
私はだまされました、そしてこれはフリーマーカーのバグです。
static.htmlの例は次のとおりです。
<!doctype html public " - // w3c // dtd html 4.01 transitional // en" "http://www.w3.org/tr/html4/loose.dtd"> <html> <head> <meta http- equiv = "content-type" content-type " <Title>タイトルを挿入ここに</title> </head> <body> <# - カスタム変数 - > <#Assign num = 'hehe' /// $ {num} <br/> custom tags <@content name "age =" 120 "> $ {output} $ {append} </@body> </body> </html>
上記のstatic.htmlテンプレートの解析クラスは次のとおりです。
パッケージcom.chenghui.test; static freemarker.template.objectwrapper.default_wrapperをインポートします。 java.io.ioexceptionをインポートします。 java.io.writerをインポートします。 java.util.mapをインポートします。 freemarker.core.environmentをインポートします。 freemarker.template.templatedirectivebodyをインポートします。 freemarker.template.templatedirectivemodelをインポートします。 freemarker.template.templateExceptionをインポートします。 freemarker.template.templatemodelをインポートします。 freemarker.template.templatemodelexceptionをインポートします。 freemarker.template.templateNumberModelをインポートします。 freemarker.template.templatescalarmodelをインポートします。 / ** * Custom Tag Resolution Class * @Author Administrator * */ Public Class ContentDirective Implements TemplatedIrectiveModel {private static final string param_name = "name"; private static final string param_age = "age"; @Override public void execute(Environment Env、Map Params、templateModel [] loopvars、templatedirectivebody body)The templateException、ioexception {if(body == null){throw new templatemodelexception( "null body"); } else {string name = getString(param_name、params);整数年齢= getInt(param_age、params); //パラメーターを受信した後、特定の操作に従って特定の操作を実行し、ページにデータを表示できます。 if(name!= null){env.setVariable( "output"、default_wrapper.wrap( "コンテンツ指向性解析クラスから取得したパラメーターは:"+name+"、"); } if(age!= null){env.setVariable( "append"、default_wrapper.wrap( "age:"+age)); } writer out = env.getout(); out.write( "ここから、document.writer write操作のように、ページ上の特定のコンテンツを見ることができます。<br/>"); body.render(out); /*注意している場合、ページにout.write()出力ステートメントが表示され、出力のコンテンツが出力されていることがわかります。ボディが解析しているとき、最初にパラメーターをENVに入れ、ページが対応するフォームに遭遇した場合にのみ、値が得られます。ただし、フォームが存在しない場合、エラーが報告されます。ここではフリーマーカーはうまくいっていないと思いますが、解析時にエラーがページにさらされると思います。このようにして$ {output! "null"}を補うことができ、それはEL式ほど良くないと常に感じます。 */}}/ ** * type stringのパラメーターの値を取得 * @param paramname * @param parammap * @return * @throws templatemodelexception */ public static string getString(String paramname、map <string、templatemodel> parammap)throws threa slows templatemodelexception if(model == null){return null; } if(model instance of templatescalarmodel){return((templatescalarmodel)model).getAsstring(); } else if(model instance of templatenumberModel){return((templateNumberModel)Model).getAsNumber()。toString(); } else {throw the new templateModelexception(paramname); }} / ** * *タイプのパラメーターを取得 * @param paramname * @param parammap * @return * @throws templatemodelexception * / public static integer getint(string paramname、map <string、parammap)throws the templatemodelexception {templatemodel model = parammap.get(Paramap.get(Paramnamename); if(model == null){return null; } if(model instance of templatescalarmodel){string str =((templatescalarmodel)model).getAsstring(); try {return integer.valueof(str); } catch(numberformatexception e){新しいtemplatemodelexception(paramname); }} else if(model instance of templatenumberModel){return((templateNumberModel)Model).getAsNumber()。intvalue(); } else {throw the new templateModelexception(paramname); }}}その後、追加:
// parammap.put( "content"、new ContentDirective())を解析するカスタムタグ
これにより、基本的に使用できます。 Freemarkerは、シンプルなビジネスロジックを作成する問題を解決するためにカスタムタグを完成させます。ただし、実際のプロジェクトでこれを行うことは不可能です。これは、Springとまだ統合されていないため、解析時間に解析クラスの解析インスタンスを配置する必要があるためです。 。