[Seasar-user:12829] Re: [SAStruts/MAYAA] Bean 配列での連携の方法をご教授願えないでしょうか?【2】

TAIGA [E-MAIL ADDRESS DELETED]
2008年 2月 12日 (火) 21:55:41 JST


TAIGAです。

まず、切り分けのためにSAStrutsではなく、ただのサーブレット+Mayaaでまったく同じソースで実行しました。

■サーブレット+Mayaa■■■■■■■■■■■■■■■■■■■■■■■■■■■
サーブレットソース「TestServlet」-----------------------------------------
import ...省略
import example.MyBean;

public class TestServlet extends HttpServlet {
	public void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html; charset=Shift_JIS");
		
		MyBean[] beans = new MyBean[2];
		MyBean bean2 = new MyBean();
		bean2.setId(1);
		bean2.setName("No1");
		beans[0] = bean2;

		bean2 = new MyBean();
		bean2.setId(111);
		bean2.setName("No2");
		beans[1] = bean2;
		
		request.setAttribute("beans", beans);

		ServletContext cont = getServletContext();
		RequestDispatcher reqJSP
			= cont.getRequestDispatcher("/mayaaTest/usebean.html");
		reqJSP.forward(request, response);
	}
}

.mayaaファイル「usebean.mayaa」-----------------------------------------
<?xml version="1.0" encoding="ISO-8859-1"?>
<m:mayaa xmlns:m="http://mayaa.seasar.org"
		xmlns:fmt="http://java.sun.com/jsp/jstl/fmt">
	<m:for id="loop" replace="false"
			init="${ var i = 0 }"
			test="${ i &lt; beans.length }"
			after="${ i++ }"/>
	<m:write id="id" value="${ beans[i].id }" />
	<m:write id="name" value="${ beans[i].name }" />
	<fmt:formatNumber m:id="decimal" value="${ beans[i].decimal }" />
	<fmt:formatDate m:id="timestamp" value="${ beans[i].timestamp }" />
</m:mayaa>

htmlファイル「usebean.html」------------------------------------------
<html>
<head>
	<title>use bean</title>
</head>
<body>
	<h1>Use bean</h1>
	<table border="1">
	<tr><th>id</th><th>name</th><th>decimal</th><th>timestamp</th></tr>
	<tr id="loop">
		<td><span id="id">10 dummy</span></td><td><span id="name">dummy name</span></td>
		<td><span id="decimal">1.2 dummy</span></td><td><span id="timestamp">1970/1/1 dummy</span></td>
	</tr>
	</table>
</body>
</html>

すると、期待どおりにusebean.htmlのテーブルに「TestServlet」で設定した2件のbeanのデータが
出力されました。
ちなみに、ひがさんのご指摘どおりに
 <m:for id="loop" replace="false"
     init="${ var i = 0 }"
     test="${ i &lt; beans.size() }"
     after="${ i++ }">
 ...
 </m:for>
のようにforを閉じるとテーブルの外に値が出力されてしまいました。
私としても、直感的にforは閉じるのかな?と思っていたのですが、mayaaのサンプルが上記のように
閉じないようになっていたのでそのとおりにしています。
どこからどこまではforの処理対象になるか直感的には分からない仕様になっていますね。。

そこで今度はサーブレット部分をsastrutsに置き換えてみます。
■sastruts+Mayaa ■■■■■■■■■■■■■■■■■■■■■■■■■■■
Actionクラス「MayaaTestAction」---------------------------------------
package tutorial.action;
import org.seasar.struts.annotation.Execute;
import example.MyBean;

public class MayaaTestAction {
	public MyBean[] beans = new MyBean[2];

	@Execute(validator = false)
	public String index() {
		MyBean bean2 = new MyBean();
		bean2.setId(1);
		bean2.setName("No1");
		beans[0] = bean2;

		bean2 = new MyBean();
		bean2.setId(111);
		bean2.setName("No2");
		beans[1] = bean2;
		return "usebean.html";
	}

}

その他のhtmlファイルと.mayaaファイルは修正なしです。
すると、やはり昨日メールしたとおり、1件もデータが表示されないのです。

今度はhtmlではなくusebean.jspを作成し、Actionクラスの戻り値をjspにしてsastrutsのみで画面を表示するように
すると、2件のデータが表示されます。

usebean.jsp------------------------------------------------------------------
<html>
<head>
	<title>use bean JSP</title>
</head>
<body>
	<h1>Use bean(JSP)</h1>
	<table border="1">
	<tr><th>id</th><th>name</th><th>decimal</th><th>timestamp</th></tr>
	<c:forEach var="e" varStatus="s" items="${beans}">
	<tr>
		<td>${f:h(e.id)}</td><td><c:out value="${e.name}"/></td>
		<td><c:out value="${e.decimal}"/></td><td><c:out value="${e.timestamp}"/></td>
	</tr>
	</c:forEach>
	</table>
</body>
</html>


これらのことから、前回[Seasar-user:12743] のようにsastrutsとmayaaフレームワーク間での
連携がうまくいってないのでは?とも考えたのですが、どうでしょうか?


Yasuo Higa さんは書きました:
> ひがです。
> 
>> いつもお世話になっております。
>> TAIGAと申します。
>>
>> 今回はもう一つステップアップして、Beanの配列を用いた連携を確認しています。
>> 確認用のプログラムのベースはMayaaの「申し込みフォームアプリケーション」の
>> app_list.htmlを参考にしています。
>> 下記のようにbeanの配列データをテーブルタグ内にループして表示するサンプル
>> プログラムを作成したのですが、1件も表示されません。
>> 期待値としては2件のレコードが表示されるのですが。。
>>
>> MAYAA自体、手探りで動作確認をしている状態で、Mayaa側なのかSAStruts側なの
>> か、どちら側の記述の問題なのかの切り分けもついていないのですが、
>> どなたかご教授願えないでしょうか?
>>
> 最初は、Mayaa抜きで作ってみて、その後、Mayaa入りで作るのが、
> 問題の切り分けにはいいと思います。
> 
> SAStrutsの配列は、Mayaaから見るとListに見えるので、
> 今回の場合だと、
> <m:for id="loop" replace="false"
>     init="${ var i = 0 }"
>     test="${ i &lt; beans.size() }"
>     after="${ i++ }">
> ...
> </m:for>
> 
> にすれば、動くと思います。
> 後、m:forは空タグではなく、<fmt:formatDate .../>の
> 後に終了タグが必要な気がします。
> 
> SAStrutsは、publicフィールドに対応していない
> テンプレートエンジンでもpublicフィールドを使えるようにするために
> 配列やリストは、Listで独自にラップしていて、
> JavaBeanやマップは、Mapで独自にラップしています。
> 
> よろしくお願いします。


Seasar-user メーリングリストの案内