在属性文件中,我有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中的列表赋值?
答案 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();
}
}
}
}
}