Как получить имена всех атрибутов (вложенных или нет) в контексте сервлета и выполнить итерацию, если это карта или список? - PullRequest
6 голосов
/ 07 июля 2011

Я пытался получить attributeNames плохо обслуживаемого контекста, а затем использовать эти имена с отражением.

Вот несколько псевдокодов для грубой идеи. Например. У меня есть ArrayList и HashMap в контексте.

enum = getServletContext().getAttributeNames();
for (; enum.hasMoreElements(); ) {
    String name = (String)enum.nextElement();

    // Get the value of the attribute
    Object value = getServletContext().getAttribute(name);

    if (value instanceof HashMap){
      HashMap hmap = (HashMap) value;
      //iterate and print key value pair here
    }else if(value instanceof ArrayList){
      //do arraylist iterate here and print
    }
}

1 Ответ

10 голосов
/ 08 июля 2011

Вот код, который будет делать то, что вы хотите:

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);
        }
    }
}

Примечания:

  1. Всегда предпочитайте ссылаться на абстрактный интерфейс над конкретными реализациями. В этом случае проверьте List и Map (интерфейсы), а не ArrayList и HashMap (конкретные реализации); подумайте, что произойдет, если из контекста вы получите LinkedList, а не ArrayList или Map, который не HashMap - ваш код (излишне) взорвется
  2. Используйте while (condition) вместо for (;condition;) - это просто уродливо
  3. Если вы знаете типы своих коллекций, укажите их. Например, веб-контексты обычно дают вам Map<String, Object>:

чтобы код мог стать

for (Map.Entry<String, Object> entry : ((Map<String, Object>)value).entrySet()) {
    String entryKey = entry.getKey();
    Object entryValue = entry.getValue();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...