1. 簡介
Javalin 是一個輕量級 Web 框架,為 Java 和 Kotlin 編寫。它基於 Jetty Web 服務器構建,因此具有高性能。Javalin 的設計緊隨 koa.js 的腳步,這意味着它從頭開始編寫,旨在易於理解和構建。
在本教程中,我們將逐步構建一個基本的 REST 微服務,使用這個輕量級框架。
2. 添加依賴項
為了創建一個基本的應用程序,我們只需要一個依賴項——Javalin 本身:
<dependency>
<groupId>io.javalin</groupId>
<artifactId>javalin</artifactId>
<version>1.6.1</version>
</dependency>
當前版本可以在這裏找到 這裏。
3. 設置 Javalin
Javalin 使得設置基本應用程序變得容易。我們首先將定義我們的主類並設置一個簡單的“Hello World”應用程序。讓我們在我們的基本包中創建一個新文件,名為JavalinApp.java。
在文件中,我們創建一個 main 方法並添加以下內容以設置基本應用程序:
Javalin app = Javalin.create()
.port(7000)
.start();
app.get("/hello", ctx -> ctx.html("Hello, Javalin!"));
我們正在創建一個 Javalin 實例,使其監聽端口 7000,然後啓動應用程序。
我們還設置了我們第一個端點,用於監聽 GET 請求,該請求位於 /hello 端點。
讓我們運行此應用程序並訪問 http://localhost:7000/hello 以查看結果。
4. 創建 UserController
“Hello World” 示例對於介紹主題很有用,但對於實際應用來説沒有幫助。讓我們來看一下 Javalin 的一個更實際用例。
首先,我們需要創建一個表示我們正在處理的對象模型。我們首先創建一個名為 user 的包,位於根項目下。
然後,我們添加一個新的 User 類:
public class User {
public final int id;
public final String name;
// constructors
}
此外,我們需要設置我們的數據訪問對象 (DAO)。在這個例子中,我們將使用一個存儲用户的數據對象。
我們創建一個名為 UserDao.java 的新類,位於 user 包中:
class UserDao {
private List<User> users = Arrays.asList(
new User(0, "Steve Rogers"),
new User(1, "Tony Stark"),
new User(2, "Carol Danvers")
);
private static UserDao userDao = null;
private UserDao() {
}
static UserDao instance() {
if (userDao == null) {
userDao = new UserDao();
}
return userDao;
}
Optional<User> getUserById(int id) {
return users.stream()
.filter(u -> u.id == id)
.findAny();
}
Iterable<String> getAllUsernames() {
return users.stream()
.map(user -> user.name)
.collect(Collectors.toList());
}
}
將 DAO 聲明為單例使它更容易在示例中使用。我們也可以將其聲明為我們主類的靜態成員,或者如果使用像 Guice 這樣的庫,可以使用依賴注入。
最後,我們想創建一個控制器類。Javalin 允許我們在聲明路由處理程序時具有很大的靈活性,所以這裏只是一種定義它們的途徑。
我們創建一個名為 UserController.java 的新類,位於 user 包中:
public class UserController {
public static Handler fetchAllUsernames = ctx -> {
UserDao dao = UserDao.instance();
Iterable<String> allUsers = dao.getAllUsernames();
ctx.json(allUsers);
};
public static Handler fetchById = ctx -> {
int id = Integer.parseInt(Objects.requireNonNull(ctx.param("id")));
UserDao dao = UserDao.instance();
Optional<User> user = dao.getUserById(id);
if (user.isPresent()) {
ctx.json(user);
} else {
ctx.html("Not Found");
}
};
}
通過將處理程序聲明為靜態,我們確保控制器本身不持有狀態。但是,在更復雜的應用程序中,我們可能希望在請求之間存儲狀態,在這種情況下,我們需要刪除靜態修飾符。
請注意,靜態方法與單元測試更難,因此如果我們想要這種級別的測試,則需要使用非靜態方法。
5. 添加路由
我們現在有多種從模型中獲取數據的途徑。最後一步是使用 REST 端點公開這些數據。我們需要在主應用程序中註冊兩個新路由。
讓我們將它們添加到主應用程序類中:
app.get("/users", UserController.fetchAllUsernames);
app.get("/users/:id", UserController.fetchById);
在編譯並運行應用程序後,我們可以向這些新端點發送請求。調用 http://localhost:7000/users 將列出所有用户,調用 http://localhost:7000/users/0 將獲取 ID 為 0 的單個 User JSON 對象。我們現在擁有一個微服務,允許我們檢索 User 數據。
6. 擴展路由
檢索數據是大多數微服務的關鍵任務。
但是,我們也需要能夠將數據存儲在我們的存儲庫中。Javalin 提供所需的全部路徑處理程序,用於構建服務。
我們之前看到的一個例子是<em>GET</em>,但<em>PATCH, POST, DELETE, </em>以及<em>PUT</em>也是可行的。
此外,如果我們將 Jackson 作為依賴項包含進來,就可以自動將 JSON 請求主體解析為我們的模型類。例如:
app.post("/") { ctx ->
User user = ctx.bodyAsClass(User.class);
}
這將會允許我們從請求主體中獲取 JSON<em>User</em> 對象並將其轉換為<em>User</em> 模型對象。
7. 結論
我們可以將這些技術結合起來,構建我們的微服務。
在本文中,我們看到了如何設置 Javalin 並構建一個簡單的應用程序。我們還討論瞭如何使用不同的 HTTP 方法類型,以便客户端與我們的服務進行交互。
有關如何使用 Javalin 的更高級示例,請務必查看 文檔。