Struts2, Velocityを利用時に Content Typeを自由に変更したい
Struts2とVelocityを利用しているときに、Content-Typeを指定したいことがある。そんなときに struts.xml で指定できると便利かもしれない。 そこでちょっと result-typeをあたらに作ることで実現してみます。
Struts2 と Velocity
Struts2で Velocityを使ってページを表示させるには、struts.xml に以下のようにテンプレートを指定します。
<action name="pageOne" class="pageOneAction"> <result name="success" type="velocity">/template/page_one.html</result> </action>
この場合、ブラウザーのレスポンスヘッダーは Content-Type: text/html; charset=UTF-8
となります。
htmlの場合は、これで問題ないのですが、Velocityで XML や JavaScriptを扱いたいときに Content-Typeが変更できずに困ってしまいます。
アクション内でヘッダーを送るようにすれば変更できますが、struts.xml で指定できると楽じゃないかな?と思い Struts2の VelocityResultを改造してみる。
Flexible Velocity Result
VelocityResult を継承して、Content-Typeを変更できるようにする
/* * FlexibleVelocityResult.java */ package net.gadgety.common; /** * Content-Type変更可能な Velocity Result * * @auther shin */ public class FlexibleVelocityResult extends VelocityResult { /** デフォルト Content-Type */ private String contentType = "text/html"; /** * Content-Typeの設定 * * @param contentType Content-Type */ public void setContentType(String contentType) { this.contentType = contentType; } /** * Content-Typeの取得 * * @param templateLocation テンプレート */ @Override protected String getContentType(String templateLocation) { return contentType; } }
利用
実際に利用するには、まず Struts2 にresult-type
を追加します。
そして必要なアクションの result-typeを FlexibleVelocityResult に設定します。
<struts> <package name="struts-base" extends="struts-default, spring-default"> <result-types> <result-type name="flexibleVelocity" default="true" class="net.gadgety.common.FlexibleVelocityResult" /> </result-types> <global-results> ... </package> ... <package name="default" namespace="/" extends="struts-base"> <action name="pageOne" class="pageOneAction"> <result name="success" type="velocity">/template/page_one.html</result> </action> <action name="pageJs" class="pageJsAction"> <result name="success" type="flexibleVelocity"> <param name="location">/template/page_js.js</param> <param name="contentType">application/javascript</param> </result> </action> ... </package>
http://www.example.com/pageJs 場合、ブラウザーのレスポンスヘッダーは Content-Type: application/javascript; charset=UTF-8
となっていることが確認できます。