JavaWeb读取配置文件的四种方法

方式一:采用ServletContext读取

获取配置文件的realpath,然后通过文件流读取出来或者通过方法getReasurceAsStream()。

因为是用ServletContext读取文件路径,所以配置文件可以放入在WEB-INF的classes目录中,也可以在应用层级及WEB-INF的目录中。文件存放位置具体在eclipse工程中的表现是:可以放在src下面,也可放在WEB-INF及Web-Root下面等。因为是读取出路径后,用文件流进行读取的,所以可以读取任意的配置文件包括xml和properties。缺点:不能在servlet外面应用读取配置信息。

1.首先创建一个动态的javaweb项目,项目目录如下:

2.创建一个servlet(FileReader.java)

package com.xia.fileReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.MessageFormat;
import java.util.Properties;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FileReader extends HttpServlet {
 private static final long serialVersionUID = 1L;
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 /**
 * response.setContentType("text/html;charset=UTF-8");目的是控制浏览器用UTF-8进行解码;
 * 这样就不会出现中文乱码了
 */
 response.setHeader("content-type","text/html;charset=UTF-8");
 readSrcDirPropCfgFile(response);//读取src目录下的db1.properties配置文件
 response.getWriter().println("<hr/>");
 readWebRootDirPropCfgFile(response);//读取WebRoot目录下的db2.properties配置文件
 response.getWriter().println("<hr/>");
 readSrcSourcePackPropCfgFile(response);//读取src目录下的config目录中的db3.properties配置文件
 response.getWriter().println("<hr/>");
 readWEBINFPropCfgFile(response);//读取WEB-INF目录下的JDBC目录中的db4.properties配置文件
 }
 public void readSrcDirPropCfgFile(HttpServletResponse response) throws IOException {
 String path = "/WEB-INF/classes/db1.properties";
 InputStream in = this.getServletContext().getResourceAsStream(path);
 Properties props = new Properties();
 props.load(in);
 String driver = props.getProperty("jdbc.driver");
 String url = props.getProperty("jdbc.url");
 String username = props.getProperty("jdbc.username");
 String password = props.getProperty("jdbc.password");
 response.getWriter().println("读取src目录下的db1.properties配置文件");
 response.getWriter().println(MessageFormat.format( "driver={0},url={1},username={2},password={3}",
 driver,url, username, password));
 }
 public void readWebRootDirPropCfgFile(HttpServletResponse response) throws IOException{
 String path = "/db2.properties";
 InputStream in = this.getServletContext().getResourceAsStream(path);
 Properties props = new Properties();
 props.load(in);
 String driver = props.getProperty("jdbc.driver");
 String url = props.getProperty("jdbc.url");
 String username = props.getProperty("jdbc.username");
 String password = props.getProperty("jdbc.password");
 response.getWriter().println("读取WebRoot目录下的db2.properties配置文件");
 response.getWriter().println(MessageFormat.format( "driver={0},url={1},username={2},password={3}",
 driver,url, username, password));
 }
 public void readSrcSourcePackPropCfgFile(HttpServletResponse response) throws IOException {
 String path = "/WEB-INF/classes/config/db3.properties";
 String realPath = this.getServletContext().getRealPath(path);
 InputStreamReader reader = new InputStreamReader(new FileInputStream(realPath),"UTF-8");
 Properties props = new Properties();
 props.load(reader);
 String driver = props.getProperty("jdbc.driver");
 String url = props.getProperty("jdbc.url");
 String username = props.getProperty("jdbc.username");
 String password = props.getProperty("jdbc.password");
 response.getWriter().println("读取src目录下的config目录中的db3.properties配置文件");
 response.getWriter().println(MessageFormat.format( "driver={0},url={1},username={2},password={3}",
 driver,url, username, password));
 }
 public void readWEBINFPropCfgFile(HttpServletResponse response) throws IOException {
 String path = "/WEB-INF/JDBC/db4.properties";
 String realPath = this.getServletContext().getRealPath(path);
 System.out.println("realPath:"+realPath);
 System.out.println("contextPath:"+this.getServletContext().getContextPath());
 InputStreamReader reader = new InputStreamReader(new FileInputStream(realPath),"UTF-8");
 Properties props = new Properties();
 props.load(reader);
 String driver = props.getProperty("jdbc.driver");
 String url = props.getProperty("jdbc.url");
 String username = props.getProperty("jdbc.username");
 String password = props.getProperty("jdbc.password");
 response.getWriter().println("读取WEB-INF目录下的JDBC目录中的db4.properties配置文件");
 response.getWriter().println(MessageFormat.format( "driver={0},url={1},username={2},password={3}",
 driver,url, username, password));
 }
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 }
} 

