如何在Spring MVC中创建属性文件的List对象?

时间:2016-03-02 04:49:30

标签: java spring spring-mvc

在属性文件中,我有50个问题。

Quest1=1.1
Quest1Text=How are ju?

Quest2=1.2
Quest2Text=How are jui?

Quest3=1.3
Quest3Text=How are juieeeeee?

我想用Java阅读它们并在JSP中显示。

互联网上的标准方式是@Value(ques2)变量@Value(quest2Text)变量 但是这会让我的控制人员感到高兴。

请告诉我们如何使用一些Spring Annotation从属性文件中为java中的列表赋值?

3 个答案:

答案 0 :(得分:2)

首先,您已将属性文件添加到上下文配置中:

@PropertySource(name = "questions", value = "classpath:question.properties")
public class AppConfig {
   ...
}

我在示例中使用了classpath:前缀(这意味着文件将位于类路径的根目录中),但您可以使用file:来指定绝对路径。请注意,源名称指定为questions。我们将来需要它。

第二,创建数据容器类。当然,您可以使用Map<String, String>来存储您的问题,但课程会更方便:

public class Quest{
    private String number;
    private String text;

    //getters and setters
    ....
}

第三次,在控制器中获取属性源并加载数字和值:

@Controller
public class MyController {

    @Autowired
    private ConfigurableEnvironment environment;

    @RequestMapping("/mymapping")
    public String method(ModelMap model){
        List<Quest> questList = loadQuestList();
        model.addAttribute("questList", questList);
        return "myview";
    }    


    private List<Quest> loadQuestList(){

        ResourcePropertySource source = 
            (ResourcePropertySource)environment.getPropertySources().get("questions");

            //first get all names of questions like 'Quest1','Quest2' etc
            List<String> nameList = new ArrayList<String>();
            for(String name : source.getPropertyNames()){
                if(!name.endsWith("Text")){
                    nameList.add(name);
                }
            }
            //unfortunately, default properties are unsorted. we have to sort it
            Collections.sort(nameList);

            //now, when we have quest names, we can fill list of quests
            List<Quest> list = new ArrayList<Quest>();

            for(String name : nameList){
                String number = source.getProperty(name);
                String text = source.getProperty(name+"Text");

                Quest quest = Quest();
                quest.setNumber(number);
                quest.setText(text);
                list.add(quest);
            }
            return list;
    }    
}

答案 1 :(得分:1)

你可以做一件事,所有的钥匙&#39; QuestX&#39;结合单键“Quest&#39;用一些分隔符分隔它们。类似地,对于以&#39; QuestXText&#39;开头的所有键。进入另一个像QuestText&#39;。 然后你可以使用:

    @Value("#{'${Quest}'.split(',')}")
    private List<String> Quest;

    @Value("#{'${QuestText}'.split(',')}")
    private List<Integer> QuestText;

或者你可以采用另一种方法:

public static List<String> getPropertyList(Properties properties, String name) 
{
    List<String> result = new ArrayList<String>();
    for (Map.Entry<Object, Object> entry : properties.entrySet())
    {
        if (((String)entry.getKey()).matches("^" + Pattern.quote(name) + "\\.\\d+$"))
        {
            result.add((String) entry.getValue());
        }
    }
    return result;
}

为了更清晰,请参阅: https://stackoverflow.com/a/18654272/3226981

答案 2 :(得分:1)

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class Ex {

    public static void main(String[] args) {

        Properties prop = new Properties();
        InputStream input = null;
        `enter code here`List<String> values=new ArrayList<>();

        try {

            input = new FileInputStream("/application.properties");
            prop.load(input);
            for (int i = 1; i < 50; i++) {
                System.out.println(prop.getProperty("Quest" + i));
                values.add(prop.getProperty("Quest" + i));
            }

        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            if (input != null) {
                try {
                    input.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}