使用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后浏览器输出:

 

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

 

 

 

 

 

 

    

posted @ 2019-09-03 17:25  牧神风  阅读(403)  评论(0编辑  收藏  举报