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となっていることが確認できます。









