Lift2.2 + seedo = DB

Posted 2011年2月6日 by

Lift2.2 の中から seedo1.1 によってOracle11g に接続しました。

Liftの良さは、DBを意識しなくてもアプリケーションを作ることができるのですが、
DBを意識してアプリケーションを作りたいときもあるわけです。
LiftやRuby on Railsのように処理や画面を中心にアプリケーションを作るのではなく、
データベースを設計して、データベースを中心にアプリケーションを作るという主義です。

Liftを使ってきた人からは、「意味ないじゃん」といわれそうですが、、、

Lift2.2
Lift2.2のインストールは、

http://liftweb.net/downloadに行って、
Lift 2.2 release Tar or Zip. からZIPファイルをダウンロードします。

ZIPファイルを展開すると4つのフォルダがあります。
ここでは、lift_basicを使います。

lift_basicフォルダの中は、

コマンドラインで次のコマンドを実行します。

sbt update ~jetty-run

コマンドラインで次のように表示したら
[info] Started SelectChannelConnector@0.0.0.0:8080
[info] == jetty-run ==
[success] Successful.

ブラウザから http://localhost:8080 にアクセスして次の画面が表示したらインストールは成功。

seedo framewark
ここからが、seedo framewarkを使ってプログラムを作ります、

lift_basic/src/main/scala/code/snippet/ フォルダに、HelloDb.scala ファイルを作ります。


package code {
package snippet {
	import _root_.scala.xml.{NodeSeq, Text}
	import _root_.net.liftweb.util._
	import _root_.net.liftweb.common._
	import _root_.java.util.Date
	import code.lib._
	import Helpers._
	import scala.collection.immutable._
	import scala.xml._
	import seedo.database._

	class HelloDb {
		def recx(record:Array[Any]) :Node =  {
			var nodes  = Queue.empty[Node]
			record.foreach{(fx) => nodes += <TD>{fx}</TD>}
			return <TR>{nodes}</TR>
		}
		def tb = {
			val sql = new Db
			val re = sql.executeQuery("select * from emp order by ename")
			sql.close
			var nodes  = Queue.empty[Node]
			re.foreach{(rec) => nodes += recx(rec)}
			"#list *" #> <table>{nodes}</table>
	  }
	  def title(xhtml:NodeSeq) = Text("タイトルA")
	}
}
}

次に、lift_basic/src/main/webapp/ フォルダにある index.html ファイルを次のように書き換えます。
「span class=”lift:helloDb.tb”」によって先ほどのHelloDb クラスのtb関数が呼び出されます。


<!DOCTYPE html>
<html>
  <head>
    <meta content="text/html; charset=UTF-8" http-equiv="content-type" />
    <title>Home</title>
<SCRIPT>
</SCRIPT>
  </head>
  <body class="lift:content_id=main">
    <div id="main" class="lift:surround?with=default;at=content">
      <h2>Welcome to your project!</h2>
      <p>
	<span class="lift:helloWorld.howdy">
	  Welcome to your Lift app at <span id="time">Time goes here</span>
	</span>
<HR/>
	<span class="lift:helloDb.tb">
	  Get Emp Table <span id="list">EMP table list</span>
	</span>
      </p>
    </div>
  </body>
</html>

JARファイルは、lift_basic/lib_managed/scala_2.8.1/compile/フォルダに置きます。
OracleのJDBCドライバなら、
ojdbc6.jar
orai18n.jar

MySQLのJDBCドライバなら、
mysql-connector-java-5.1.8-bin.jar

seedo framewarkのJARは、
seedo-1.1.jar

env.propertiesファイルにDB接続の定義を記述します。
lift_basic/src/main/resources/フォルダにenv.propertiesファイルを置きます。


driver = oracle.jdbc.driver.OracleDriver
#driver = com.mysql.jdbc.Driver

#dsn = jdbc:mysql://192.168.0.100:3306/seedo?useUnicode=true&characterEncoding=UTF-8
dsn = jdbc:oracle:thin:@127.0.0.1:1521:ORCL
user = scott
password = tiger
connection-jndi = off

seedo framewarkには、データベースのコネクションプールを管理するクラスが定義されていますので、LiftのDBとは干渉することなく使うことができます。

Lift2.2の起動は、lift_basiceフォルダにて
以下のコマンドを実行します。

sbt ~jetty-run

ブラウザから次のURLをアクセスします。

http://127.0.0.1:8080/index

ブラウザ画面はこの通りです。

うまくいかない場合
sbt から jetty-run すると、

lift_basic/lib_managed/scala_2.8.1/compile/フォルダにあるjarファイルを
lift_basic/target/scala_2.8.1/webapp/WEB-INF/lib/フォルダにコピーし、

同様に、
lift_basic/src/main/webapp/ フォルダにある index.html ファイル
lift_basic/target/scala_2.8.1/webapp/フォルダにコピーします。

また、
lift_basic/target/scala_2.8.1/webapp/WEB-INF/classes/code/snippet/フォルダには、コンパイルされたHelloDb.classなどのclassファイルが置かれています。

オリジナルにあるファイルが、targetフォルダにコピーされないことがあるのでファイルの中身を見て確かめましょう。

もうひとつ、最初にLiftを起動し、サンプル画面を表示させ、

sbt update ~jetty-run

コマンドラインでEnterキーを押して、Jettyを終了した後は、

次のコマンドでJettyは起動します。

sbt ~jetty-run

update をコマンドイランに入れると、追加したJARファイルはなくなってしまい、インストールした状態に戻ります。
jetty-run したときに、エラーが表示されたときはJARファイルが無くなっています。

[info] Compiling main sources...
[error] C:\lift-lift_22_sbt-22a67aa\lift_basic\src\main\scala\code\snippet\Hello
Db.scala:11: not found: value seedo
[error]         import seedo.database._
[error]                ^
[error] one error found
[info] == compile ==

Post Details

コメントを残す