騷年,你可據說過 spark-java?

本篇文章是一篇軟文,我想向你們推薦一下 spark-java 這個框架,這裏的 spark 並不是是大數據相關的 apache-spark,而是一個建立Web應用程序的微框架。如下我會簡單的給你們介紹一下。前端

1. Spark簡介

Spark —— 用於Kotlin和Java 8以最低消耗建立Web應用程序的微框架。java

快速開始:git

Java:github

import static spark.Spark.*;

public class HelloWorld {
    public static void main(String[] args) {
        get("/hello", (req, res) -> "Hello World");
    }
}
複製代碼

Kotlinweb

import spark.kotlin.*

fun main(args: Array<String>) {
    val http: Http = ignite()

    http.get("/hello") {
        "Hello Spark Kotlin!"
    }
}
複製代碼

運行查看:apache

http://localhost:4567/hello
複製代碼

爲生產效率而生編程

Spark Framework是一個簡單而富有表現力的Java/Kotlin Web框架,是爲快速開發而構建的DSL(領域專用語言,domain specific language / DSL)。Spark的目的是爲Kotlin/Java開發人員提供一種替代方案,以便開發他們的web應用程序時,儘量有表達更多的內容和使用最少的樣板。 憑藉明確的理念,Spark的設計不只讓你的工做更富有成效,並且能夠在Spark的流暢性,聲明性以及豐富表達式的影響下,讓你的代碼更好。json

你能夠充分利用JVM後端

JVM提供了世界上最大的編程生態系統之一。雖然它有不少Java的web框架,可是純Java的web開發傳統意義上都是很是麻煩的。若你熱愛JVM,可是憎恨累贅的代碼和框架,那麼Spark就是你專屬的web框架。它能夠幾分鐘內啓動並運行,並且你能夠在Groovy或者Kotlin或者其餘任何你使用的語言中使用。 Spark是一個有着豐富表達的,輕量級且開放的純Java(和Kotlin)web框架,與其餘框架不一樣,你能夠按你所想構建應用程序。bash

微服務,處處都是微服務!!!

2015年是微服務爆火的一年,如今你若開始研究微服務,你會意識到Spark對於微服務很是棒。微服務在微框架下運行得最好,並且Spark能夠用少於十行代碼構建你的REST API服務於JSON。 雖然說Spark主要用於建立REST API,但它也支持多種模板引擎。爲什麼不爲你的後端建立一個Spark應用程序,而且爲你的前端建立一個呢?

NodeJS開發者?用TypeScript?試試Spark替代吧!

後來,不少服務端的web開發已被NodeJS接管,但愈來愈多的NodeJS開發人員正使用TypeScript以及其餘編譯爲JavaScript的靜態類型語言。爲何不徹底一致呢,去使用其實是用類型設計的,且打算在服務器端運行的語言? 你還能夠得到在JVM上運行應用程序的全部好處,其中類庫亦不會每天被棄用。 若是你轉自ExpressJS,那麼對於Spark的語法將會很是熟悉,而且與許多JavaScript web框架不一樣,Spark在將來並不會過期。

典型用途

咱們的2015年調查告訴咱們,超過50%的Spark用戶使用Spark建立REST API,而大約25%使用Spark建立網站。大約15%的Spark應用程序天天服務於超過10,000個用戶。點擊此處閱讀完整調查。

2. 代碼示例

Getting started

當前版本爲2.9.0,更多版本能夠參見releases

compile group: 'com.sparkjava', name: 'spark-core', version: '2.9.0'

public class com.SparkJavaApplication {
  public static void main(String[] args) {
    get("/hello", (req, res) -> "Hello World");
  }
}
複製代碼

更多例子

public class com.SparkJavaApplication {

  public static void main(String[] args) {
    port(4567);
    get("/hello", (req, res) -> "Hello World");

    get("/users/:name", (request, response) -> "Selected user: " + request.params(":name"));

    get("/news/:section", (request, response) -> {
      response.type("text/xml");
      return "<?xml version=\"1.0\" encoding=\"UTF-8\"?><news>" + request.params("section") + "</news>";
    });

    get("/protected", (request, response) -> {
      halt(403, "I don't think so!!!");
      return null;
    });

    get("/redirect", (request, response) -> {
      response.redirect("/news/world");
      return null;
    });

    get("/", (request, response) -> "root");
    
    get("/hello2", "application/json", (request, response) -> { 
      return "{\"message\": \"Hello World\"}";
    });
  }
}

複製代碼

你可使用port()函數定義開啓的端口。 同時Spark參數的傳遞是以:param的形式傳遞的,獲取方式一樣是經常使用的request.params("paramName")。 在定義接口的時候還能夠定義接口接收的類型,好比"application/json"。

此外,除了get方法,其餘好比post、put等方法以下例所示:

public class Books {

  /** * Map holding the books */
  public static Map<String, Book> books = new HashMap<>();

  // Creates a new book resource, will return the ID to the created resource
  // author and title are sent as query parameters e.g. /books?author=Foo&title=Bar
  public static void main(String[] args) {
    post("/books", (request, response) -> {
      String author = request.queryParams("author");
      String title = request.queryParams("title");
      Book book = new Book(author, title);
      Random random = new Random();
      int id = random.nextInt(Integer.MAX_VALUE);
      books.put(String.valueOf(id), book);

      response.status(201); // 201 Created
      return id;
    });

    // Gets the book resource for the provided id
    get("/books/:id", (request, response) -> {
      Book book = books.get(request.params(":id"));
      if (book != null) {
        return "Title: " + book.getTitle() + ", Author: " + book.getAuthor();
      } else {
        response.status(404); // 404 Not found
        return "Book not found";
      }
    });

    // Updates the book resource for the provided id with new information
    // author and title are sent as query parameters e.g. /books/<id>?author=Foo&title=Bar
    put("/books/:id", (request, response) -> {
      String id = request.params(":id");
      Book book = books.get(id);
      if (book != null) {
        String newAuthor = request.queryParams("author");
        String newTitle = request.queryParams("title");
        if (newAuthor != null) {
          book.setAuthor(newAuthor);
        }
        if (newTitle != null) {
          book.setTitle(newTitle);
        }
        return "Book with id '" + id + "' updated";
      } else {
        response.status(404); // 404 Not found
        return "Book not found";
      }
    });

    // Deletes the book resource for the provided id
    delete("/books/:id", (request, response) -> {
      String id = request.params(":id");
      Book book = books.remove(id);
      if (book != null) {
        return "Book with id '" + id + "' deleted";
      } else {
        response.status(404); // 404 Not found
        return "Book not found";
      }
    });

    // Gets all available book resources (id's)
    get("/books", (request, response) -> {
      StringBuilder ids = new StringBuilder();
      for (String id : books.keySet()) {
        ids.append(id).append(" ");
      }
      return ids.toString();
    });

  }
}
複製代碼

更多例子能夠參考github項目

總結

Spark 是一個很是輕量級的web框架,若你不須要那麼多的功能,只是提供簡單的web接口,那麼Spark是個很是適合的選擇。另外,Spark一樣適用於微服務的架構,它的功能不止於此,如果有興趣,能夠自行探索。 本文只是一篇引子,爲的是我不用再引用所佔內存較大Spring的web的框架,項目啓動速度飛昇。

參考

相關文章
相關標籤/搜索