Вот код, который будет делать то, что вы хотите:
Enumeration<?> e = getServletContext().getAttributeNames();
while (e.hasMoreElements())
{
String name = (String) e.nextElement();
// Get the value of the attribute
Object value = getServletContext().getAttribute(name);
if (value instanceof Map) {
for (Map.Entry<?, ?> entry : ((Map<?, ?>)value).entrySet()) {
System.out.println(entry.getKey() + "=" + entry.getValue());
}
} else if (value instanceof List) {
for (Object element : (List)value) {
System.out.println(element);
}
}
}
Примечания:
- Всегда предпочитайте ссылаться на абстрактный интерфейс над конкретными реализациями. В этом случае проверьте
List
и Map
(интерфейсы), а не ArrayList
и HashMap
(конкретные реализации); подумайте, что произойдет, если из контекста вы получите LinkedList
, а не ArrayList
или Map
, который не HashMap
- ваш код (излишне) взорвется
- Используйте
while (condition)
вместо for (;condition;)
- это просто уродливо
- Если вы знаете типы своих коллекций, укажите их. Например, веб-контексты обычно дают вам
Map<String, Object>
:
чтобы код мог стать
for (Map.Entry<String, Object> entry : ((Map<String, Object>)value).entrySet()) {
String entryKey = entry.getKey();
Object entryValue = entry.getValue();
}