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());
    }
  });
}
  1. SQL查询结果作为JsonArray和JsonObject的实例返回;
  2. RoutingContext实例可用于放置任意键/值数据 ,这些键/值随后对模板或串联的路由器的处理程序可见;
  3. 渲染模板是一种异步操作,使用常见的AsyncResult 处理模式;
  4. AsyncResult在成功的情况下将模板渲染为String,我们可以结束 具有值的HTTP响应流;
  5. 如果发生故障,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>

results matching ""

    No results matching ""