sbt -> sbt + jetty -> sbt + jetty + lifthtml
本章的示例代碼在:http://git.oschina.net/yangbajing/lift-book/tree/master/examples/lift-blankjava
詳細內容請讀附錄A. 使用Sbtgit
如今咱們重頭開始創建一個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
進行 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 sbt
:apache
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.scala
,Build.scala
,Dependencies.scala
,plugins.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))) }
webProject
和myProject
是兩個幫助函數,用以方便配置web項目和sbt項目。以後章節對此會有詳細說明。如今須要知道的是若你只是想建立一個sbt
項目,那使用myProject
。若建立的是一個web
項目,就必需得使用webProject
。
其它配置文件請看源碼,註釋有較詳細的說明。
在本節,你將學會添加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實戰之旅……
完整代碼在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/
瞧瞧,你會看到輸出了當前時間和一段話。接下來,讓我給你娓娓道來 這些是怎樣呈現的。
http://localhost:48080/index
class="lift:helloWorld.howdy
,根據 helloWorld.howdy
找到相應類的相應方法就是: code.snippet.HelloWorld.howdy
data-lift="HelloWorld",根據
HelloWorld找到相應類的相應方法就是:
code.snippet.HelloWorld.render`class="lift:surround?with=default;at=content"
打開 templates-hidden/default.html
模板。 with=default
指定把尋找哪一個模板, at=content
設置將當前內容插入到模板的 id=content
片斷中。下面咱們來簡單的說說 Lift
的 snippet
機制。Snippet,就是「片斷」。Lift把Web頁面分紅一個一個的片斷,就像傳統的 GUI 開發同樣一個窗口上面由不少的控件組成。而這個Snippet能夠很大,它裏面包含了table, input, textarea等html標籤;也能夠很小,只是輸出一句話!
下載整個完整的lift-book
,定位到examples/lift-blank
目錄。執行如下命令:
./sbt