zoukankan      html  css  js  c++  java
  • 使用servletContext和类加载器加载文件

        servletContext对象表示的是当前的这个web工程,同一个web工程下的所有的servlet共享一个servletContext对象,通过servletContext对象我们可以实现在不同的servlet中传递参数。使用servletContext对象我们可以实现请求的转发并且获取web工程启动的初始化参数。今天我来介绍一下如何使用servletContext对象来读取配置文件。

        首先我们先使用maven建立一个web工程,分配在src和WEB-INF下创建.properties文件。如图:

                                                                                     

    我们在web.xml中创建一个servlet来读取配置文件。代码如下:

    public class TestServletContext extends HttpServlet{
    
        private static final long serialVersionUID = 1L;
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            doPost(req,resp);
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            response.setHeader("content-type","text/html;charset=UTF-8");
            readResourceFile(response);
            response.getWriter().print("<br/>");
            response.getWriter().close();
        }
    
        private void readResourceFile(HttpServletResponse response) throws IOException {
            ServletContext servletContext = this.getServletContext();
            InputStream in = servletContext.getResourceAsStream("/WEB-INF/classes/com/conf/test.properties");
            Properties pro = new Properties();
            pro.load(in);
            String jdbcUrl = pro.getProperty("jdbc.url");
            String userName = pro.getProperty("jdbc.username");
            String password = pro.getProperty("jdbc.password");
            response.getWriter().println("读取src下的资源文件:jdbcUrl为"+jdbcUrl+"、userName为:"+userName+"、password为:"+password);
            response.getWriter().flush();
        }
    }

    访问这个servlet后浏览器输出:

     证明已经读取到了在src/main/resource下的配置文件。当我们把配置文件放到WEB-INF目录下时,我们只需要修改文件的访问地址即可,代码如下:

    public class TestServletContext extends HttpServlet{
    
        private static final long serialVersionUID = 1L;
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            doPost(req,resp);
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            response.setHeader("content-type","text/html;charset=UTF-8");
            readResourceFile(response);
            response.getWriter().print("<br/>");
            response.getWriter().close();
        }
    
        private void readResourceFile(HttpServletResponse response) throws IOException {
            ServletContext servletContext = this.getServletContext();
            InputStream in = servletContext.getResourceAsStream("/WEB-INF/test.properties");
            Properties pro = new Properties();
            pro.load(in);
            String jdbcUrl = pro.getProperty("jdbc.url");
            String userName = pro.getProperty("jdbc.username");
            String password = pro.getProperty("jdbc.password");
            response.getWriter().println("读取WEB-INF下的资源文件:jdbcUrl为"+jdbcUrl+"、userName为:"+userName+"、password为:"+password);
            response.getWriter().flush();
        }
    }

    访问这个servlet后浏览器输出:

     在servletContext对象中还有一个方法叫做getRealPath(String path)用来获取web应用中文件的绝对路径。这个方法比较的简单我就不多介绍了。

        在平时的开发中我们除了有时使用ServletContext对象加载配置文件还会使用类装载器来读取配置文件。下面我们来使用类装载器来读取web工程的配置文件,代码如下:

    public class TestClassLoader extends HttpServlet{
    
        private static final long serialVersionUID = 1L;
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            doPost(req,resp);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse response)
                throws ServletException, IOException {
            response.setHeader("content-type","text/html;charset=UTF-8");
            readResourceFile(response);
            response.getWriter().close();
        }
    
        private void readResourceFile(HttpServletResponse response) throws IOException {
             ClassLoader classLoader = TestClassLoader.class.getClassLoader();    
             InputStream in = classLoader.getResourceAsStream("com/conf/test.properties");
             Properties pro = new Properties();
             pro.load(in);
             String jdbcUrl = pro.getProperty("jdbc.url");
             String userName = pro.getProperty("jdbc.username");
             String password = pro.getProperty("jdbc.password");
             response.getWriter().println("读取src下的资源文件:jdbcUrl为"+jdbcUrl+"、userName为:"+userName+"、password为:"+password);
             response.getWriter().flush();
        } 
    
    }

    请求这个servlet后浏览器输出

     这时当我们把配置文件放到WEB-INF目录下时,我们同样也只需要修改文件的访问地址即可,代码如下:

    public class TestClassLoader extends HttpServlet{
    
        private static final long serialVersionUID = 1L;
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            doPost(req,resp);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse response)
                throws ServletException, IOException {
            response.setHeader("content-type","text/html;charset=UTF-8");
            readResourceFile(response);
            response.getWriter().close();
        }
    
        private void readResourceFile(HttpServletResponse response) throws IOException {
             ClassLoader classLoader = TestClassLoader.class.getClassLoader();    
             InputStream in = classLoader.getResourceAsStream("../test.properties");
             Properties pro = new Properties();
             pro.load(in);
             String jdbcUrl = pro.getProperty("jdbc.url");
             String userName = pro.getProperty("jdbc.username");
             String password = pro.getProperty("jdbc.password");
             response.getWriter().println("读取WEB-INF下的资源文件:jdbcUrl为"+jdbcUrl+"、userName为:"+userName+"、password为:"+password);
             response.getWriter().flush();
        } 
    
    }

    请求这个servlet后浏览器输出:

     注意:不建议使用类加载器去加载比较大的文件,因为可能会导致内存溢出。

        

  • 相关阅读:
    我来说说博客评论的事
    SWFUpload+Javascript仿163邮件上传文件
    如何暂停和终止线程
    分享我的数据处理类库,欢迎拍砖
    求数列两两之差,再求和
    poj 1006 中国剩余定理
    Poj算法做题顺序
    poj 1328
    ZOJ 3279
    poj 2352 树状数组
  • 原文地址:https://www.cnblogs.com/suyang-java/p/11454315.html
Copyright © 2011-2022 走看看