2010年11月22日月曜日

何も書けません...

いろいろ忙しいです。

2010年11月11日木曜日

Mayaa ループ

前回は値の出力(属性への出力も)を実施したので、
今回はループ。

あとは、条件分岐をやれば、だいたいのページは生成できると思います。



さて、こんなテーブルを作りたいことありますよね。

たとえば、一覧出力画面とかで。


  1. <table border="1" frame="box" id="addressTable">   
  2.  <tr>   
  3.   <td width="80" align="center"><b>顧客コード</b></td>   
  4.   <td width="80" align="center"><b>顧客氏名</b></td>   
  5.   <td width="200" align="center"><b>住所</b></td>   
  6.  </tr>   
  7.    
  8.  <tr>   
  9.   <td align="center">00000001</td>   
  10.   <td align="center">terasoluna1</td>   
  11.   <td align="center">東京都中央区</td>   
  12.  </tr><tr>   
  13.   <td align="center">00000002</td>   
  14.   <td align="center">田中</td>   
  15.   <td align="center">東京都中央区</td>   
  16.  </tr><tr>   
  17.   <td align="center">00000003</td>   
  18.   <td align="center">鈴木</td>   
  19.   <td align="center">東京都中央区</td>   
  20.  </tr><tr>   
  21.   <td align="center">00000004</td>   
  22.   <td align="center">高橋</td>   
  23.   <td align="center">千葉県成田市</td>   
  24.  </tr><tr>   
  25.   <td align="center">00000005</td>   
  26.   <td align="center">小池</td>   
  27.   <td align="center">東京都中央区</td>   
  28.  </tr><tr>   
  29.   <td align="center">00000006</td>   
  30.   <td align="center">鈴木</td>   
  31.   <td align="center">東京都足立区</td>   
  32.  </tr><tr>   
  33.   <td align="center">00000007</td>   
  34.   <td align="center">佐藤</td>   
  35.   <td align="center">東京都国立市</td>   
  36.  </tr><tr>   
  37.   <td align="center">00000008</td>   
  38.   <td align="center">青木</td>   
  39.   <td align="center">東京都渋谷区</td>   
  40.  </tr><tr>   
  41.   <td align="center">00000009</td>   
  42.   <td align="center">山本</td>   
  43.   <td align="center">東京都中野区</td>   
  44.  </tr><tr>   
  45.   <td align="center">00000010</td>   
  46.   <td align="center">山下</td>   
  47.   <td align="center">東京都三鷹市</td>   
  48.  </tr>   
  49. </table>  




で、以下の状況を想定。


  • requestスコープに、listAddressというjava.util.List型のオブジェクトがある

  • Listの中身はPOJOで、customerCode, customerName, customerAddressが存在する



htmlは↓のかんじ


  1. <table border="1" frame="box" id="addressTable">  
  2.  <tr>  
  3.   <td width="80" align="center"><b>顧客コード</b></td>  
  4.   <td width="80" align="center"><b>顧客氏名</b></td>  
  5.   <td width="200" align="center"><b>住所</b></td>  
  6.  </tr>  
  7.   
  8.  <tr m:id="loop">  
  9.   <td align="center"><span m:id="_customerCode">dummy code</span></td>  
  10.   <td align="center"><span m:id="_customerName">dummy name</span></td>  
  11.   <td align="center"><span m:id="_customerAddress">dummy address</span></td>  
  12.  </tr>  
  13. </table>  




で、mayaaは↓のかんじ


  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <m:mayaa xmlns:m="http://mayaa.seasar.org">  
  3.     <m:for m:id="loop"  
  4.             m:init="${ var i = 0 }"  
  5.             test="${ i < listAddress.size() }"  
  6.             m:after="${ i++ }" replace="false">  
  7.        <m:exec script="${ var info = listAddress.get(i); }" />  
  8.        <m:doBody />  
  9.     </m:for>  
  10.   
  11.     <!-- 顧客コード -->  
  12.     <m:write m:id="_customerCode"  
  13.             value="${info.customerCode}" />  
  14.   
  15.     <!-- 顧客氏名 -->  
  16.     <m:write m:id="_customerName"  
  17.             value="${info.customerName}" />  
  18.   
  19.     <!-- 顧客住所 -->  
  20.     <m:write m:id="_customerAddress"  
  21.             value="${info.customerAddress}" />  
  22. </m:mayaa>  




ここでポイントなのが、<m:doBody />タグ。
これがないと、↓のようなhtml出力されてしまいます。



  1. <table border="1" frame="box" id="addressTable">   
  2.  <tr>   
  3.   <td width="80" align="center"><b>顧客コード</b></td>   
  4.   <td width="80" align="center"><b>顧客氏名</b></td>   
  5.   <td width="200" align="center"><b>住所</b></td>   
  6.  </tr>   
  7.    
  8.  <tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr>   
  9. </table>  



Mayaaのドキュメントには、以下のように書いてあります。


割り当てられたタグのボディを処理します。for プロセッサなどタグのボディが有効なプロセッサで動作します。通常は明示的に使用することはありませんが、Mayaa ファイル側のボディに attribute 以外のプロセッサや空白 (タブ文字、改行を含む) 以外の文字列を記述した場合、doBody を使用しなければタグのボディが処理されません。


