项目中的需求是根据配置文件建立一个页面,配置文件中配置一些图例或者搜索框。读取classpath目录下文件的方式有不少,且记录本身在项目中用到的一种方式。json
ClassLoader主要是对类的请求提供服务,当jvm须要某个类时,它根据名称向ClassLoader请求得到这个类,而后ClassLoader返回给jvm这个类的class对象。ClassLoader不仅仅只是对类的请求提供服务,它负责载入系统中全部资源(class,文件,来自网络的字节流等),经过ClassLoader将资源载入jvm。每个class都有一个reference,指向ClassLoader。数组
ClassLoader cd = getClass().getClassLoader();
当HTTP请求个人控制器时,我将获取它请求路径的最后一层目录,而后根据最后一层目录名称去classpath下找到这个目录名对应的json文件。网络
@RequestMapping(value = "page/*") public String test1(Model model, HttpServletRequest request) { String uri = request.getRequestURI(); String jspFile = uri.substring(uri.lastIndexOf("/")+1); String jsonFile = jspFile +".json"; ClassLoader cd = getClass().getClassLoader(); model.addAttribute("json", PageUtils.getPage(cd, jsonFile)); return "modules/oa/common"; }
代码中我使用*去匹配最后一层路径,而后使用最后一层路径名拼出一个json文件名。若是请求路径为***/page/demo1,那么显然我立刻要读取的json文件是demo1.json。先获取ClassLoader和文件名称,而后看:PageUtils.getPage(cd, jsonFile)app
/** * * @param cd * @param jsonFile * @return */ public static net.sf.json.JSONArray getPage(ClassLoader cd,String jsonFile){ List<Object> list = new ArrayList<Object>(); String module; JSONArray options = null; JSONArray searchOptions = null; JSONArray contentOptions = null; // 读取配置文件 com.alibaba.fastjson.JSONArray jsonArray = CommonUtils.readStyleJson(cd,jsonFile); for (Object obj : jsonArray) { module = ((JSONObject) obj).getString("module"); options = CommonUtils.jsTja(((JSONObject) obj).getString("options")); if (StringUtils.isNotBlank(module) && options != null) { if (module.equals("search")) { searchOptions = options; } else if (module.equals("content")) { contentOptions = options; } } else { System.out.println(module + "不被使用!"); } } Div selector = dealSelector(searchOptions); if (selector != null) { list.add(selector);// 选择器栏目的全部div与script } Div div = dealDiv(contentOptions,searchOptions); if (div != null) { list.add(div);// content栏目的全部div与script } net.sf.json.JSONArray json = net.sf.json.JSONArray.fromObject(list); return json; }
看:CommonUtils.readStyleJson(cd,jsonFile)jvm
/** * 解析json文件,获取配置信息 * * @return * @author liuwei */ public static com.alibaba.fastjson.JSONArray readStyleJson(ClassLoader cd,String jsonFile) { BufferedReader buffer; StringBuilder message = new StringBuilder(); String line = null; URL url = cd.getResource("pages/"+jsonFile); File file = new File(url.getFile()); try { buffer = new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8")); while ((line = buffer.readLine()) != null) { message.append(line); } } catch (IOException e) { e.printStackTrace(); } String result = message.toString().trim().replace("\r\n", ""); return jsTja(result); }
ClassLoader到classpath目录下去寻找一个在pages目录下的demo1.json的文件,而后获取该文件的路径,jsp
在下面就是使用文件流读取文件里面的信息了。因为是json文件,因此我须要将json文件转换为jsonArray方便获取里面的数据,因此jsTja(result),就是将json字符串转为json数组ui
/** * 把json字符串转为JSONArray * * @param str * @return */ public static com.alibaba.fastjson.JSONArray jsTja(String str) { com.alibaba.fastjson.JSONArray array = com.alibaba.fastjson.JSON.parseArray(str); return array; }
这里我都使用了类全名,由于我在PageUtils.getPage(cd, jsonFile)的最后使用了url
net.sf.json.JSONArray json = net.sf.json.JSONArray.fromObject(list);
将一个list转换为json对象,返回到前台。spa
整个过程也就完成了,根据请求路径找到和路径最后一层名称相对应的json文件,而后用ClassLoader获取classpath目录下该json文件的路径,最后读取json文件,作一系列处理,最后将拼的HTML里的DIV和选择器封装为一个个对象放在list里,在将list转为json对象给前台直接使用。code