項目中的需求是根據配置文件創建一個頁面,配置文件中配置一些圖例或者搜索框。讀取classpath目錄下文件的方式有很多,且記錄自己在項目中用到的一種方式。
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)
/** * * @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)
/** * 解析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的文件,然后獲取該文件的路徑,
在下面就是使用文件流讀取文件里面的信息了。由於是json文件,所以我需要將json文件轉換為jsonArray方便獲取里面的數據,所以jsTja(result),就是將json字符串轉為json數組
/** * 把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)的最后使用了
net.sf.json.JSONArray json = net.sf.json.JSONArray.fromObject(list);
將一個list轉換為json對象,返回到前台。
整個過程也就完成了,根據請求路徑找到和路徑最后一層名稱相對應的json文件,然后用ClassLoader獲取classpath目錄下該json文件的路徑,最后讀取json文件,做一系列處理,最后將拼的HTML里的DIV和選擇器封裝為一個個對象放在list里,在將list轉為json對象給前台直接使用。