たぷつきません

おなかがでてきた。もうたぷついてるやん。

動的な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>

hoge.mayaa

<?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パースエラーにならない。

ポイント2

 XMLコメント内にスクリプトを書くことで、ブラケットのエンコーディングが不要になる。もちろん -- がスクリプト内で必要になったら注意が必要だが、回避に困難は無いだろう。

ポイント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>