002-搭建Liftweb項目

搭建Lift項目

sbt -> sbt + jetty -> sbt + jetty + lifthtml

本章的示例代碼在:http://git.oschina.net/yangbajing/lift-book/tree/master/examples/lift-blankjava

安裝Sbt

詳細內容請讀附錄A. 使用Sbtgit

建立sbt工程

如今咱們重頭開始創建一個lift項目,首先須要建立一個sbt工程。咱們創建工程目錄在:/data/lift-book/examples/lift-blank,並創建目錄結構以下:github

.
├── project
│   ├── Build.scala
│   ├── BuildSettings.scala
│   ├── Dependencies.scala
│   └── plugins.sbt
├── sbt
├── sbt-launch-0.13.0.jar
├── sbt.bat
└── src
    ├── main
    │   ├── scala
    │   │   ├── bootstrap
    │   │   │   └── liftweb
    │   │   │       └── Boot.scala
    │   │   └── code
    │   │       ├── comet/
    │   │       ├── helper/
    │   │       ├── model/
    │   │       └── snippet/
    │   └── webapp
    │       └── WEB-INF
    │           └── web.xml
    └── test
        └── scala/

以後章節咱們將基於此項目進行功能擴展。讓咱們先來實習那些 .scala.sbt.xml等文件吧。web

下載sbt

進行 lift-blank 工程目錄:shell

wget -c http://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/sbt-launch/0.13.0/sbt-launch.jar
mv sbt-launch.jar sbt-launch-0.13.0.jar

建立sbt啓動腳本,併爲其添加可執行權限chmod +x sbtapache

SBT_OPTS="-Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M"
java $SBT_OPTS -jar `dirname $0`/sbt-launch-0.13.0.jar "$@"

工程配置文件

sbt有兩種配置文件形式,咱們採用.scala配置文件形式。如今project目錄中分別建立:BuildSettings.scalaBuild.scalaDependencies.scalaplugins.sbt文件。咱們在BuildSettings.scala文件中保存一些全局配置薦、Build.scala文件是實際的配置功能文件、Dependencies.scala將保存全部的依賴jar包、plugins.sbt是sbt的插件配置文件。bootstrap

首先來看看Build.scala文件內容:瀏覽器

object Build extends Build {
  import BuildSettings._
  import Dependencies._

  override lazy val settings = super.settings :+ {
    shellPrompt := (s => Project.extract(s).currentProject.id + " > " )
  }

這裏配置在sbt終端顯示的前導符號。服務器

lazy val blank = webProject("blank", file("."), 48080)
    .settings(
    description := "Liftweb-blank")

這裏設置項目名稱爲blank,目錄爲當前路徑,Web服務端口爲48080。

private def webProject(id: String, base: File, iPort: Int): Project = {
    import com.earldouglas.xsbtwebplugin.{WebPlugin, PluginKeys}
    myProject(id, base)
      .settings(WebPlugin.webSettings: _*)
      .settings(
      PluginKeys.port in WebPlugin.container.Configuration := iPort,
      libraryDependencies ++= (container(_servlet30) ++ container(_jetty) ++ compile(_liftweb)))
  }

  private def myProject(id: String, base: File): Project =
    Project(id, base)
      .settings(basicSettings: _*)
      .settings(
      resolvers ++= Seq(
    "releases" at "http://oss.sonatype.org/content/repositories/releases",
    "Typesafe Repository" at "http://repo.typesafe.com/typesafe/releases/",
    "snapshots" at "http://oss.sonatype.org/content/repositories/snapshots",
    "Typesafe Snapshots" at "http://repo.typesafe.com/typesafe/snapshots/"),
      libraryDependencies ++= (
        test(_scalatest)))

}

webProjectmyProject是兩個幫助函數,用以方便配置web項目和sbt項目。以後章節對此會有詳細說明。如今須要知道的是若你只是想建立一個sbt項目,那使用myProject。若建立的是一個web項目,就必需得使用webProject

其它配置文件請看源碼,註釋有較詳細的說明。

導入Lift支持

在本節,你將學會添加Jetty以使sbt項目支持Web開發。還將學會在在scala裏寫Servlet並添加Lift支持

要使用sbt工程支持web開發,須要爲sbt配置一個插件:xsbtwebplugin,官方網站在:xsbt-web-plugin。爲sbt配置此插件很是簡單,首先在project/plugins.sbt文件中爲其指定插件下載位置:

addSbtPlugin("com.earldouglas" % "xsbt-web-plugin" % "0.4.2")

(注:在.sbt配置文件中,每一個配置項<就是每一行>之間必需用空行分隔。)

