接上章 Vert.x-Web的讲解和使用(三)
跨域资源共享(CORS handling)
跨域资源共享对于多个域请求一个资源是一个安全的机制。
Vert.x-Web包含了一个CorsHandler为你处理CORS协议。
例如:
router.route().handler(CorsHandler.create("vertx\\.io").allowedMethod(HttpMethod.GET));
router.route().handler(routingContext -> {
// Your app handlers
});
想要了解更多请看CORS文档。
模板(Templates)
Vert.x-Web通过开箱即用的几个流行的模板引擎实现动态页面生成的功能。可以非常简单的添加到你的项目中。
TemplateEngine定义了模板引擎,你还可以使用render来渲染模板。
最简单的使用模板的方法是使用TemplateHandler而不是使用模板引擎,TemplateHandler基于Http请求的路径为你调用模板引擎。
默认情况下TemplateHandler将会在templates路径下寻找模板。你也可以配置其他路径。
TemplateHandler默认的返回结果的Conten-type是text/html。你可以设置它为其他的值。
当你创建一个TemplateHandler的时候你需要给它传送一个TemplateEngine的实例。
如下例子:
TemplateEngine engine = HandlebarsTemplateEngine.create();
TemplateHandler handler = TemplateHandler.create(engine);
// This will route all GET requests starting with /dynamic/ to the template handler
// E.g. /dynamic/graph.hbs will look for a template in /templates/dynamic/graph.hbs
router.get("/dynamic/").handler(handler);
// Route all GET requests for resource ending in .hbs to the template handler
router.getWithRegex(".+\\.hbs").handler(handler);
MVEL模板引擎(MVEL template engine)
在你使用MVEL模板引擎的时候,如果你没有指定特殊的扩展名称的话,模板引擎将会在默认的目录下匹配以.templ为扩展名的模板文件。
RoutingContext可以被用在MVEL模板的上下文变量,这意味着你可以基于RoutingContext任何对象来渲染模板,例如:request,response,session或者 context data。
例如:
The request path is @{context.request().path()}请查阅MVEL模板文档去了解如何使用MVEL模板。
The variable 'foo' from the session is @{context.session().get('foo')}
The value 'bar' from the context data is @{context.get('bar')}
Jade模板引擎(Jade template engine)
在你使用Jade模板引擎的时候,如果你没有指定特殊的扩展名称的话,模板引擎将会在默认的目录下匹配以.jade为扩展名的模板文件。RoutingContext可以被用在Jade模板的上下文变量,这意味着你可以基于RoutingContext任何对象来渲染模板,例如:request,response,session或者 context data。
例如:
!!! 5请查阅Jade模板文档去了解如何使用Jade模板。
html
head
title= context.get('foo') + context.request().path()
body
Handlebars模板引擎(Handlebars template engine)
在你使用Handlebars模板引擎的时候,如果你没有指定特殊的扩展名称的话,模板引擎将会在默认的目录下匹配以.hbs为扩展名的模板文件。Handlerbars模板引擎不支持对象的任意方法的调用,所以我们不能像使用其他模板那样仅仅将RoutingContext对象传递给它让它自己解析。
相反的,ContextData是可以在模板中使用的。
如果你想使用像请求路径,请求参数,或Session数据这样的数据,你需要将它们在TemplateHandler处理之前添加到 Context Data中。
例如:
TemplateEngine engine = HandlebarsTemplateEngine.create();
TemplateHandler handler = TemplateHandler.create(engine);
router.get("/dynamic").handler(routingContext -> {
routingContext.put("request_path", routingContext.request().path());
routingContext.put("session_data", routingContext.session().data());
routingContext.next();
});
router.get("/dynamic/").handler(handler);
请查阅Handlebars模板文档去了解如何使用Handlebars模板。
Thymeleaf模板引擎(Thymeleaf template engine)
在你使用Thymeleaf模板引擎的时候,如果你没有指定特殊的扩展名称的话,模板引擎将会在默认的目录下匹配以.html为扩展名的模板文件。RoutingContext可以被用在Jade模板的上下文变量,这意味着你可以基于RoutingContext任何对象来渲染模板,例如:request,response,session或者 context data。
例如:
[snip]
<p th:text="${context.get('foo')}"></p>
<p th:text="${context.get('bar')}"></p>
<p th:text="${context.normalisedPath()}"></p>
<p th:text="${context.request().params().get('param1')}"></p>
<p th:text="${context.request().params().get('param2')}"></p>
[snip]
请查阅Thymeleaf模板文档去了解如何使用Thymeleaf模板。
错误处理程序(Error handler)
你可以使用一个TemplateHandler或者其他的方法呈现你的错误,但是Vert.x-Web提供了一个漂亮的开箱即用的错误处理程序,你同样可以使用它来呈现错误。这个处理程序是ErrorHandler,就像一个失败处理程序一样将它设置到你想覆盖的路径上就可以轻松的使用它。
请求日志(Request logger)
你可以使用LoggerHandler来记录HTTP请求的日志。默认的请求将会被记录到Vert.x的日志,可以配置为使用JUL,log4j 或者SLF4J.
超时处理(Timeout handler)
Vert.x-Web 包含了一个TimeoutHandler,你可以用它去超时某个你认为处理时间过长的请求。你可以去配置一个TimeoutHandler的实例。
如果一个请求超时,Response将会返回一个408的响应到客户端。
这里有个使用TimeoutHandler例子,请求到/foo路径下的所有请求在五秒后得不到响应就会超时。
router.route("/foo/").handler(TimeoutHandler.create(5000));