対象読者
この記事を読むのに必要な知識を以下にまとめます。
- Java
- JavaScript
- jQuery、jQuery UI
- HTML、CSS
必要な環境
dataforms.jarを使用した開発では、以下を使用しています。
- JDK1.8
- Eclipse 4.5以上
- Tomcat 7以上
HtmlTableクラスの機能
dataforms.jarには<table></table>タグに対応するHtmlTableというクラスが用意されています。HtmlTableクラスのインスタンスには各種フィールドクラスを配置することができ、それに対応したリスト(List<Map<String, Object>>型のデータ)を、対応する<table></table>タグに展開する機能を持ちます。
まずテーブルクラスの動作を確認するために、以下の簡単なテーブルを配置したSimpleHtmlTableForm.javaを作成します。
package pagesample.page; import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import dataforms.controller.Form; import dataforms.field.base.FieldList; import dataforms.field.base.TextField; import dataforms.field.sqltype.IntegerField; import dataforms.field.sqltype.NumericField; import dataforms.htmltable.HtmlTable; /** * 単純なHTMLテーブルを配置したフォーム。 * */ public class SimpleHtmlTableForm extends Form { /** * コンストラクタ。 */ public SimpleHtmlTableForm() { super(null); FieldList flist = new FieldList(); flist.addField(new TextField("text1")).setSortable(true).setSpanField(true); flist.addField(new TextField("text2")).setSortable(true).setSpanField(true); flist.addField(new IntegerField("integer1")).setSortable(true).setSpanField(true); flist.addField(new NumericField("numeric1", 10, 2)).setSortable(true).setSpanField(true); HtmlTable table = new HtmlTable("simpleTable", flist); this.addHtmlTable(table); } /** * テーブルに表示するデータ。 */ private static final Object[][] DATA = { {"xxx", "yyy", Integer.valueOf(100), BigDecimal.valueOf(200.12)} , {"aaa", "bbb", Integer.valueOf(30), BigDecimal.valueOf(20.13)} , {"ccc", "ddd", Integer.valueOf(1000), BigDecimal.valueOf(2000.1)} , {"000", "001", Integer.valueOf(5), BigDecimal.valueOf(5.1)} , {"ggg", "hhh", Integer.valueOf(2), BigDecimal.valueOf(20.1)} }; @Override public void init() throws Exception { super.init(); // フォームに表示するデータを設定。 List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); for (Object[] r: DATA) { Map<String, Object> m = new HashMap<String, Object>(); int idx = 0; m.put("text1", r[idx++]); m.put("text2", r[idx++]); m.put("integer1", r[idx++]); m.put("numeric1", r[idx++]); list.add(m); } this.setFormData("simpleTable", list); } }
次に開発ツールの「ページJavaクラス作成」を使用し、以下のようにテーブル操作無し、フォーム無しのページを作成します。
このように作成したSimpleHtmlTablePage.javaのコンストラクタで、SimpleHtmlTableFormのインスタンスをSimpleHtmlTablePageに追加します。以下ソースの太字部分がこの修正です。
package pagesample.page; import dataforms.app.page.base.BasePage; import dataforms.dao.Dao; import dataforms.dao.Table; /** * ページクラス。 */ public class SimpleHtmlTablePage extends BasePage { /** * コンストラクタ。 */ public SimpleHtmlTablePage() { this.addForm(new SimpleHtmlTableForm()); } ・・・ 中略 ・・・ }
このソースをコンパイルした後、開発ツールの「Webリソース作成」でHTMLを作成すると以下の通りになります。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <div id="mainDiv"> <form id="simpleHtmlTableForm"> <div class="formHeader">xxx</div> <table class="responsive"> <tbody> </tbody> </table> <div class="hScrollDiv"> <table id="simpleTable"> <thead> <tr> <th> text1 </th> <th> text2 </th> <th> integer1 </th> <th> numeric1 </th> </tr> </thead> <tbody> <tr> <td> <span id="simpleTable[0].text1"></span> </td> <td> <span id="simpleTable[0].text2"></span> </td> <td> <span id="simpleTable[0].integer1"></span> </td> <td> <span id="simpleTable[0].numeric1"></span> </td> </tr> </tbody> </table> </div> </form> </div> </body> </html>
このHTMLにはidが"simpleTable"の<table></table>タグが出力されています。そのテーブルの中には1行分の<tr></tr>タグが出力されており、その中にはHtmlTableクラスで設定されたフィールドに対応した<span></span>タグが出力されています。フィールドに対応するタグが<span></span>になっているのは、HtmlTableに配置したフィールドに対しsetSpanField(true)というメソッドを呼び出し、<span></span>タグを出力するように設定しているからです。また、この<span></span>タグには"テーブルID[0].フィールドID"という形式のIDが設定されています。
HtmlTable.jsは複数行のリストをテーブルに表示する場合、この出力された1行分の<tr></tr>タグの内容を複製しデータを設定するようになっています。ただし各フィールドのID内の[]内は行インデックスが設定されます。つまり2行目のフィールドIDは"テーブルID[1].フィールドID"のようになります。このページを表示すると下図のようになります。このテーブル内の各フィールドは、setSortable(true)メソッドが呼び出されているため、カラムソートが可能になっています。
この状態だと数値項目も左寄せのままなので、以下の通り数値項目の<td></td>タグに右寄せのスタイルを設定します。
・・・ 前略 ・・・ <tbody> <tr> <td> <span id="simpleTable[0].text1"></span> </td> <td> <span id="simpleTable[0].text2"></span> </td> <td style="text-align: right;"> <span id="simpleTable[0].integer1"></span> </td> <td style="text-align: right;"> <span id="simpleTable[0].numeric1"></span> </td> </tr> </tbody> ・・・ 後略 ・・・
この修正を行ったページを表示すると、下図のようにinteger1とnumeric1の値が右寄せ表示になります。