java HttpServer类的java HttpHandler类之间传递数据的正确方法
我有一个java HttpHandler,用于测试应用程序。在HttpHandler中,每个http请求在单独的线程中处理,并传递给HttpExchange。但是我需要从主线程和类(设置HttpServer和HttpHandler的类)访问数据,以便HttpHandler可以为当前正在运行的测试发回正确的响应。如何让HttpHandler类传入或访问此数据是最好的方法?我无法向HttpHandler#handle添加另一个参数,因为它是由HttpHandler定义的&由HttpServer使用,并且我无法访问主类中的非静态方法。我还需要将消息从HttpHandler推回到主类以进行日志记录 谢谢 我的代码示例:java HttpServer类的java HttpHandler类之间传递数据的正确方法,java,multithreading,messaging,httphandler,httpserver,Java,Multithreading,Messaging,Httphandler,Httpserver,我有一个java HttpHandler,用于测试应用程序。在HttpHandler中,每个http请求在单独的线程中处理,并传递给HttpExchange。但是我需要从主线程和类(设置HttpServer和HttpHandler的类)访问数据,以便HttpHandler可以为当前正在运行的测试发回正确的响应。如何让HttpHandler类传入或访问此数据是最好的方法?我无法向HttpHandler#handle添加另一个参数,因为它是由HttpHandler定义的&由HttpServer使用,
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
}
从评论中可以看出,您正在自己构造处理程序。将对象注入处理程序的一种典型方法是将它们作为参数传递给构造函数 例如:
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(…)
方法来实现这一点。这是一种典型的方式。我建议使用以“\ucode>开头的属性名来区分它们与HTTP属性。@Gray我想我是在构造处理程序。我在自己的类中实现了“HttpHandler”,并重写了“handle”方法。所以我也可以重写构造函数并传入一些数据?这可能行得通,但是HttpHandler是由HttpServer使用的,而不是直接由我使用的,所以我不确定。我已经将我的评论升级为一个答案。以这种方式构造一个处理程序并将其传递给另一个类是非常典型的。因此,我会像这样构造我的处理程序:“someObject So=new someObject()”和“server.createContext(“/”,new RequestHandler(So));”。但是,每个处理程序是否都获得相同的类实例?这样我就可以更改某个对象的属性,处理程序就会看到。@user1404617所以RequestHandler
是您的类吗?那么是的。您可以说:server.createContext(“/”,newrequestHandler(someObject))代码>。好的,这很有意义。我要试一试。谢谢