StrutsとかFreeMarkerとか

今日は初めてFreeMarkerを触りました。
これまでJavaプログラミングにおいてフレームワークStrutsの1系を、表示にはJSPを使ってたんですが、この表示をFreeMarkerに移行することに。
とりあえず公式からjarを落としてきてlibにぶち込み、EclipseでFreeMarkerのファイルであるftlを編集しやすいようにこちらからプラグインを落としてきて適用。
公式にもプラグインがあるのですが、自分の環境では上手く動いてくれなかったので上のものを使ってます。
次にDowILoG: Strutsで構築したアプリにFreeMarkerを導入する方法を参考にweb.xmlstruts-config.xmlをもごもごして準備完了。


よし書くどー!と思ったものの何がなんだかよく分かりません。
FreeMarker Manualを見てもなんだかよく分かりません。
とりあえずやりたいのは条件分岐とActionFormに格納されたリストの表示でした。
ちなみに簡略化してますがjspでは以下のような感じの実装。

<!-- ページング -->
<logic:notEmpty name=form" property="prevPage">
	<a href="<bean:write name="form" property="prevPage" />">前の20件</a>
</logic:notEmpty>
<logic:notEmpty name="form" property="nextPage">
	<a href="<bean:write name="form" property="nextPage" />">次の20件</a>
</logic:notEmpty>

<!-- 結果表示 -->
<logic:iterate id="items" name="form" property="itemList">
	<ul>
		<li><bean:write name="items" property="title" /></li>
		<li><bean:write name="items" property="author" /></li>
	</ul>
</logic:iterate>

ftlではtaglibを利用することが出来るので以下のような感じの実装も可能なんですが…

<#assign bean=JspTaglibs["/WEB-INF/struts-bean.tld"] />
<@bean.write name="form" property="itemList.title" />

logicまでこの方法でやっちゃうと何か負けた気がしたので調べてみることに。
とりあえずやりたいのは条件分岐なので、FreeMarker Manual - Alphabetical Indexでそれっぽいのを探してみます。


FreeMarker Manual - if, else, elseif
あった!ifあった!これで勝つる!


結果上のページングの部分が…

<#comment>ページング</#comment>
<#if form.prevPage?has_content>
	<a href="${form.prevPage}">前の20件</a>
</#if>
<#if form.nextPage?has_content>
	<a href="${form.nextPage}">次の20件</a>
</#if>

こんな感じになりました。
ifの中にある「?」で始まるものはbuilt-insというものらしく、この場合だと「?has_content」とすることでnullでないときにtrueを返してくれたりするみたいです。
もちろんこのbuilt-insを使わないで以下のように数値の比較をしてやることも出来ます。

<#if (form.itemList.total > 10)>

次に結果表示の部分。
リストでActionFormに入っているものをぐりぐり出したいので、とりあえずまた上の索引っぽいページでそれっぽいものを探します。
どうやらlist, breakというものがあるみたいなので使ってみます。

<#comment>結果表示</#comment>
<#list form.itemList as items>
	<ul>
		<li>${items.title?html}</li>
		<li>${items.author?html}</li>
	</ul>
</#list>

ヤター!結果表示デキタヨー!


そしてまた出てきました「?」。
今度は「html」がついてます。
こいつは「<」を「&lt;」にするといった感じで、エスケープを行ってくれます。
詳しくは以下。
FreeMarker Manual - Built-ins for strings
これと同じような挙動をするescape, noescapeなんてものもあるようです。
また、このbuilt-insは以下のような感じで同時に複数使うこともできるみたいです。

${items.author?if_exists?html}


ドキュメントはまだ全然見切れてないのでもっといい方法もあるかもしれないし間違ってる部分もあるかもしれませんが、一応動いたという感じ。
まだまだプログラム初心者なので精進していきたいところです。
あと英語を…読めるようになりたいです…。
英語を読めないとこういった英語のドキュメントしかないもので躓きがちです。
もっともコードが載ってるのでなんとなーく、なんとなーくは分かるんですけども。課題は山積みです。

スポンサーリンク