過去的每一year,涌現出愈來愈多的Java框架。就像JavaScript,每一個人都認爲他們知道一個好的框架的功能應該是怎麼樣的。連個人老祖母如今也使用 一個我歷來沒有據說過並且可能永遠不會使用的框架。玩笑歸玩笑,能夠作幾乎任何事的臃腫的框架市場已經飽和,,可是如何評判呢?這篇文章旨在提供目前最好的 Java RESTfulful 框架。我只介紹輕量級的產品, 略過了那些臃腫的過分設計的框架。同時,我只想要他們穩定和成熟,提供簡單,輕量級的特色。我只在介紹Play frameworks時打破這條規則,理由稍後給出。在未來的項目中使用哪一個 Java RESTful框架徹底取決於你當前的需求。爲了便於你取捨,我將列出最突出的框架功能,但願這能節省一些你的時間。 html
誕生時間: 2011
評分: 4.5/5 java
Dropwizard 提供了穩定成熟的Java庫, 並封裝成一個簡單的輕量級的包。
Dropwizard 介於框架和庫之間。它提供了一個開發web應用程序的所有所需。因爲內置模塊化,一個應用程序能夠保持小而精幹的特色,減小開發和維護的時間,減小負擔。
Dropwizard 使用已有的 Jetty HTTP 庫,嵌入到你的項目中,無需外部的server。全部的Dropwizard項目都有一個 main 方法來管理內建的 HTTP server. git
優勢 github
快速的項目構建和啓動 web
模塊化 express
難以想象的快(至少根據內建的 metric 測得的結果) json
Jetty for HTTP, Jersey for REST, 以及 Jackson for JSON bootstrap
也支持其它的庫, 好比 Mustache, Logback, JDBI, Hibernate Validator, Guava, … api
使用Metrics支持監控
Main方法啓動 Jetty server,能夠容易地調試和維護
社區力度強
缺點
Dropwizard文檔是主要的知識來源,但談不上優秀。你可能須要搜索和發掘第三方類庫的文檔。
由於某些緣由錯誤被看成普通文本, 若是你但願響應結果老是JSON,這可能有問題
確保使用最新的Dropwizard, 一些老版本使用了廢棄的第三方庫。 並且早期的Dropwizzard也很難升級
例子
import io.dropwizard.Application; import io.dropwizard.setup.Bootstrap; import io.dropwizard.setup.Environment; import com.example.helloworld.resources.HelloWorldResource; import com.example.helloworld.health.TemplateHealthCheck; public class HelloWorldApplication extends Application<HelloWorldConfiguration> { public static void main(String[] args) throws Exception { new HelloWorldApplication().run(args); } @Override public String getName() { return "hello-world"; } @Override public void initialize(Bootstrap<HelloWorldConfiguration> bootstrap) { // nothing to do yet } @Override public void run(HelloWorldConfiguration configuration, Environment environment) { // nothing to do yet } }
註解
我的不想爲大的項目推薦這個框架。不過若是你想嘗試的話,你不會失望的。主要是這個框架使用最好的現代的Java web 組件,組裝成一個簡單易用的框架。
不幸的是這也帶來了它的問題。 將這些庫糅合起來可能致使不可預見的問題。這也是我爲何給它減掉0.5顆星,而沒有評爲滿分5顆星。
誕生時間: 2012 (Jersey 2.X)
評分: 5/5
Jersey RESTful 框架是開源的RESTful框架, 實現了JAX-RS (JSR 311 & JSR 339) 規範。它擴展了JAX-RS 實現, 提供了更多的特性和工具, 能夠進一步地簡化 RESTful service 和 client 開發。儘管相對新怡,它已是一個產品級的 RESTful service 和 client 框架。
優勢
優秀的文檔和例子
快速
超級容易的路由
平滑的 JUnit 集成
就我的而言, 當開發 RESTful service 時, JAX-RS 實現要好於 MVC 框架。
能夠集成到其它庫/框架 (Grizzly, Netty). 這也多是不少產品使用它的緣由。
支持異步連接
不喜歡 servlet container? 使用Jersey的時候能夠不用它們。
WADL, XML/JSON support
包含在Glassfish中
缺點
Jersey 2.0+使用了有些複雜的依賴注入實現
可能不是一件壞事。Jersey 1.X 使用較老的 JAX-RS 實現
一大堆第三方庫只支持 Jersey 1.X, 在 Jersey 2.X 不可用
例子
import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; @Path ("helloworld") public class HelloWorldResource { public static final String CLICHED_MESSAGE = "Hello World!"; @GET @Produces("text/plain") public String getHello() { return CLICHED_MESSAGE; } }
註解
Jersey 是個人選擇, 5顆星。
誕生時間: 2012
評分: 3.5/5
Ninja Web Framework是全棧的 java web framework。穩定, 快速, 可靠, 產品級.
它提供了開發,測試,發佈,維護 RESTful web應用的一切(Servlets, Guice, JPA, Flyway migrations, Maven, etc.).
就像 DropWizzard, Ninja Web Framework 是一個集成的軟件棧。你沒必要創建你本身的,只需使用 Maven archetype生成一個新的項目,導入到IDE中就能夠開始編碼了。
優勢
快
快速的項目構建和啓動
模塊化
XML, HTML, JSON渲染
也支持其它的庫 (如 Guice, Logback, Guava, etc.)
很好的數據持久化和緩存
不喜歡 servlet container? U能夠選擇你喜歡的容器
若是根本就不喜歡容器,可使用 standalone 模式, 使用Jetty做爲一個自執行的jar
缺點
一樣,就像DropWizzard, 文檔有可是不夠好。我花了好長時間去了解它。這個框架也依賴不少其它的庫,有時候想獲得所需的信息很麻煩。
不怎麼出名,社區小。 有謠言說這個框架是由那些切換到Scala的 Play 2.X 用戶建立的
例子
public class ApplicationController { public Result index() { Person person = new Person(); person.name = "John Johnson"; return Results.json().render(person); } }
註解
看起來不錯,可是在它成熟以前我仍是把它丟在一邊吧。
誕生時間: 2011
評分: 4/5
使用Play Framework 很容易地建立,構建和發佈 web 應用程序,支持 Java & Scala。它使用Akka, 基於一個輕量級的無狀態的架構。它應該應用於大規模地低CPU和內存消耗的應用。
優勢
易於開發
快,可是沒有其它的一些框架快
基於 Netty, 支持非阻塞的 I/O. 並行處理遠程調用的時候很優秀
社區很大
快速的項目構建和啓動
模塊化
MVC
REST, JSON/XML, Web Sockets, non-blocking I/O
只需刷新瀏覽器就能夠看到最新的改變
支持Async
有出版的書
缺點
版本2.0 是最有爭議的Java框架。 切換至Switch to Scala made some Java developers outraged.
不向後兼容; Play 2.X 重寫了
號稱輕量級,但有些臃腫
SBT構建工具. 號稱 Maven 殺手, 可是從沒有優秀到替換它。難以學習和配置
非 servlet
Breaking changes across releases
例子
import play.api._ import play.api.mvc._ class Application extends Controller { def hello(name: String) = Action { Ok("Hello " + name + "!") } }
註解
抱怨歸抱怨,我仍是一直喜歡和首選這個框架。不幸的是,我只能給它4顆星。我堅信 基於JAX-RS的框架更適合 RESTful web services.
誕生時間: 2009
評分: 3/5
RestExpress是一個非容器的輕量級的 Netty HTTP棧的包裝, 以便更容易地建立 Java RESTful services.
RestExpress 目標是支持最好的 RESTful 實踐。
連接
GITHUB
優勢
真正的微框架
頂級的性能,快,可靠
XML/JSON
最老的也是最穩定的 RESTful 框架之一
缺點
沒有文檔
幾乎沒有支持
很小的社區
例子
import java.io.IOException; import io.netty.handler.codec.http.HttpMethod; import org.restexpress.RestExpress; public class Main{ public static RestExpress startServer(String[] args) throws IOException{ RestExpress server = new RestExpress(); MyResource r = new MyResource(); server.uri("/myapp/myresource", r) .method(HttpMethod.GET) .noSerialization(); server.uri("/myapp/myresource", r) .method(HttpMethod.POST); server.bind(8080); return server; } public static void main(String[] args) throws Exception{ RestExpress server = startServer(args); System.out.println("Hit enter to stop it..."); System.in.read(); server.shutdown(); } }
註解
儘管這個框架超級快,我也不想推薦它。文檔缺少以及沒有支持使它成爲一個欠佳的框架。看在速度的份上給它3顆星。
誕生時間: 2005
評分: 4.5/5
Restlet 幫助Java程序員創建大規模的快速的符合 RESTful 架構模式的web api。
它提供了強大的路由和 filtering 系統。統一的client/server Java API. 知足全部主要的平臺 (Java SE/EE, Google AppEngine, OSGi, GWT, Android) 以及提供了無數的擴展以知足程序員的需求。
據我說知,它是第一個 java RESTful web 框架。不少公司都在用它,可是你可能從未據說過它,好像它已經不可見了。
優勢
強大
企業級的框架
多平臺 Java SE, Java EE, Google Web Toolkit, Google AppEngine, Android, OSGi environments
支持JAX-RS (就像 Jersey)
大部分高級 RESTful 支持
模塊化
支持其它庫
開發一直活躍
智能的url綁定, 全功能的 URI 路由
有相關的書籍
缺點
很是陡峭的學習曲線
關閉的社區,儘管 StackOverflow 上仍是開放的
再也不流行,更多的是由於 Play Framework 和 Jersey
例子
public class Part03 extends ServerResource { public static void main(String[] args) throws Exception { // Create the HTTP server and listen on port 8182 new Server(Protocol.HTTP, 8182, Part03.class).start(); } @Get("txt") public String toString() { return "hello, world"; } }
註解
儘管這個框架還一直流行,但到它的和當前的完成度,我不能給它5顆星。
誕生時間: 2013
評分: 3.5/5
Restx 是一個輕量級的,模塊化的,特性衆多的,超快的開源 Java REST 框架。
優勢
快速,輕量級
容易搭建
真正的微框架
模塊化
支持其它庫
支持MongoDB
缺點
不友好的使人迷惑的文檔。對於這類框架我指望能有好一點的文檔
太young
目前還不支持異步Async
例子
@GET("/message/{id}") public Message sayHello(String id, // path param String who // query param ) { return new Message().setMessage(String.format( "hello %s, it's %s", who, DateTime.now().toString("HH:mm:ss"))); } @POST("/message/{id}") public Message sayHello(String id, // path param Message msg // body param ) { return msg.setMessage(String.format( "%s @ %s", msg.getMessage(), DateTime.now().toString("HH:mm:ss"))); }
註解
真心來說我沒有在這個框架上花費太多時間。不值得在另外一個框架上花費太多精力,我意思是說,Java框架市場已經愈來愈碎片化了,就像 JavaScript 市場,應該中止這種趨勢了。
誕生時間: 2011
評分: 3.5/5
不要和 Apache 的大數據框架 Spark 弄混, 這裏的 Spark 框架是一個輕量級的 Java web 框架,用來進行快速的開發(50% Spark用戶使用 Spark 建立 REST APIs)。 它受 Ruby 框架 Sinatra 啓發。它有一個不到1M的最小化的內核, 提供了全部基本的特性, 用來構建 RESTful 或者傳統的 web 應用程序。
優勢
快,輕量級
優秀的快速原型
易於搭建
常常和AngularJS搭配使用
真正的微框架
使用 Jetty
能夠用在容器中或者獨立運行
缺點
文檔能夠更好,它不適合初學者
不適合大型項目
社區小
例子
import static spark.Spark.*; public class HelloWorld { public static void main(String[] args) { get("/hello", (req, res) -> "Hello World"); } }
註解
這個框架適合初始開發。主要用做小小項目或者原型。