java web项目中我用xml文件来存储菜单,菜单如下:
<?xml version="1.0" encoding="gbk"?> <menus> <frontmenus> <menu id="1"> <name>首页</name> <href>index.jsp</href> <display>1</display> </menu> </frontmenus> </menus>
|
修改xml中的display值使其可以动态显示
读取xml的类如下:
1. public class Front { 2. public Map<String, String> readXML() { 3. Map<String, String> menus = new LinkedHashMap<String, String>(); 4. SAXBuilder builder = new SAXBuilder(); 5. InputStream in=null; 6. try { 7. //第一种方式 Resource resource=new ClassPathResource("menus.xml"); 8. // in=resource.getInputStream(); 9. // Document doc=builder.build(in); 10. 11. //第二种方式 Document doc = builder.build(Front.class.getClassLoader() 12. // .getResourceAsStream("menus.xml")); 13. 14. File file=new File("E:\\my\\menus.xml"); 15. in=new FileInputStream(file); 16. Document doc=builder.build(in); 17. 18. Element element = doc.getRootElement(); 19. List l = element.getChildren("frontmenus"); 20. for (int i = 0; i < l.size(); i++) { 21. Element e1 = (Element) l.get(i); 22. List menuList = e1.getChildren("menu"); 23. for (int j = 0; j < menuList.size(); j++) { 24. Element e2 = (Element) menuList.get(j); 25. String name = e2.getChildText("name"); 26. String href = e2.getChildText("href"); 27. String display = e2.getChildText("display"); 28. if ("1".equals(display)) { 29. menus.put(href, name); 30. } 31. } 32. } 33. } catch (Exception e) { 34. System.err.println("Error create XML parser"); 35. } 36. return menus; 37. } 38. }
|
因为我刚开始做的时候是把xml文件发在类路径下,所以我选择了第一种方式或第二种方式读取
这是测试代码:
1. Front front=new Front(); 2. Map<String,String> frontMenus=front.readXML(); 3. 4. Iterator it=frontMenus.entrySet().iterator(); 5. while(it.hasNext()) { 6. System.out.println(it.next()); 7. }
|
但是使用第一种方式和第二种方式读取的时候,当xml文件中的内容改变了以后,再去读取如果不重新启动的话,读取的值还是以前读取的,也就是说没改变,但是用debug测试的时候,显示修改后再去读取是重新执行了读取方法的,无赖之下,用第三种方式测试了一下,这次没把xml放到类路径下,而是直接放到了项目文件夹下,使用了绝对路径的方式,这次却可行,修改后可以读出修改后的值,为什么会出现这种情况,百思不得期解,无赖之下请教各位大侠