0

我有一个用于测试应用程序的 java HttpHandler。在 HttpHandler 中,每个 http 请求都在一个单独的线程中处理并通过 HttpExchange。但我需要从主线程和类(设置 HttpServer 和 HttpHandler 的那个)访问数据,以便 HttpHandler 可以为当前正在运行的测试发回正确的响应。让 HttpHandler 类传入或访问这些数据的最佳方法是什么?我无法向 HttpHandler#handle 添加另一个参数,因为它是由 HttpServer 使用的 HttpHandler 定义的,并且我无法访问主类中的任何静态方法。我还需要将消息从 HttpHandler 推送回主类以进行记录。

谢谢

我的代码示例:

class RequestHandler implements HttpHandler {

    @Override
    public void handle(HttpExchange exchange)
     {
        // do a bunch of stuff with the request that come in.
    }
}


public class MainClass
{
    public static void main(String[] args)
    {
        HttpServer server;
        ExecutorService excutor;
        InetSocketAddress addr = new InetSocketAddress(ipAdd, ipPort);
        server = HttpServer.create(addr, 0);
        server.createContext("/", new RequestHandler());
        excutor = Executors.newCachedThreadPool();
        server.setExecutor(excutor);
        server.start();
       // do a bunch of stuff that uses the server
    }
4

1 回答 1

2

从您说您正在自己构建处理程序的评论中。将对象注入处理程序的典型方法是将它们作为参数传递给构造函数。

例如:

public class RequestHandler implements HttpHandler {

    private final Object someObject;

    public RequestHandler(Object someObject) {
        // there is an implied super() here
        this.someObject = someObject;
    }

    public void handle(HttpExchange exchange) throws IOException {
       ...
       // you can then use someObject here
       ...
    }
}

然后您可以将对象传递到您的处理程序中,例如:

server.createContext("/", new RequestHandler(someObject));

在处理程序之间传递信息方面,您应该能够使用该HttpExchange.setAttribute(...)方法来执行此操作。这是一种典型的方式。我建议使用以 开头的属性名称来"_"将它们与 HTTP 属性区分开来。

于 2012-07-25T18:30:32.617 回答