SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

近未来の技術トレンドを先取り! 「Tech-Sketch」出張所

ScalaのWebアプリケーションフレームワーク「Play Framework」入門
~(3)CRUD操作を行うWebアプリケーションの作成 後編

近未来の技術トレンドを先取り! 「Tech-Sketch」出張所 第14回

簡単アプリの開発(5)

(5)ナビゲータの追加

 最後に、各画面を行き来できるように画面上部にナビゲータを追加しておきましょう。

 イベント登録画面には「検索」「登録」のラベルを表示し、「登録」をアクティブにします。

[View]eventCreatescala.html(/app/views/event)

<ul class="nav nav-tabs">
  <li>
    <a href="@controllers.event.routes.EventSearch.index()" data-toggle="tab">検索</a>
  </li>
  <li class="active">
    <a href="#" data-toggle="tab">登録</a>
  </li>
</ul>

 イベント検索画面にも「検索」「登録」のラベルを表示し、「検索」をアクティブにします。

[View]eventSearch.scala.html(/app/views/event)

<ul class="nav nav-tabs">
  <li class="active">
    <a href="#" data-toggle="tab">検索</a>
  </li>
  <li>
    <a href="@controllers.event.routes.EventCreate.index()" data-toggle="tab">登録</a>
  </li>
</ul>

 イベント更新画面には「検索」「登録」「更新」のラベルを表示し、「更新」をアクティブにします。

[View]eventUpdate.scala.html(/app/views/event)

<ul class="nav nav-tabs">
  <li>
    <a href="@controllers.event.routes.EventSearch.index()" data-toggle="tab">検索</a>
  </li>
  <li>
    <a href="@controllers.event.routes.EventCreate.index()" data-toggle="tab">登録</a>
  </li>
  <li class="active">
    <a href="#" data-toggle="tab">更新</a>
  </li>
</ul>

(6)SQLログの出力

 イベント検索一覧機能の実装でSQLログの出力方法を紹介しましたので、その他のSQLログの出力方法も紹介しておきます。SELECT分は「selectStatement」で取得することができました。INSERT文は「insertStatement」、UPDATE文は「updateStatement」、DELETE文は「deleteStatement」で取得できます。「Events」オブジェクトに実装すると、次のようになります。

INSERT文のログを出力する

/** 登録 */
def create(e: EventRow) = database.withTransaction { implicit session: Session =>
  Logger.debug(Event.insertStatement)
  Event.insert(e)
}

UPDATE文のログを出力する

/** 更新 */
def update(e: EventRow) = database.withTransaction { implicit session: Session =>
  val q = Event.filter(_.id === e.id)
  Logger.debug(q.updateStatement)
  q.update(e)
}

DELETE文のログを出力する

/** 削除 */
def delete(id: Int) = database.withTransaction { implicit session: Session =>
  val q = Event.filter(_.id === id)
  Logger.debug(q.deleteStatement)
  q.delete
}

 アプリケーションを動かして、SQLを確認してみましょう。ログは「activator run」を実行したコマンドプロンプト上でも確認できますし、「application.log」とうファイル名でプロジェクト配下の「logs」ディレクトリに出力されているログファイルからも確認できます。

 例えば、前回作成したイベント登録機能の登録処理を実行すると以下のようなSQLが発行されています。

insert into "TECHAPP"."EVENT" ("EVENT_ID","EVENT_NM")  values (?,?)

 登録処理でケースクラスは「EventRow(0, form.eventId, form.eventNm)」として作成しました。EventRowの「ID」は自動採番(AutoInc)項目のため、仮の値「0」を設定したのを覚えてますでしょうか? 発行されたSQLを確認すると、上記のように、INSERT文では指定されていないことが分かります。正しく自動採番されていることでしょう。

 Play2ではデフォルトのログレベルが「DEBUG」レベルに設定されていますので、上記のように「Logger.debug」で実装したSQLログが出力されました。出力したくない場合は、「application.conf」の「logger.application」に設定してあるログレベルを変更すれば出力を抑制できます。「INFO」レベルに設定したい場合は以下のよう記述します。

application.conf.scala(/conf)

# Logger
# ~~~~~
# You can also configure logback (http://logback.qos.ch/),
# by providing an application-logger.xml file in the conf directory.

# Root logger:
logger.root=ERROR

# Logger used by the framework:
logger.play=INFO

# Logger provided to your application:
logger.application=INFO

 以下の設定を追加することで、Slickのデバッグログを出力することもできます。

logger.scala.slick.jdbc.JdbcBackend.statement=DEBUG

 これでイベント管理アプリが完成しました。2回に分けて、Play2とSlickの基本的な使い方を紹介するため、登録・検索・更新・削除を行う最低限の機能だけを実装しました。お気づきのとおり、入力チェックもなければ、処理結果のメッセージ表示もありません。DBトランザクション境界はどこにあって、異常終了した時のテーブルのデータはどうなっているのか? 実際のアプリケーションとして利用するために考慮しておかなければいけないこと、実装しておくべきことはたくさんあります。見た目ももう少し良くしたいですね。今後、そのあたりも少しずつ紹介していきたいと考えています。

 最後に、もっとScalaの話が聞きたい、Scalaの話をしてみたいという方にお知らせです。

 9月6日、7日の2日間、「Enjoy.scala」をテーマにScalaのカンファレンス「ScalaMatsuri2014」が開催されます。Scala作者であるMartin Odersky教授をはじめ、多くの講演が予定されています。また、企業スポンサーや一般講演枠としてのスピーカーも絶賛募集中です。詳しくは「ScalaMatsuri2014」公式サイトをご覧ください。

 なお、今回作成した「イベント管理アプリ」のソースコードはGitHubで公開しています。

 次回は、クラウド基盤ソフトウェアであるOpenStackの構築方法について紹介します。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
近未来の技術トレンドを先取り! 「Tech-Sketch」出張所連載記事一覧

もっと読む

この記事の著者

前出 祐吾(TIS株式会社)(マエデ ユウゴ)

TIS株式会社 コーポレート本部 戦略技術センター所属。これまで社内向けWebアプリケーションフレームワークの開発やJenkinsの活用を中心に様々な手段で開発の効率化を図ってきた。現在は、さらに革命的な効率化を目指し、Scalaを活用した次世代開発基盤の研究&開発に従事している。システム開発は、泥...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/7817 2014/06/20 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー