[Struts2] FreeMarker での JSP タグの利用

さきほど、FreeMarker でプロパティを表示する方法として、

${name}

と書いたが、struts のタグを利用して JSP で書くとすると、

<s:property value="name" />

となる。で、struts のタグは FreeMarker でも利用することができて、

<@s.property value="name" />

といった感じで表記できる。

では、FreeMarker で「${name}」と記載するのと「<@s.property value="name" />」と書くのがまったく同じかというとそうではない。struts タグの方はデフォルトの動作として HTML をエスケープしてくれるのに対して、「${name}」のほうは HTML をエスケープしてくれない。エスケープさせるためには、

${name?html}

と書くか、<#escape x as x?html>〜 で囲み、

<#escape x as x?html>
${name?html}
</#escape>

と書くかど、ちらかの方法をとれば良い。なんかエスケープ忘れで事故がおこりそうで怖いなあ。

あと、FreeMarkerstruts タグ() 以外の JSP タグを使うには、以下の 2 点の対応が必要だ。

  • JspSupportServret をロードしておく
  • テンプレートで taglib を利用する宣言をする


一点目は、web.xml で以下の記述を追加する。

<servlet>
    <servlet-name>JspSupportServlet</servlet-name>
    <servlet-class>org.apache.struts2.views.JspSupportServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

二点目は、テンプレートファイルに以下のような記述を行う。

<#assign foo=JspTaglibs["/WEB-INF/foo.tld"] />

これで、以下のような記述でタグを利用できる。

<@foo.bar>

まあ、このあたりは考え方が JSP の場合と似ているので理解しやすい。