3.配置servlet(web.xml)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
 <display-name>javaReaderFile</display-name>
 <welcome-file-list>
 <welcome-file>index.html</welcome-file>
 <welcome-file>index.htm</welcome-file>
 <welcome-file>index.jsp</welcome-file>
 <welcome-file>default.html</welcome-file>
 <welcome-file>default.htm</welcome-file>
 <welcome-file>default.jsp</welcome-file>
 </welcome-file-list>
 <servlet>
 <servlet-name>FileReader</servlet-name>
 <servlet-class>com.xia.fileReader.FileReader</servlet-class>
 </servlet>
 <servlet-mapping>
 <servlet-name>FileReader</servlet-name>
 <url-pattern>/FileReader</url-pattern>
 </servlet-mapping>
</web-app>

4.测试

方式二:采用ResourceBundle类读取配置信息

优点是:可以以完全限定类名的方式加载资源后,直接的读取出来,且可以在非Web应用中读取资源文件。

缺点:只能加载类src下面的资源文件且只能读取.properties文件。

/**
 * 获取指定配置文件中所有的数据
 * @param propertyName
 * 调用方式:
 * 1.配置文件放在resource源包下,不用加后缀
 * PropertiesUtil.getAllMessage("message");
 * 2.放在包里面的
 * PropertiesUtil.getAllMessage("com.test.message");
 * @return
 */
public static List<String> getAllMessage(String propertyName) {
 // 获得资源包
 ResourceBundle rb = ResourceBundle.getBundle(propertyName.trim());
 // 通过资源包拿到所有的key
 Enumeration<String> allKey = rb.getKeys();
 // 遍历key 得到 value
 List<String> valList = new ArrayList<String>();
 while (allKey.hasMoreElements()) {
 String key = allKey.nextElement();
 String value = (String) rb.getString(key);
 valList.add(value);
 }
 return valList;
} 

方式三:采用ClassLoader方式进行读取配置信息

优点是:可以在非Web应用中读取配置资源信息,可以读取任意的资源文件信息

缺点:只能加载类src下面的资源文件,不适合装载大文件,否则会导致jvm内存溢出

package com.xia.fileReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties;
public class ReadByClassLoader {
 public static void main(String[] args) throws IOException {
 readPropFileByClassLoad();
 }
 public static void readPropFileByClassLoad() throws IOException{
 //读取src下面config包内的配置文件db3.properties
 InputStream in = ReadByClassLoader.class.getClassLoader().getResourceAsStream("config/db3.properties");
 BufferedReader br = new BufferedReader(new InputStreamReader(in));
 Properties props = new Properties();
 props.load(br);
 for(Object s: props.keySet()){
 System.out.println(s+":"+props.getProperty(s.toString()));
 }
 }
} 

方式四: PropertiesLoaderUtils工具类

/**
 * Spring 提供的 PropertiesLoaderUtils 允许您直接通过基于类路径的文件地址加载属性资源
 * 最大的好处就是:实时加载配置文件,修改后立即生效,不必重启
 */
private static void springUtil(){
 Properties props = new Properties();
 while(true){
 try {
 props=PropertiesLoaderUtils.loadAllProperties("message.properties");
 for(Object key:props.keySet()){
 System.out.print(key+":");
 System.out.println(props.get(key));
 }
 } catch (IOException e) {
 System.out.println(e.getMessage());
 }
 try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}
 }
} 

修改Properties