つまり、簡単にいうと、forプロセッサのボディを評価したければ、<m:doBody />を書け、と。
この場合だと、を評価しないとinfoが使えませんので、ぜひ<m:doBody />を付けてください。


ちなみに、<m:for />にreplace="false"を付けないと、が消えてしまい、
以下のようなhtmlが出力されてしまいます。


  1. <table border="1" frame="box" id="addressTable">   
  2.  <tr>   
  3.   <td width="80" align="center"><b>顧客コード</b></td>   
  4.   <td width="80" align="center"><b>顧客氏名</b></td>   
  5.   <td width="200" align="center"><b>住所</b></td>   
  6.  </tr>   
  7.    
  8.    
  9.   <td align="center">00000001</td>   
  10.   <td align="center">terasoluna1</td>   
  11.   <td align="center">東京都中央区</td>   
  12.    
  13.   <td align="center">00000002</td>   
  14.   <td align="center">田中</td>   
  15.   <td align="center">東京都中央区</td>   
  16.    
  17.   <td align="center">00000003</td>   
  18.   <td align="center">鈴木</td>   
  19.   <td align="center">東京都中央区</td>   
  20.    
  21.   <td align="center">00000004</td>   
  22.   <td align="center">高橋</td>   
  23.   <td align="center">千葉県成田市</td>   
  24.    
  25.   <td align="center">00000005</td>   
  26.   <td align="center">小池</td>   
  27.   <td align="center">東京都中央区</td>   
  28.    
  29.   <td align="center">00000006</td>   
  30.   <td align="center">鈴木</td>   
  31.   <td align="center">東京都足立区</td>   
  32.    
  33.   <td align="center">00000007</td>   
  34.   <td align="center">佐藤</td>   
  35.   <td align="center">東京都国立市</td>   
  36.    
  37.   <td align="center">00000008</td>   
  38.   <td align="center">青木</td>   
  39.   <td align="center">東京都渋谷区</td>   
  40.    
  41.   <td align="center">00000009</td>   
  42.   <td align="center">山本</td>   
  43.   <td align="center">東京都中野区</td>   
  44.    
  45.   <td align="center">00000010</td>   
  46.   <td align="center">山下</td>   
  47.   <td align="center">東京都三鷹市</td>   
  48.    
  49. </table>   

2010年11月9日火曜日

Mayaa 値の挿入

Mayaaについて書いてみる。

まあ、に書いてあるんだけど、
ここには、目的別に書いてみる。


セッション中の値を表示する



●表示

  1. ようこそ○○さん  



みたいな出力をしたい場合があります。
もちろん、「○○」はセッション中の動的な値で。

そういうときは、

前提

  • セッション中にuserInfoオブジェクトが存在する

  • userInfoにはuserName属性があり、そのgetter/setterが存在する(この場合setterは関係ないかも)

  • ちなみにuserNameはjava.lang.String型である



●html

  1. ようこそ<span m:id="userName">○○</span>さん  



などと書きます。
もちろん、htmlの先頭には、


  1. <html lang="ja" xmlns:m="http://mayaa.seasar.org">  



と書いておきます。

で、mayaaファイルには


  1. <m:write m:id="userName" value="${session.userName}" />  


javascript:void(0)
って書けばOKです。


value属性にセッション中の値を表示する



上では要素として?の出力を書きましたが、
属性値に書きたい場合もありますね。

こんな場合を想定↓

●表示は省略。
テキストボックス中のvalueに出力したい場合

1. 想定するケースとしては、入力画面でsubmitしたあと、入力エラーがあって、画面を再表示する場合
2. 変更画面で、現在の値を入力しておいてあげる優しさを見せたいとき


そういうときは、

前提

  • セッション中にuserInfoオブジェクトが存在する

  • userInfoにはuserName属性があり、そのgetter/setterが存在する(この場合setterは関係ないかも)

  • ちなみにuserNameはjava.lang.String型である



●html
  1. 変更後のユーザ名: <input type="text" name="updateUserName" size="20" value="" m:id="userName">  


などと書きます。

で、mayaaファイルには


  1. <m:echo m:id="userName">  
  2.   <m:attribute name="value" value="${session.userName}" />  
  3. </e:echo>  



って書けばOKです。
これで、valueの中に動的な値を出力できます。

2010年11月3日水曜日

Javaテンプレートエンジン [Mayaa]

pythonとか使ってて思うことですが、
強力なテンプレートエンジンがあるってことは
その言語の魅力だなーと。

で、Javaには無いのかーってことで
Mayaa

結構気になってたんだけど
なかなか使う機会なく,,,


ちゃんとドキュメント読んだのは初めてですが、
これはいい!と思ったのはレイアウト。

レイアウト共有

JSPだと、各ページ共通のものをincludeでガチガチ書かないとダメですが、
このレイアウトの発想を待ってました!

要は、基本となるlayout.htmlがあって、
各ページで異なる部分をそこにインサートしていく、と。


詳細は次回。