Jetty WebAppContext

我们首先要了解Jetty中的org.mortbay.jetty.handler.HandlerCollection。这个类是Jetty服务的核心操作类,像日志、设备上下文等操作对象都存在于其中,其底层实现是一个Handler接口数组,我们可以通过Server提供的方法来获取。

HandlerCollection handlers= (HandlerCollection)server.getHandler();

应用下所有站点的设备上下文都存在于org.mortbay.jetty.handler.ContextHandlerCollection类对象中。其底层实现是一个HashMap对象,key的格式为 /* 或 /virtual directory name/*,value就是webapp的设备上下文对象,ContextHandlerCollection并没有提供直接访问的方法,我们可以通过反射得到。所有操作对象我们都可以通过HandlerCollection来获取。

ContextHandlerCollection contextHandler=(ContextHandlerCollection)handlers.getChildHandlerByClass(ContextHandlerCollection.class);
Class<ContextHandlerCollection> cls=ContextHandlerCollection.class;
Field field=cls.getDeclaredField("_contextMap");
field.setAccessible(true);
PathMap handlers=(PathMap)field.get(contextHandlerCollection);
WebAppContext context=(WebAppContext)handlers.get("/test/*");

或者通过其父类HandlerCollection提供的public Handler[] getHandlers()方法获取想要的WebAppContext,此方法得到的Handler数组就是反射变量PathMap中所有value的数组。

ContextHandlerCollection contextHandler=(ContextHandlerCollection)handlers.getChildHandlerByClass(ContextHandlerCollection.class);
Handler[] handlers = getHandlers();
WebAppContext webContext;
for(Handler handler : handlers){
  webContext=(WebAppContext)handler;
  if("/test".equalsIgnoreCase(webContext.getContextPath())){
    break;
  }
}

猜你喜欢

转载自mrchaohe.iteye.com/blog/1994945
今日推荐