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