Spray.io嘗試 html
今天咱們在上一篇的基礎上添加集成Twirl模板功能以及怎樣去打包運行。 java
項目地址:http://git.oschina.net/for-1988/Simples/tree/master/SpraySimple
Twirl是 Play Framework 的scala默認模板引擎,它是能夠獨立運行在任何一個Scala項目中的,並不依賴任何Play的東西。Twirl受.NET MVC的Razor靈感啓發,語法跟Razor十分類似,寫.net的時候用過一次。感受很是不錯。Twirl模板經過sbt-twirl插件會被預先編譯成scala代碼,而後在咱們的代碼中能夠直接調用這個模板對象,給它參數,而後渲染。因此它並不依賴web環境,任何scala工程均可以直接使用。 git
添加sbt-twirl插件,咱們在工程的project中新增plugin-twirl.sbt文件 github
resolvers += Classpaths.sbtPluginSnapshots addSbtPlugin("io.spray" %% "sbt-twirl" % "0.7.0")
而後在build.sbt文件中,加入Twirl的配置 web
import twirl.sbt.TwirlPlugin.Twirl //... Other setting Seq(Twirl.settings: _*)
在工程中,添加source目錄 src.main.twirl 並建立index.scala.html文件 shell
path("html" / Segment) { message => get { respondWithMediaType(`text/html`) { encodeResponse(Gzip) { complete(page.html.index(message).toString()) } } } } ~
讓一個請求返回Html格式的代碼,只需經過respondWithMediaType來指定返回的Content-Type的值。 json
返回json的話,能夠讓咱們的類繼承於Json4sSupport,而後實現隱式方法 implicit def json4sFormats: Formats = DefaultFormats 就能夠了,可是這樣作若是你的一個處理類須要同時支持json跟html的話,就會出現問題。因此咱們下面作了一下簡單的封裝 app
import spray.routing._ import spray.routing.directives.RespondWithDirectives import spray.http.MediaTypes._ import spray.httpx.marshalling.Marshaller import spray.http.ContentTypes import org.json4s.native.Serialization import org.json4s.{DefaultFormats, Formats} import spray.httpx.encoding.Gzip import akka.actor.ActorSystem /** * Created by JiangFeng on 2014/4/29. */ trait DefaultDirectives extends Directives { this: RespondWithDirectives => implicit def json4sFormats: Formats = DefaultFormats def responseJson(obj: AnyRef): Route = { respondWithMediaType(`application/json`) { implicit def json4sMarshaller[T <: AnyRef] = Marshaller.delegate[T, String](ContentTypes.`application/json`)(Serialization.write(_)) complete { obj } } } def responseHtml(html: String)(implicit system: ActorSystem): Route = { respondWithMediaType(`text/html`) { encodeResponse(Gzip) { complete(html) } } } }
class IndexActor extends Actor with ActorLogging { override def receive = { case None => } } class IndexService(index: ActorRef)(implicit system: ActorSystem) extends DefaultDirectives { lazy val route = path("echo" / Segment) { message => get { responseHtml { page.html.index(message).toString() } } } ~ path("person") { get { responseJson { val person = new Person("Feng Jiang", 26) person } } } }
spray.io是經過main方法啓動,因此咱們須要將工程打包成Runable JAR。咱們須要藉助 sbt-assembly 插件。一樣的project 目錄中添加 plugin-assembly.sbt文件 ide
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.11.2")
咱們再在工程的根目錄下添加一個 assembly.sbt 文件 ui
import sbtassembly.Plugin._ import AssemblyKeys._ assemblySettings jarName in assembly := "SpraySimple.jar" name := "SpraySimple" version := "1.0" scalaVersion := "2.10.3" scalacOptions := Seq("-unchecked", "-deprecation", "-encoding", "utf8")而後進入工程的根目錄,也就是assembly文件所在的目錄。打開cmd的窗口,輸入
> sbt
而後執行 assembly 命令
sbt > assembly
而後,咱們能夠看到打包生成到的目錄 ~\target\scala-2.10 下面,執行該JAR文件
> java -jar SpraySimple.jar就能夠啓動咱們所寫的工程了。