首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Scala中引导web服务器

在Scala中引导web服务器
EN

Stack Overflow用户
提问于 2010-11-12 11:47:35
回答 8查看 5.6K关注 0票数 9

使用Python可以实现以下功能:

代码语言:javascript
复制
$ apt-get install python
$ easy_install Flask
$ cat > hello.py
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()
$ python hello.py

4条命令和7行代码让web服务器运行起来确实令人印象深刻。

Scala的等价物是什么?

EN

回答 8

Stack Overflow用户

发布于 2011-06-22 05:24:32

它使用JDK6中内置的HttpServer类。尽管提出改进建议,我还是个Scala新手。

代码语言:javascript
复制
package org.test.simplehttpserver

import java.net.InetSocketAddress
import com.sun.net.httpserver.{HttpExchange, HttpHandler, HttpServer}
import collection.mutable.HashMap

abstract class SimpleHttpServerBase(val socketAddress: String = "127.0.0.1",
                                    val port: Int = 8080,
                                    val backlog: Int = 0) extends HttpHandler {
  private val address = new InetSocketAddress(socketAddress, port)
  private val server = HttpServer.create(address, backlog)
  server.createContext("/", this)

  def redirect(url: String) =
    <html>
      <head>
          <meta http-equiv="Refresh" content={"0," + url}/>
      </head>
      <body>
        You are being redirected to:
        <a href={url}>
          {url}
        </a>
      </body>
    </html>

  def respond(exchange: HttpExchange, code: Int = 200, body: String = "") {
    val bytes = body.getBytes
    exchange.sendResponseHeaders(code, bytes.size)
    exchange.getResponseBody.write(bytes)
    exchange.getResponseBody.write("\r\n\r\n".getBytes)
    exchange.getResponseBody.close()
    exchange.close()
  }

  def start() = server.start()

  def stop(delay: Int = 1) = server.stop(delay)
}

abstract class SimpleHttpServer extends SimpleHttpServerBase {
  private val mappings = new HashMap[String, () => Any]

  def get(path: String)(action: => Any) = mappings += path -> (() => action)

  def handle(exchange: HttpExchange) = mappings.get(exchange.getRequestURI.getPath) match {
    case None => respond(exchange, 404)
    case Some(action) => try {
      respond(exchange, 200, action().toString)
    } catch {
      case ex: Exception => respond(exchange, 500, ex.toString)
    }
  }
}

class HelloApp extends SimpleHttpServer {
  var count = 0

  get("/") {
    "There's nothing here"
  }

  get("/hello") {
    "Hello, world!"
  }

  get("/markup") {
    <html>
      <head>
        <title>Test Title</title>
      </head>
      <body>
        Test Body
      </body>
    </html>
  }

  def countPage = <html>
    <head>
      <title>Test Title</title>
    </head>
    <body>
      Count:
      {count}<a href="/increaseCount">++</a>
      <a href="/decreaseCount">--</a>
      <a href="/resetCount">Reset</a>
    </body>
  </html>

  get("/count") {
    countPage
  }

  get("/resetCount") {
    count = 0
    redirect("/count")
  }

  get("/increaseCount") {
    count = count + 1
    redirect("/count")
  }

  get("/decreaseCount") {
    count = count - 1
    redirect("/count")
  }

  get("/error") {
    throw new RuntimeException("Bad bad error occurred")
  }
}

object Main {

  def main(args: Array[String]) {
    val server = new HelloApp()
    server.start()
  }
}
票数 11
EN

Stack Overflow用户

发布于 2010-11-12 12:19:11

您可能会发现Unfiltered值得一看。

票数 9
EN

Stack Overflow用户

发布于 2010-11-12 18:57:58

代码语言:javascript
复制
import org.scalatra._

class ScalatraExample extends ScalatraServlet {
  get("/") {
    <h1>Hello, world!</h1>
  }
}

无论如何,看看可用的Scala web frameworks

编辑

有一些关于准备好工具的容易程度的讨论,特别是关于Lift。我的大部分时间都花在试图弄清楚Sun的Java在包管理器中的位置。无论如何,一旦安装了Java,它就是这样运行的,省略了所有的消息,所以人们可以看到我实际上必须输入的内容:

代码语言:javascript
复制
dcs@dcs-desktop:~$ wget -q -O bin/sbt-launch.jar http://simple-build-tool.googlecode.com/files/sbt-launch-0.7.4.jar
dcs@dcs-desktop:~$ echo 'java -Xmx512M -jar `dirname $0`/sbt-launch.jar "$@"' > bin/sbt
dcs@dcs-desktop:~$ chmod u+x bin/sbt
dcs@dcs-desktop:~$ mkdir app
dcs@dcs-desktop:~$ cd app
dcs@dcs-desktop:~/app$ sbt
Project does not exist, create new project? (y/N/s) s
> *lifty is org.lifty lifty 1.4
> lifty create project-blank sample 2.1
> reload
> update
> jetty-run

在那里,web服务器正在运行。当然,你必须事先了解SBT和Lifty,才能知道你会使用它们来运行Scala Lift程序,但另一方面,我从来没有听说过Flask,所以我肯定会花更多的时间来弄清楚如何用Python运行web服务器应用程序,而不是去弄一个Lift应用程序。

我在第一次尝试时也没有得到正确的结果--我尝试使用Scala 2.8.1 (上面使用的是默认的2.7.7版本,尽管2.8.0也可以),结果发现到目前为止还没有适用于该版本的Lift版本。另一方面,我已经安装了lifty,并将其卸载,以显示安装它的命令。

我真希望有一个用于SBT的Debian/Ubuntu包--毕竟,它只是一个很小的shell脚本和一个jar文件,它负责下载Scala、Lift等,以及您需要的任何版本。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4161460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档