( ꒪⌓꒪) ゆるよろ日記

( ゚∀゚)o彡°オパーイ!オパーイ! ( ;゚皿゚)ノシΣ フィンギィィーーッ!!!

StAX上でMySQLとScalaでTropyクローンを動かしてみるんだぜ。

しばらくLiftってなかったので、Liftネタをやりますよー。
今回は、StAXScalaっていうかLiftを動かしてみるって企画なんだ。
ついでに、StAXで提供されているMySQLも使ってみようぜって勢いで。


StAXについては、以前のエントリ をみてくださいねぇ。


動かすアプリは、前に作ったTropyクローンのLift版(Liftropy)。
詳しくはこちらのエントリで。
Scala勉強会@関東#2でLiftについて発表してきたんだぜ? - ゆろよろ日記
liftropy/target at master · yuroyoro/liftropy · GitHub

scala2.7.1とLift 0.9で動いてます。
Liftの最新版でやろうと思ったけどめんどくさいので。


scalaで書かれているからって、コンパイル済みのclassファイルとscalaのjarがWEB-INF/libに入ってりゃ動くだろうと思ってやってみたら、そのとおりですぐに動いたよ。


これが動いてるものです。


f:id:yuroyoro:20090205161058p:image
http://liftropy.yuroyoro.staxapps.net/

手順

StAX上でプロジェクトを作ります。
作ったら落としてきます。
やりかたはこっち 見てね。


で、前作ったLiftropyからsrc/main/をコピって、落としてきたプロジェクトのsrc/mainにコピります。
pom.xmlもコピっておきます。


MySQLを使うので、まずはpom.xmlを修正します。dependencyにMySQLのDriverを追加です。

    <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.0.4</version>
    </dependency>

StAXMySQLのDBを作成する。

StAXにログインすると、左のメニューに"Create DB"ってのがあるんでぽちっとなします。


f:id:yuroyoro:20090205161152p:image


DB名とユーザ名、パスワードを入力すると、DBができますよ。


f:id:yuroyoro:20090205161252p:image

DBの設定をする

で、作ったDBにアプリケーションから接続するには、web.xmlを追加してDataSourceを取得してつなぐわけです。


なので、web.xmlにこいつを追加。

<resource-ref>
 <res-ref-name>jdbc/DB名</res-ref-name>
 <res-type>javax.sql.DataSource</res-type>
 <res-auth>Container</res-auth>
</resource-ref>


ってか、DBはIPとポートが公開されているので、コマンドラインからも接続できるよ。


あと、ローカルの開発環境でもDBを使えるように、conf/stax-application.xmlに以下のように追加します。

<resource name="jdbc/DB名" auth="Container" type="javax.sql.DataSource">
 <param name="username" value="ユーザー名" />
 <param name="password" value="パスワード" />
 <param name="url" value="jdbc:stax://DB名" />
</resource>


LiftからMySQLを使うには、Boot.scalaをいじります。これでContextからDataSourceをLookupして、Liftで使えるようになります。

object DBVendor extends ConnectionManager {
  def newConnection(name: ConnectionIdentifier): Can[Connection] = {
    try {
      var ctx:Context= new InitialContext()
      var obj =  ctx.lookup("java:comp/env/jdbc/DB名")
      var ds:DataSource = obj.asInstanceOf[DataSource]
      var conn = ds.getConnection()

      Full(conn)
    } catch {
      case e : Exception => e.printStackTrace; Empty
    }
  }
  def releaseConnection(conn: Connection) {conn.close}
}

ビルドしてローカルで動かす。

ここまでできたらコンパイルします。コンパイルは、StAXSDKでやるとscalaがコンパイルできないので、コピってきたpom.xmlを利用してmavenでやります。mvn packageって打つんだぜ。


できあがったものがtraget/以下にあるので、丸ごとコピーして、プロジェクトディレクトリ配下のwebappディレクトリを置き換えます。


ここまでやったら準備OK。ローカルでstax runでアプリを起動すると、ちゃんとDBガ使える。

デプロイする

StAXSDKを利用して、deployコマンドでStAX上にアプリをデプロイします。

 stax deploy -u ユーザー名 -p パスワード

デプロイが終わったら、アプリのURLにアクセスすると動いているのが確認できます。
デプロイの時に、ローカルのDBに登録したレコードも一緒にサーバ上にあがるようです。


以上でおしまい。思ったより簡単だった。