Webエンジニア susumuis の技術ブログ

このブログの内容は個人の見解であり、所属する組織の公式見解ではありません

MayaaでJSPをinclude→できません!

今、既存プロジェクトにMayaaを導入しようとしています。

  • なぜMayaaなのか?
  • Wicketを勉強していたのではないのか?

いや、いろいろと経緯がありましてね。書くと長くなるので割愛します。

で、既にJSPによって、デザインが組み込まれているのですが、それだとデザインの修正が困難なので、HTMLテンプレートによって超楽にデザイン修正ができるようにしてしまおう作戦です!

さて、早速組み込みを始めてみます。

よく見ると、JSPは共通部品ごとに分割されていて、includeしている感になってます。でもこれだと、ブラウザでプレビューしたときに細切れとなってしまうため、HTMLテンプレートとしては微妙ですね。。。

そこで、とりあえずは、目で見える部品については、各ファイルに同じ内容を記述させることにします。どうせデザイナーさんはコピペするでしょうし。

しかし、よくよく見ると

JavaScriptのロードまで、JSPインクルードしてるじゃないですか!
なるほど、JavaScriptコードの中でJSPスクリプトレットを処理させてるんですね。確かに、やりたい気持ちはわかります。あと、キャッシュまわりの制御が意外と面倒なので、src属性じゃなくて、ページの中のscriptタグに出力させたい気持ちもよーくわかります。

じゃあ、こういうところだけは、JSPから持ってこようかなと思いました。

MayaaからJSPテンプレートをincludeし...あれ、できません!
http://mayaa.seasar.org/documentation/implicit_object.html#functions
をどう見ても、includeという関数はありません。

できないものは作れ!

僕はプログラマー、不可能はない!
じゃあJavaクラスを処理できるMayaaの特性を利用して、ちょっくらこしらえてしまいましょう。
まず、こんなjsを書きました。

/// グローバル関数置き場
/// @author ishigami
var httpRequest = どこかしらからhttpServletRequestを取ってくる。
var httpResponse = どこかしらからhttpServletRequestを取ってくる。
var util = new Packages.jp.my.company.util.MayaaUtil(httpRequest, httpResponse);

〜省略〜

これをdefault.mayaaに組み込みます。

<?xml version="1.0" encoding="UTF-8"?>
<m:mayaa xmlns:m="http://mayaa.seasar.org">
	<m:beforeRender>
		load('/view/mayaa_script/util.mjs');
	</m:beforeRender>
</m:mayaa>

そして、MayaaUtilを作成します。

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MayaaUtil {
	private HttpServletRequest req;
	private HttpServletResponse res;
	
	public MayaaUtil(HttpServletRequest request, HttpServletResponse response) {
		super();
		this.req = request;
		this.res = response;
	}

	public void include(String path) throws ServletException, IOException {
		req.getRequestDispatcher(path).include(req, res);
	}
}

これでどうだー!

と思って実行してみたのですが、残念!以下のようなエラーメッセージがコンソールに出力されて失敗してしまいました。orz

[INFO] TemplateErrorHandler - error template not found, /org.seasar.mayaa.impl.cycle.script.rhino.OffsetLineRhinoException
[INFO] TemplateErrorHandler - error template not found, /org.mozilla.javascript.EvaluatorException
[INFO] TemplateErrorHandler - error template not found, /org.mozilla.javascript.RhinoException
[INFO] TemplateErrorHandler - error template not found, /java.lang.RuntimeException
[INFO] TemplateErrorHandler - error template not found, /java.lang.Exception
org.seasar.mayaa.impl.cycle.script.rhino.OffsetLineRhinoException: Wrapped org.apache.jasper.JasperException: Exception in JSP: /view/topframe.jsp:30
 
27: </div>
28: </div>
29: <%-- ★カテゴリ&フリーワード検索インクルード --%>
30: <jsp:include page="/view/search.jsp" flush="true" />
 
Stacktrace: in script=
    response.getOutputStream().flush();    util.include('/view/topframe.jsp');        (/view/top/top.mayaa#exec#29)
	at org.seasar.mayaa.impl.cycle.script.rhino.TextCompiledScriptImpl.execute(TextCompiledScriptImpl.java:210)
	at org.seasar.mayaa.impl.engine.processor.ExecProcessor.doStartProcess(ExecProcessor.java:70)
	at org.seasar.mayaa.impl.engine.RenderUtil.renderTemplateProcessor(RenderUtil.java:134)

どうやら、OutputStreamを勝手にいじったのが悪かったみたいです。正しく出力できなかったみたいですね。
処理自体は走っています。Eclipse+WTPのデバッガで、ブレークポイントで止めることもできました。

調べたら以下のようにMLで質問された方がいるんですね。
http://ml.seasar.org/archives/mayaa-user/2007-October/000587.html
http://ml.seasar.org/archives/mayaa-user/2007-October/000588.html
http://ml.seasar.org/archives/mayaa-user/2007-October/000589.html

うーん。やっぱり無理なのか...残念だなぁ。

あとがき(というかぼやき)

久しぶりにエントリを書きました。さぼっていたわけではありませんよ。そもそも、書くネタがなかったんです。ネタがないのに無理矢理書こうとすると、(僕の場合は特に)与太話になってしまうので、なるべく書くことがないと書かないことに決めています。このブログはできる限り技術的な記録しか残さないつもりなので。
また、会社員という僕の立場が、結局無難で枯れた技術を好んで使いがちということも、「新しいことに挑戦しない→今更書いても仕方がない」という状況を導き出しています。
まぁ、それでも書くことが時々出てきたりするのでいいのかなーと思ってます。