イベントリスナの中でデータベースへアクセスするほか、EL 表記の使用で、データベースに通信し、属性の値を取得するのは一般的です。
以下の例は、EL 表記を使用して、データベースから取得したデータをlistboxに表示します。
<zscript>
import my.CustomerManager;
customers = new CustomerManager().findAll(); //load from database
</zscript>
<listbox id="personList" width="800px" rows="5">
<listhead>
<listheader label="Name"/>
<listheader label="Surname"/>
<listheader label="Due Amount"/>
</listhead>
<listitem value="${each.id}" forEach="${customers}">
<listcell label="${each.name}"/>
<listcell label="${each.surname}"/>
<listcell label="${each.due}"/>
</listitem>
</listbox>
findAll メソッドを実装する方法はいくつかあります。
findAll メソッドですべてのデータを取得する最も簡単な方法は、データをリストにコピーし、コネクションを閉じます。
public class CustomerManager {
public List findAll() throws Exception {
DataSource ds = (DataSource)new InitialContext()
.lookup("java:comp/env/jdbc/MyDB");
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
List results = new LinkedList();
try {
conn = ds.getConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery("SELECT id, name, surname FROM customers");
while (rs.next()) {
long id = rs.getInt("id");
String name = rs.getString("name");
String surname = rs.getString("surname");
results.add(new Customer(id, name, surname));
}
return results;
} finally {
if (rs != null) try { rs.close(); } catch (SQLException ex) [}
if (stmt != null) try { stmt.close(); } catch (SQLException ex) [}
if (conn != null) try { conn.close(); } catch (SQLException ex) [}
}
}
}
ビューと Java コードを混在に使用しないで、init コマンドを使用してデータを読み込むことができます。
<?init class="my.AllCustomerFinder" arg0="customers"?>
<listbox id="personList" width="800px" rows="5">
<listhead>
<listheader label="Name"/>
<listheader label="Surname"/>
<listheader label="Due Amount"/>
</listhead>
<listitem value="${each.id}" forEach="${customers}">
<listcell label="${each.name}"/>
<listcell label="${each.surname}"/>
<listcell label="${each.due}"/>
</listitem>
</listbox>
そして、my.CustomerFindAll クラスを org.zkoss.zk.ui.util.Initiator インターフェースを使用して、実装します。
import org.zkoss.zk.ui.Page;
import org.zkoss.zk.ui.util.Initiator;
public class AllCustomerFinder implements Initiator {
public void doInit(Page page, Object[] args) {
try {
page.setVariable((String)args[0], new CustomerManager().findAll());
//Use setVariable to pass the result back to the page
} catch (Exception ex) {
throw UiException.Aide.wrap(ex);
}
}
public void doCatch(Throwable ex) { //ignore
}
public void doFinally() { //ignore
}
}