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后浏览器输出:
注意:不建议使用类加载器去加载比较大的文件,因为可能会导致内存溢出。