動的なJavaScriptファイルやCSSファイルを出力する
1.mayaa用のファイル拡張子を決めておく。たとえば、.mjs や .mcss とする。
2.src/META-INF/ に、org.seasar.mayaa.provider.ServiceProviderをおいて拡張子が .mjs や .mcss のファイルをmayaaテンプレートとして扱うよう設定する。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE provider PUBLIC "-//The Seasar Foundation//DTD Mayaa Provider 1.0//EN" "http://mayaa.seasar.org/dtd/mayaa-provider_1_0.dtd"> <provider> <engine> <parameter name="templatePathPattern" value=".*\.mjs$"/> <parameter name="templatePathPattern" value=".*\.mcss$"/> </engine> </provider>
3.web.xmlにもservletMappingする。mayaaServletに、.mjs .mcss を割り付ける。
<servlet-mapping> <servlet-name>MayaaServlet</servlet-name> <url-pattern>*.mjs</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>MayaaServlet</servlet-name> <url-pattern>*.mcss</url-pattern> </servlet-mapping>
4.xml宣言やhtmlタグを書かずにダミータグ内に記述する。
hoge.mjs
<jsBlock xmlns:m="http://mayaa.seasar.org" m:id="scriptBody"> //<! -- document.write('<OBJECT codebase="${activeXControlCodebase}" .... '); //--> </jsBlock>
<?xml version="1.0"?> <m:mayaa xmlns:m="http://mayaa.seasar.org" m:contentType="text/javascript"> <m:beforeRender> var baseUrl = request.underlyingContext.requestURL; var pos = baseUrl.indexOf(request.underlyingContext.servletPath); baseRootUrl = baseUrl.substring(0, pos+1); var activeXControlCodebase = baseRootUrl + "myActiveXControl"; </m:beforeRender> <m:with id="scriptBody"> <m:doBody/> </m:with> </m:mayaa>
上記の実行結果例
//<! -- document.write('<OBJECT codebase="http://localhost:8080/myapp/myActiveXControl" .... '); //-->
ポイントがいくつかある。
ポイント1
まずreplaceされて消えてしまうダミータグをうまく使って、タグを無かったことにする(上記例ではjsBlockタグ)。XMLパーサーを使うためmayaaはどうしてもタグが必要。しかし上記のようにダミーを用意すれば、勝手に消失するしSAXパースエラーにならない。
ポイント3
XMLコメント内では、${ ... }でmayaaからバインドできるので楽チン。mayaa側のbeforeRenderを使ってバインドするものを準備しておけばよい。XMLコメント内では、mayaaの特徴であるタグのバインドは無視される。以下のようにしても置換はされない。
<!-- : <span m:id="test">replace before</span> -->
ポイント4
mayaaファイル側での、m:contentType="text/javascript" も忘れずに。.mcss であれば、"text/css"。
以上で動的JavaScriptの完成。後は、HTML内に引き込むだけ。
<script type="text/javascript" src="hoge.mjs"></script>