如何获取Servlet Context中的所有属性名称(嵌套与否),如果是地图或列表则进行迭代?

时间:2011-07-07 16:00:08

标签: java loops servlets attributes

我试图获取不良维护上下文的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 个答案:

答案 0 :(得分:10)

这里的代码可以满足您的需求:

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. 总是倾向于通过具体实现来引用抽象接口。在这种情况下,请检查ListMap(接口),而不是ArrayListHashMap(具体实现);考虑如果上下文向您发送LinkedList而不是ArrayList,或者Map不是HashMap - 您的代码会(不必要地)爆炸
  2. 使用while (condition)而不是for (;condition;) - 这只是丑陋的
  3. 如果您知道收藏集的类型,请指定它们。例如,网络上下文通常会为您提供Map<String, Object>
  4. 所以代码可以变成

    for (Map.Entry<String, Object> entry : ((Map<String, Object>)value).entrySet()) {
        String entryKey = entry.getKey();
        Object entryValue = entry.getValue();
    }