/**
 * 传递键值对的Map,更新properties文件
 *
 * @param fileName
 * 文件名(放在resource源包目录下),需要后缀
 * @param keyValueMap
 * 键值对Map
 */
 public static void updateProperties(String fileName,Map<String, String> keyValueMap) {
 //getResource方法使用了utf-8对路径信息进行了编码,当路径中存在中文和空格时,他会对这些字符进行转换,这样,
 //得到的往往不是我们想要的真实路径,在此,调用了URLDecoder的decode方法进行解码,以便得到原始的中文及空格路径。
 String filePath = PropertiesUtil.class.getClassLoader().getResource(fileName).getFile();
 Properties props = null;
 BufferedWriter bw = null;
 try {
 filePath = URLDecoder.decode(filePath,"utf-8");
 log.debug("updateProperties propertiesPath:" + filePath);
 props = PropertiesLoaderUtils.loadProperties(new ClassPathResource(fileName));
 log.debug("updateProperties old:"+props);
 // 写入属性文件
 bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePath)));
 props.clear();// 清空旧的文件
 for (String key : keyValueMap.keySet())
 props.setProperty(key, keyValueMap.get(key));
 log.debug("updateProperties new:"+props);
 props.store(bw, "");
 } catch (IOException e) {
 log.error(e.getMessage());
 } finally {
 try {
 bw.close();
 } catch (IOException e) {
 e.printStackTrace();
 }
 }
 } 

总结

