かとじゅんの技術日誌

技術の話をするところ

SAStrutsとMayaaの組み合わせ方について

初めてのSAStrutsのネタを書きます。。。
SAStrutsMayaaと組みわせはできると耳にしていたのですが、具体的な方法がよくわからなかったので調べてみました。

web.xmlにMayaaServletの設定を追加する。

    <servlet>
        <servlet-name>MayaaServlet</servlet-name>
        <servlet-class>org.seasar.mayaa.impl.MayaaServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>MayaaServlet</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>
    <context-param>
        <param-name>sastruts.VIEW_PREFIX</param-name>
        <param-value>/WEB-INF/view</param-value>
    </context-param>

は、そのままにしておきます。

SAStrutsのサンプルにあるAddActionの遷移先をxxx.jspではなくxxx.htmlに変える。

	@Execute(validator = false)
	public String index() {
		return "index.html";
	}

	@Execute(input = "index.html")
	public String submit() {
		result = Integer.valueOf(arg1) + Integer.valueOf(arg2);
		return "index.html";
	}

xxx.jspが配置されているディレクトリにhtml,mayaaファイルを置く。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
	<span id="allMessages"/>
	<form method="post">
		<input type="text" id="arg1" name="arg1"/>
		 + 
		 <input type="text" id="arg2" name="arg2"/>
		  = 
		<span id="result"/>
		<input type="submit" name="submit" value="calc"/>
	</form>
</body>
</html>

formタグのaction属性はadd/になるようにわざと指定していません。各inputタグのname属性でSAStrutsとPOST時に連携できるようにし、id属性はMayaaでレスポンス時に連携できるようにします。これでURLを崩さないで実行できます。Mayaaでnamae属性を動的に追加するようにしてもよいかもしれません。
あ,そうそう.

<input type="submit" name="submit" value="calc"/>

submitメソッドは,name="submit"がないといけないようです.

<?xml version="1.0" encoding="ISO-8859-1"?>
<m:mayaa xmlns:m="http://mayaa.seasar.org"
		xmlns:html="http://struts.apache.org/tags-html">
	<m:with m:id="allMessages">
		<html:errors/>
	</m:with>
	<m:echo m:id="arg1">
		<m:attribute name="value" value="${addAction.arg1}" />
	</m:echo>
	<m:echo m:id="arg2">
		<m:attribute name="value" value="${addAction.arg2}" />
	</m:echo>
	<m:write m:id="result" value="${addAction.result}" replace="false"/>
</m:mayaa>

arg1,arg2の値のバインディングですが、${addAction.xxx}で指定しています。addActionFormでもよいと思います。
Strutsタグを使うようなところは、Mayaaのカスタムタグを呼び出す仕組みをそのまま使います。allMessagesとか。
で、今までどおり、http://localhost:8080/xxx/add/ とかでアクセスしてください。Mayaaも一緒に動くはずですw

まとめ

Mayaaのテンプレート機能は強力ですね!慣れればいろいろ複雑な要件もさっくり実現できそう。。。でも、Teedaと比べると脳内変換がとても大変。
SAStrutsでは通常JSPを使うはずですが、JSP2.0でEL式だけでテンプレートかけるとよいですが、そんなことできるのかしら。
最初にTeedaのHTMLテンプレートに慣れてしまったので、どちらにしても戸惑いますなぁ。。。TeedaのHTMLテンプレート機能をSAStrutsでも使ってみたいなぁーと思ったり。
まぁ、いずれにしてもMayaaはデザイナーとの連携を考えてもありありなので、ぜひ使ってみよう。

以上、簡単ですが、組み合わせ方でした。