Мне нужно использовать URL-mapping для моего сервлета, который установлен в web.xml. В настоящее время я могу читать сопоставления со следующим кодом в функции processRequest.
Iterator<String> urlMappings = this.getServletContext().getServletRegistration(MyServletClass.class.getSimpleName()).getMappings().iterator();
while (urlMappings.hasNext()) {
System.out.println(urlMappings.next());
}
Однако функция getServletContext не является статичной, и поэтому я не могу ее прочитать без экземпляра сервлета. Это тоже нормально, но если есть способ сделать это только с помощью статических функций, я предпочту это решение. Любая помощь?
Я использую Tomcat 8.0.3 и JDK 1.8
Добавьте ServletContextListener в ваш web.xml
. Это будет вызываться при загрузке вашего webapp. В contextInitialized()
вы можете хранить ServletContext
в статической переменной, например, для последующего использования. Затем вы сможете получить доступ к ServletContext
статическим способом:
class MyListener implements ServletContextListener {
public static ServletContext context;
@Override
public void contextInitialized(ServletContextEvent sce) {
context = sce.getServletContext();
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
context = null;
}
}
Добавьте его в web-xml
следующим образом:
<web-app>
<listener>
<listener-class>
com.something.MyListener
</listener-class>
</listener>
</web-app>
И вы можете получить к нему доступ из любого места:
MyListener.context.getServletRegistration(
MyServletClass.class.getSimpleName()).getMappings().iterator();
Заметка:
Вы можете сохранить его как private
и обеспечить getter
метод, а также проверить на null
значение, прежде чем использовать его.