以上所述是小编给大家介绍的JavaWeb读取配置文件的四种方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • JavaWeb项目音频资源播放实现方法详解

    一.方式1:登陆系统后进行播放,即在浏览器端 需要在JSP页面编写相关代码 <div id="midea" style="display: none;"> <object id='player' height='100' width='200' classid='CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6'> <param name='AutoStart' value='0' /> <

  • JavaWeb项目部署到服务器详细步骤详解

    JavaWeb项目部署到服务器详细步骤 本地准备 在eclipse中将项目打成war文件:鼠标右键要部署到服务器上的项目 导出项目数据库文件 MySql导出数据库文件方法:利用Navicat for MySQL.鼠标右键要导出的数据库,选择转出SQL文件即可 Oracle导出数据库文件:利用PLSQL Developer即可 服务器准备 基本的jdk安装,服务器(比如tomcat)还有数据库的安装都必不可少 将项目的war文件复制到tomcat的wepapps文件夹下即可 创建和代码中数据库连接

  • Java调用CXF WebService接口的两种方式实例

    通过http://localhost:7002/card/services/HelloWorld?wsdl访问到xml如下,说明接口写对了. 1.静态调用 // 创建WebService客户端代理工厂 JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); // 判断是否抛出异常 factory.getOutInterceptors().add(new LoggingInInterceptor()); // 注册webservic

  • 在Java Web项目中添加定时任务的方法

    在Java Web程序中加入定时任务,这里介绍两种方式:1.使用监听器注入:2.使用Spring注解@Scheduled注入. 推荐使用第二种形式. 一.使用监听器注入 ①:创建监听器类: import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class TimerDataTaskListener implements ServletContextListener

  • 传智播客java web 过滤器

    根本不利于使用,Servlet应该本是为简化工作而创造的啊!我当时觉得是我的设计框架产生了问题.第二天我便问方老师,确实是使用上有些问题.比如,显示访问计数,我把它单独写成了一个Servlet,什么地方需要它时,便由那个Servlet.include引用计数的Servlet.但这样总会产生一些问题和使用上的不便.比如include的Servlet必须使用相同的流,如果使用forward后任何输出都无效了. 方老师当时建议,把有些功能写到一起.但最后提到了过滤器,那时我便对过滤器产生了兴趣,今日也

  • JavaWeb实现简单查询商品功能

    本文实例为大家分享了JavaWeb实现简单查询商品功能的具体代码,供大家参考,具体内容如下 CustomerServlet.java package com.subing.web; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet

  • java 实现websocket的两种方式实例详解

    一.介绍 1.两种方式,一种使用tomcat的websocket实现,一种使用spring的websocket 2.tomcat的方式需要tomcat 7.x,JEE7的支持. 3.spring与websocket整合需要spring 4.x,并且使用了socketjs,对不支持websocket的浏览器可以模拟websocket使用 二.方式一:tomcat 使用这种方式无需别的任何配置,只需服务端一个处理类, 服务器端代码 package com.Socket; import java.io

  • JavaWeb读取配置文件的四种方法

    方式一:采用ServletContext读取 获取配置文件的realpath,然后通过文件流读取出来或者通过方法getReasurceAsStream(). 因为是用ServletContext读取文件路径,所以配置文件可以放入在WEB-INF的classes目录中,也可以在应用层级及WEB-INF的目录中.文件存放位置具体在eclipse工程中的表现是:可以放在src下面,也可放在WEB-INF及Web-Root下面等.因为是读取出路径后,用文件流进行读取的,所以可以读取任意的配置文件包括xm

  • SpringBoot 常用读取配置文件的三种方法详解

    目录 前言 一.使用 @Value 读取配置文件 二.使用 @ConfigurationProperties 读取配置文件 1.类上添加@Configuration注解 2.使用@EnableConfigurationProperties注解 3.使用@ConfigurationPropertiesScan扫描 三.使用 Environment 读取配置文件 四.常用的几种数据结构配置读取 我们在SpringBoot框架进行项目开发中该如何优雅的读取配置呢?或者说对于一些List或者Map应该如

  • 详解SpringBoot读取配置文件的N种方法

    我们在项目开发中经常会用到配置信息,例如数据库连接的帐号.密码等,而为了方便维护,我们通常将这些信息放到配置文件中.在需要用到这些配置信息时,可以通过代码获取.下面我们看看Spring中有哪些获取配置信息的方法. PropertiesLoaderUtils读取 通过ClassPathResource加载配置文件资源,结合PropertiesLoaderUtils类读取,源码如下: ClassPathResource resource = new ClassPathResource("applic

  • SpringBoot读取配置文件的五种方法总结

    目录 1.使用 @Value 读取配置文件 2.使用 @ConfigurationProperties 读取配置文件 3.使用 Environment 读取配置文件 4.使用 @PropertySource 读取配置文件 中文乱码 注意事项 5.使用原生方式读取配置文件 总结 Spring Boot 中读取配置文件有以下 5 种方法: 使用 @Value 读取配置文件. 使用 @ConfigurationProperties 读取配置文件. 使用 Environment 读取配置文件. 使用 @

  • Java中spring读取配置文件的几种方法示例

    Spring读取配置XML文件分三步: 一.新建一个Java Bean: package springdemo; public class HelloBean { private String helloWorld; public String getHelloWorld() { return helloWorld; } public void setHelloWorld(String helloWorld) { this.helloWorld = helloWorld; } } 二.构建一个配

  • java读取XML文件的四种方法总结(必看篇)

    JAVA操作XML文档主要有四种方式,分别是DOM.SAX.JDOM和DOM4J,DOM和SAX是官方提供的,而JDOM和DOM4J则是引用第三方库的,其中用的最多的是DOM4J方式.运行效率和内存使用方面最优的是SAX,但是由于SAX是基于事件的方式,所以SAX无法在编写XML的过程中对已编写内容进行修改,但对于不用进行频繁修改的需求,还是应该选择使用SAX. 下面基于这四种方式来读取XML文件. 第一,以DOM的方式实现. package xmls; import org.w3c.dom.D

  • 解决plt.imshow显示cv2.imread读取的图像有色差发蓝的四种方法问题

    目录 原图 一.出现色差代码 1.1 显示彩色图像出现色差 1.2 显示灰度图像出现色差 二.解释原因 2.1 彩色图像出现色差原因 2.2 灰度图像出现色差原因 三.解决 3.1 解决彩色图像出现色差问题 3.2 解决灰度图像出现色差问题 原图 一.出现色差代码 1.1 显示彩色图像出现色差 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('dog.jpg') plt.xticks([

  • Javaweb中Request获取表单数据的四种方法详解

    目录 表单代码 request.getParamter(String name);通过name获取值 request.getParamterValues(String name);通过name获取value值(一般用于复选框获取值) 代码片段 request.getParameterNames();直接获取表单所有对象的name值,返回值是枚举集合 request.getParameterMap();直接获取表单所有对象的name值以及数据 表单代码 <!DOCTYPE html> <h

  • 详解Python实现字典合并的四种方法

    目录 1.用for循环把一个字典合并到另一个字典 2.用dict(b, **a)方法构造一个新字典 3.用b.update(a)的方法,更新字典 4.把字典转换成列表合并后,再转换成字典 (1)利用a.items().b.items()把a.b两个字典转换成元组键值对列表 (2)合并列表并且把合并后的列表转换成字典 5.实例,netmiko使用json格式的数据进行自动化操作 (1)json格式的处理 (2)json格式的设备信息列表 (3)netmiko读取json类型信息示例 1.用for循

  • Java读取Map的两种方法与对比

    前言 在java中遍历Map有不少的方法.这篇文章我们就来看一下Java读取Map的两种方法以及这两种方法的对比. 一. 遍历Map方法A Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); Object key = entry.getKey(); Object val = en

随机推荐