データベースのレコードを取得する
とりあえずデータベースの内容を編集するなどの管理機能が必要となるときは、このscaffoldが十分な機能を提供してくれることが分かりました。しかし、実際にアプリケーション内でデータベースを利用するには、プログラム内からデータベースにアクセスする方法を理解しておかなければいけません。
まずは、データベースからレコードの一覧を取得し、表示することからやってみましょう。これはindexアクションに実装することにします。BoardsControllerを次のように修正しましょう。
class BoardsController {
def index = {
[tableData: Boards.list()]
}
}
scaffoldは使わないため、先に記述したscaffoldプロパティは削除します。そして、indexにレコード一覧を取得する処理を記述します。といっても、書いてあるのはわずか1行にすぎません。
レコード一覧の取得は、ドメインクラスにある「list」メソッドを呼び出すだけです。Grailsでは、コントローラーからドメインクラス名をてそのまま指定し利用できるようになっています。ここではBoardsクラスとしてドメインクラスが用意されていますから、Boards.list()とすればBOARDSテーブルのレコード一覧が取り出せてしまうのです。これをtableDataに設定してビューに渡せば、後はビュー側でtableDataの値を取り出し、出力させていくだけです。
テーブルを表示する
では、ビューを作成しましょう。「views」内に「boards」というフォルダが自動生成されて言るはずなので、この中に「index.gsp」というファイルを作成し、次のように記述します(文字コードをUTF-8にするのを忘れずに)。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Boards Index</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<style type="text/css">
h1 {background:#AAAAFF; font-size: 12pt; padding: 3px;}
h2{font-size: 12pt; font-weight: bold;}
p{color:#000066; font-size:10pt;}
table{background: #CC6666;}
td{border-style:solid;border-width:2pt; border-color:#DDDDDD;
background-color:#FFFFFF;padding:2pt;}
</style>
</head>
<body>
<h1>Grails Boards</h1>
<h2>テーブルの一覧リスト</h2>
<table>
<g:each in="${tableData}" status="i" var="record">
<tr>
<td>${record.id}</td>
<td>${record.name}</td>
<td>${record.title}</td>
</tr>
</g:each>
</table>
</body>
</html>
できあがったら、サーバを起動し、boards/indexにアクセスしてみましょう。登録したレコードの一覧が表示されます。

<g:each>による繰り返し処理
このGSPでは、2つの重要なポイントがあります。1つ目は、「繰り返し処理のためのタグ」の使用です。ここでは、<g:each>というタグを使っています。これは、</g:each>までの部分を繰り返し出力する働きを持つもので、次のように記述をします。
<g:each in="配列" status="変数" var="変数"> ……繰り返す内容…… </g:each>
属性:
- 「in」-配列データ。ここから順に値を取り出していきます。
- 「status」-繰り返し回数を示すための変数を用意します。
- 「var」-inで指定した配列から取り出した値がこれに設定されます。
ここでは、Boards.listで取得したデータを変数に設定していました。この繰り返しにより、tableDataから1つずつレコードのデータが取り出され、変数recordに設定されるというわけです。
では、取り出されたレコードデータから、各フィールドの値を取り出すにはどうするのか。これは非常に単純です。record.idというように、取り出すフィールド名を指定すればよいのです。レコードデータは、各フィールド名をキーとするマップの形になっています。従って、例えばIDの値を取り出したければ、record['id']またはrecord.idとすればよいのです。
レコードの追加
続いて、新たにレコードを作成しテーブルに保存する処理を考えてみましょう。これはaddアクションとして用意します。まずは、ビューから用意しましょう。「views」内の「boards」内に「add.gsp」というファイルを新たに作成し、ボディ部分を次のように記述します(ヘッダーその他はindex.gspと同様でかまいませんが、<title>ぐらいは変えておくとよいでしょう)。
<body> <h1>Grails Boards</h1> <h2>レコードの追加</h2> <g:form controller="boards"> <table> <tr> <td>NAME</td> <td><g:textField name="name" /></td> </tr> <tr> <td>TITLE</td> <td><g:textField name="title" /></td> </tr> <tr> <td>CONTENT</td> <td><g:textArea name="content" cols="20" rows="2" /></td> </tr> <tr><td></td> <td><g:actionSubmit value="CREATE" action="add"/></td> </tr> </table> </g:form> </body>
ここでは、boardsのaddに送信するフォームを1つ用意してあります。name、title、contentという名前の3つの入力項目が用意されています。これらの名前は、Boardsテーブルの各フィールドと同じになっていますが、これは重要です。