回頭咱們在看project/Build.scala配置文件中的webProject幫助函數:

private def webProject(id: String, base: File, iPort: Int): Project = {
    import com.earldouglas.xsbtwebplugin.{WebPlugin, PluginKeys}
    myProject(id, base)
      .settings(WebPlugin.webSettings: _*)
      .settings(
      PluginKeys.port in WebPlugin.container.Configuration := iPort,
      libraryDependencies ++= (container(_servlet30) ++ container(_jetty) ++ compile(_liftweb)))
  }

能夠看到,.settings(WebPlugin.webSettings: _*)一行導入了xsbt-web-plugin配置。PluginKeys.port指定web服務器的運行端口號。而libraryDependencies添加了jar包依賴,分別是:servlet、jetty和liftweb。如今一個支持Liftweb開發的sbt工程就配置完成,接下來咱們將進入lift實戰之旅……

簡單的說說Lift

完整代碼在examples/lift-blank/src/main/webapp/WEB-INF/web.xml

Lift程序不須要一大堆的xml或XXX文件來進行配置,它只要在web.xml中寫上一個Filter就行:

<filter>
  <filter-name>LiftFilter</filter-name>
  <filter-class>net.liftweb.http.LiftFilter</filter-class>
</filter>

<filter-mapping>
  <filter-name>LiftFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

固然,也不是說Lift就不能定置了。它也是能夠定製的,並且定製選項很是的豐富。Lift全部的環境定製均可以放到 bootstrap.liftweb.Boot 類中進行。咱們在 Boot.boot() 方法中配置咱們的Lift應用環境。(注:關於配置內容,請看代碼)

對於任何Web程序來講,咱們都須要從瀏覽器(或其它的什麼東西)訪問它。這裏,就涉及到一個頁面路徑分發的問題! Lift是View First(視圖優先)的框架,它不一樣於通常的MVC模型。Lift沒有控制器,用戶訪問的URI是什麼,它就返回什麼!好比說 用戶訪問: http://localhost:8081/first/index 這個路徑,Lift就會訪問磁盤上實際的 /first/index.html(或者.htm)文件。不像Servlet,你須要配置一個<servlet-mapping>去進行地址映射。這就是View First,一句話:你訪問的URI就是視圖,不是控制器!

(注:Lift也支持URI Rewrite和Rest API機制,並且實現是那麼的簡潔,一致和強大!後面的部分會講到。)

對於咱們的第一個程序,你能夠在sbt console中使用 container:start 命令啓動 jetty。

$ ./sbt
[info] Loading project definition from /data/workspace/lift-book/examples/lift-blank/project
[info] Set current project to blank (in build file:/data/workspace/lift-book/examples/lift-blank/)
blank > container:start
[warn] o.e.j.w.WebAppContext@11ae80fa{/,null,null} contextPath ends with /
[warn] Empty contextPath
[info] jetty-9.0.5.v20130815
[info] NO JSP Support for /, did not find org.apache.jasper.servlet.JspServlet
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
[info] Started o.e.j.w.WebAppContext@11ae80fa{/,[file:/data/workspace/lift-book/examples/lift-blank/src/main/webapp/],AVAILABLE}
[info] Started NetworkTrafficSelectChannelConnector@153a859b{HTTP/1.1}{0.0.0.0:48080}
[success] Total time: 2 s, completed 2013-9-5 0:55:52
blank >

如今讓咱們訪問 http://localhost:48080/ 瞧瞧,你會看到輸出了當前時間和一段話。接下來,讓我給你娓娓道來 這些是怎樣呈現的。

  1. 訪問 http://localhost:48080/index
  2. Lift解析index.html
  3. 找到 class="lift:helloWorld.howdy ,根據 helloWorld.howdy 找到相應類的相應方法就是: code.snippet.HelloWorld.howdy
  4. 找到 data-lift="HelloWorld",根據 HelloWorld找到相應類的相應方法就是:code.snippet.HelloWorld.render`
  5. Lift從 class="lift:surround?with=default;at=content" 打開 templates-hidden/default.html 模板。 with=default 指定把尋找哪一個模板, at=content 設置將當前內容插入到模板的 id=content 片斷中。

下面咱們來簡單的說說 Liftsnippet 機制。Snippet,就是「片斷」。Lift把Web頁面分紅一個一個的片斷,就像傳統的 GUI 開發同樣一個窗口上面由不少的控件組成。而這個Snippet能夠很大,它裏面包含了table, input, textarea等html標籤;也能夠很小,只是輸出一句話!

看看效果

下載整個完整的lift-book,定位到examples/lift-blank目錄。執行如下命令:

./sbt
相關文章
相關標籤/搜索