У меня есть java HttpHandler, который я использую для тестирования приложения. В HttpHandler каждый HTTP-запрос обрабатывается в отдельном потоке и передается HttpExchange. Но мне нужно получить доступ к данным из основного потока и класса (того, который настраивает HttpServer и HttpHandler), чтобы HttpHandler мог отправить правильный ответ для текущего выполняемого теста. Как лучше всего передать эти данные в класс HttpHandler или сделать их доступными для него? Я не могу добавить еще один параметр в дескриптор HttpHandler #, поскольку он определяется HttpHandler и используется HttpServer, и я не могу получить доступ к статическим методам в основном классе. Мне также нужно будет отправлять сообщения из 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
    }
0
user1404617 25 Июл 2012 в 21:56
@ Gray Я думаю, что создаю обработчик. Я реализую «HttpHandler» в своем собственном классе и переопределяю метод «handle». Значит, я мог бы переопределить конструктор и передать некоторые данные? Это может сработать, но HttpHandler используется HttpServer, а не непосредственно мной, поэтому я не уверен.
 – 
user1404617
25 Июл 2012 в 22:26
Я повысил свой комментарий до ответа. Очень типично создать обработчик и таким образом передать его другому классу.
 – 
Gray
25 Июл 2012 в 22:32

1 ответ

Лучший ответ

Из комментариев вы говорите, что сами конструируете обработчики. Типичный способ внедрения объектов в обработчики - просто передать их в качестве аргументов конструктору.

Например:

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.

2
Gray 25 Июл 2012 в 22:44
Тогда я бы построил свой обработчик следующим образом: 'someObject so = new someObject ()' и 'server.createContext ("/", new RequestHandler (so));'. Но получает ли каждый обработчик один и тот же экземпляр класса? Затем я могу изменить атрибуты someObject, и обработчик это увидит.
 – 
user1404617
25 Июл 2012 в 22:36
Так RequestHandler ваш класс? Тогда да. Можно сказать: server.createContext("/", new RequestHandler(someObject));.
 – 
Gray
25 Июл 2012 в 22:39