10.3. 创建自定义处理程序
定义自定义处理程序的方法有两种:
使用 WEB-INF/jboss-web.xml 文件定义自定义处理程序
自定义处理程序可以在 WEB-INF/jboss-web.xml
文件中定义。
示例:在 WEB-INF/jboss-web.xml
中定义自定义处理程序
<jboss-web> <http-handler> <class-name>org.jboss.example.MyHttpHandler</class-name> </http-handler> </jboss-web>
示例: HttpHandler
Class
package org.jboss.example; import io.undertow.server.HttpHandler; import io.undertow.server.HttpServerExchange; public class MyHttpHandler implements HttpHandler { private HttpHandler next; public MyHttpHandler(HttpHandler next) { this.next = next; } public void handleRequest(HttpServerExchange exchange) throws Exception { // do something next.handleRequest(exchange); } }
也可以使用 WEB-INF/jboss-web.xml
文件为自定义处理程序设置参数。
示例:在 WEB-INF/jboss-web.xml 中定义
参数
<jboss-web> <http-handler> <class-name>org.jboss.example.MyHttpHandler</class-name> <param> <param-name>myParam</param-name> <param-value>foobar</param-value> </param> </http-handler> </jboss-web>
要使这些参数发挥作用,处理程序类需要具有对应的集合器。
示例:在 Handler 中定义设置方法
package org.jboss.example; import io.undertow.server.HttpHandler; import io.undertow.server.HttpServerExchange; public class MyHttpHandler implements HttpHandler { private HttpHandler next; private String myParam; public MyHttpHandler(HttpHandler next) { this.next = next; } public void setMyParam(String myParam) { this.myParam = myParam; } public void handleRequest(HttpServerExchange exchange) throws Exception { // do something, use myParam next.handleRequest(exchange); } }
在 WEB-INF/undertow-handlers.conf 文件中定义自定义处理程序
除了使用 WEB-INF/jboss-web.xml
定义处理程序外,也可以在 WEB-INF/undertow-handlers.conf
文件中定义。
myHttpHandler(myParam='foobar')
要让 WEB-INF/undertow-handlers.conf
中定义的处理器正常工作,需要创建两个因素:
HandlerBuilder
实施,它为undertow-handlers.conf
定义对应的语法位,并负责创建HttpHandler
(封装在HandlerWrapper
中)。示例:
HandlerBuilder
类package org.jboss.example; import io.undertow.server.HandlerWrapper; import io.undertow.server.HttpHandler; import io.undertow.server.handlers.builder.HandlerBuilder; import java.util.Collections; import java.util.Map; import java.util.Set; public class MyHandlerBuilder implements HandlerBuilder { public String name() { return "myHttpHandler"; } public Map<String, Class<?>> parameters() { return Collections.<String, Class<?>>singletonMap("myParam", String.class); } public Set<String> requiredParameters() { return Collections.emptySet(); } public String defaultParameter() { return null; } public HandlerWrapper build(final Map<String, Object> config) { return new HandlerWrapper() { public HttpHandler wrap(HttpHandler handler) { MyHttpHandler result = new MyHttpHandler(handler); result.setMyParam((String) config.get("myParam")); return result; } }; } }
文件中的条目。
META-INF/services/io.undertow.server.handlers.builder.HandlerBuilder
.此文件必须位于类路径上,例如,在WEB-INF/classes
中。org.jboss.example.MyHandlerBuilder