Вы хотите тонкий шпон? Это легко приготовить. Попробуйте в качестве начала следующую тривиальную оболочку вокруг ElementTree:
# geetree.py
import xml.etree.ElementTree as ET
class GeeElem(object):
"""Wrapper around an ElementTree element. a['foo'] gets the
attribute foo, a.foo gets the first subelement foo."""
def __init__(self, elem):
self.etElem = elem
def __getitem__(self, name):
res = self._getattr(name)
if res is None:
raise AttributeError, "No attribute named '%s'" % name
return res
def __getattr__(self, name):
res = self._getelem(name)
if res is None:
raise IndexError, "No element named '%s'" % name
return res
def _getelem(self, name):
res = self.etElem.find(name)
if res is None:
return None
return GeeElem(res)
def _getattr(self, name):
return self.etElem.get(name)
class GeeTree(object):
"Wrapper around an ElementTree."
def __init__(self, fname):
self.doc = ET.parse(fname)
def __getattr__(self, name):
if self.doc.getroot().tag != name:
raise IndexError, "No element named '%s'" % name
return GeeElem(self.doc.getroot())
def getroot(self):
return self.doc.getroot()
Вы вызываете ее так:
>>> import geetree
>>> t = geetree.GeeTree('foo.xml')
>>> t.xml_api_reply.weather.forecast_information.city['data']
'Mountain View, CA'
>>> t.xml_api_reply.weather.current_conditions.temp_f['data']
'68'
Просто нажмите URL-адреса
http://<username>:<password>@<hostname>:<port>/manager/stop?path=/<context path>
, чтобы остановить, и
http://<username>:<password>@<hostname>:<port>/manager/start?path=/<context path>
, чтобы начать. Это имитирует использование приложения-менеджера.
Я бегло просмотрел исходный код Tomcat Manager. Похоже, есть класс, который является частью исходного кода Tomcat, под названием «Сервлет контейнера». Из документации javadocs:
A ContainerServlet - это сервлет который имеет доступ к внутреннему функциональность, и загружается из Загрузчик классов Catalina вместо загрузчик классов веб-приложения.
ContainerServlet автоматически получает оболочку, которая может использоваться для получения контекста и средства развертывания, а средство развертывания имеет полезные методы, такие как start (String contextPath)
и stop (String contextPath)
, который будет делать то, что вы хотите.
Итак, я думаю, что вам нужно будет написать свой собственный сервлет, который наследуется от ContainerServlet, и настроить Tomcat для загрузки вашего сервлета с помощью загрузчика классов Catalina (посмотрите, как настроен Менеджер, чтобы узнать как). Обратите внимание, что это, вероятно, не будет вариантом для вас в размещенной среде.
Тогда ваш сервлет может иметь, скажем, кнопку, которую вы нажимаете, чтобы перезагрузить приложение. Я рекомендую поставить перед этим какую-нибудь защиту паролем. :)
Tomcat Manager предлагает http-интерфейс для запуска / остановки приложения и других задач. Есть Ant-задачи , которые можно использовать для быстрого доступа к этим операциям.