zoukankan      html  css  js  c++  java
  • ClassLoader读取classpath目录下的文件

    项目中的需求是根据配置文件创建一个页面,配置文件中配置一些图例或者搜索框。读取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("
    ", "");
            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对象给前台直接使用。

    前进时,请别遗忘了身后的脚印。
  • 相关阅读:
    selenium设置user-agent以及对于是否是浏览器内核进行反爬
    python-Redis模块常用的方法汇总
    Eight HDU-1043 (bfs)
    4 Values whose Sum is 0 (二分)
    Jmeter的优点是什么?除了轻量级,它和LoadRunner有什么本质区别
    selenuim,qtp,loadrunner,jmeter有何区别,想学个脚本语言python和测试工具应该从哪里入门呢。
    Jquery消息提示插件toastr
    排除Transformation Errors
    Group By Rollup
    Group By Grouping Sets
  • 原文地址:https://www.cnblogs.com/liudaihuablogs/p/9181547.html
Copyright © 2011-2022 走看看