2.6.1、索引页处理程序
索引页面提供了指向所有wiki条目的指针列表和一个用于创建新wiki条目的字段:
该实现是一个简单的select * SQL查询,然后将数据传递给FreeMarker引擎以呈现HTML响应。
indexHandler方法代码如下:
private final FreeMarkerTemplateEngine templateEngine = FreeMarkerTemplateEngine.create();
private void indexHandler(RoutingContext context) {
dbClient.getConnection(car -> {
if (car.succeeded()) {
SQLConnection connection = car.result();
connection.query(SQL_ALL_PAGES, res -> {
connection.close();
if (res.succeeded()) {
List<String> pages = res.result() (1)
.getResults()
.stream()
.map(json -> json.getString(0))
.sorted()
.collect(Collectors.toList());
context.put("title", "Wiki home"); (2)
context.put("pages", pages);
templateEngine.render(context, "templates", "/index.ftl", ar -> { (3)
if (ar.succeeded()) {
context.response().putHeader("Content-Type", "text/html");
context.response().end(ar.result()); (4)
} else {
context.fail(ar.cause());
}
});
} else {
context.fail(res.cause()); (5)
}
});
} else {
context.fail(car.cause());
}
});
}
- SQL查询结果作为JsonArray和JsonObject的实例返回;
- RoutingContext实例可用于放置任意键/值数据 ,这些键/值随后对模板或串联的路由器的处理程序可见;
- 渲染模板是一种异步操作,使用常见的AsyncResult 处理模式;
- AsyncResult在成功的情况下将模板渲染为String,我们可以结束 具有值的HTTP响应流;
- 如果发生故障,RoutingContext的fail方法提供了一种合理的方式来返回HTTP 500错误到HTTP客户端。
FreeMarker模板应放在src/main/resources/templates文件夹中。index.ftl模板如下:
存储在RoutingContext对象中的键/值数据可通过FreeMarker变量context获取。
由于许多模板都有通用的页眉和页脚,因此我们把这些代码提取到了header.ftl和footer.ftl两个模板文件中:
header.ftl
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.5/css/bootstrap.min.css"
integrity="sha384-AysaV+vQoT3kOAXZkl02PThvDr8HYKPZhNT5h/CXfBThSRXQ6jW5DO2ekP5ViFdi" crossorigin="anonymous">
<title>${context.title} | A Sample Vert.x-powered Wiki</title>
</head>
<body>
<div class="container">
footer.ftl
</div> <!-- .container -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"
integrity="sha384-3ceskX3iaEnIogmQchP8opvBy3Mi7Ce34nWjpBIwVTHfGYWQS9jwHDVRnpKKHJg7"
crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.3.7/js/tether.min.js"
integrity="sha384-XTs3FgkjiBgo8qjEjBk0tGmf3wPrWtA6coPfQDfFEY8AnYJwjalXCiosYRBIBZX8"
crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.5/js/bootstrap.min.js"
integrity="sha384-BLiI7JTZm+JWlgKa0M0kGRpJbF2J8q+qreVrKBC47e3K6BW78kGLrCkeRX6I9RoK"
crossorigin="anonymous"></script>
</body>
</html>