如何在jsp中迭代多个属性

时间:2010-03-18 23:22:05

标签: java jsp

我正在尝试遍历属性文件中的一组键,因此只输出“message.pX”。

a.property=foo
message.p1=a
message.p2=b
message.p3=c
some.other.property=bar

我不知道文件中有多少带前缀(message.p)的属性,所以我想显示任何存在的属性。我已经有一个使用ResourceBundle的bean类来处理它并为该语言环境提取正确的包,但是有一个标准的标签,如< fmt:message>可以处理这个?

2 个答案:

答案 0 :(得分:1)

Properties properties = new Properties();
        try {
            properties.load(new FileInputStream("filename.properties"));
        } catch (IOException e) {
        }

        Enumeration e = properties.propertyNames();

        while (e.hasMoreElements()) {
            String key = (String) e.nextElement();
            //Edited answer
            if(key.indexOf("message.p") != -1 ){
               System.out.println(key + " , " + properties.getProperty(key));
               //Add key and value to a list
            }
            //Edited answer

        }

我建议你在Servlet或Java类中执行此操作,并将属性列表存储在java.lang.List对象(如ArrayList或LinkedList)中,然后将结果发送到jsp。 避免在jsp中执行此操作。

答案 1 :(得分:1)

没有标准的方法来处理这个问题。由于您显然已经完全控制了资源捆绑创建,因此最好的办法是引入一个新的关键字/约定,例如以.list结尾的密钥:

<c:forEach items="${bundle['message.p.list']}" var="p">
    <p>${p}</p>
</c:forEach>

..并创建一个自定义ResourceBundle,其中您覆盖handleGetObject()以将所需的值作为List<String>返回,例如:

protected Object handleGetObject(String key) {
    if (key.endsWith(".list")) {
        String listkey = key.substring(0, key.length() - 5);
        List<String> list = new ArrayList<String>();
        for (int i = 1; containsKey(listkey + i); i++) {
            list.add(String.valueOf(getObject(listkey + i)));
        }
        if (!list.isEmpty()) {
            return list;
        }
    }
    return getObject(key);
}