2016-03-02 76 views
2

在屬性文件中我有50個問題。如何在Spring MVC中創建屬性文件的List對象?

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)變量 但是,這將使我的控制器hauch-pauch。

請問你可以告訴如何使用一些Spring Annotation從屬性文件中將值賦給java中的列表?

+1

的可能的複製[更好的方式來表示數組在java屬性文件](http://stackoverflow.com/questions/7015491/better-way-to-represent-array-in-java-properties-file) – Prashant

+0

你特別想春天做到這一點或任何其他方法(不使用彈簧)也很好? – Suyash

+0

你最終想得到什麼:'Map '或不同的'列表'帶數字和文本? –

回答

1

你可以做一件事情,把所有的鑰匙'QuestX'結合成一個單獨的鑰匙'Quest',用一些分隔符將它們分開。對於以'QuestXText'開頭的所有鍵進入'QuestText'等另一個鍵也是如此。 然後你可以使用:

@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

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

    } 
} 
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; 
    }  
} 
相關問題