[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 < 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 < 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 < beans.size() }"
> after="${ i++ }">
> ...
> </m:for>
>
> にすれば、動くと思います。
> 後、m:forは空タグではなく、<fmt:formatDate .../>の
> 後に終了タグが必要な気がします。
>
> SAStrutsは、publicフィールドに対応していない
> テンプレートエンジンでもpublicフィールドを使えるようにするために
> 配列やリストは、Listで独自にラップしていて、
> JavaBeanやマップは、Mapで独自にラップしています。
>
> よろしくお願いします。
Seasar-user メーリングリストの案内