ClassLoader讀取classpath目錄下的文件

項目中的需求是根據配置文件建立一個頁面,配置文件中配置一些圖例或者搜索框。讀取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

相關文章
相關標籤/搜索