JavaWeb-Servlet-Properties

本文介绍了一种通过Properties文件配置数据库连接信息的方法,使代码更加灵活且易于维护。

话说

优化之路永不停止。上篇我们已经用Servlet全部改造了新闻(News)的CURD,这里继续改进。今天先来创建Properties文件,通过加载文件的方式来获取一些固定的值。


目录结构
Properties


Properties

1)What Properties?
properties在这里就是一个文件形式,即文件名后缀是.properties。它和我们普通的text文本区别是,里面存放的是key-value形式的内容。Java里面与之对应 有一个Properties的类,专门来处理这种文件格式。这种格式,便于获取一些固定的常量。

2)Why Properties?
代码里,有些部分表面是常量,但是在某些时候也可能改变,改变的时候,项目可能在运行,直接去代码修改,不方便;把这些常量存放到静态的.properties文件中;静态文件不参与编译的,然后读取,很科学,修改起来也方便维护(假如是运维人员的话,修改.properties文件总比修改源码好吧,万一一不小心,把代码改错了呢?)

我们在BaseDao类里面,连接MySQL时候,是这样写的:

 //1、加载驱动,把加载类定义为静态语句块
    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        //说实话感觉卡顿的问题也没怎么解决。可能搜狗输入法还没有和捷克公司做好沟通吧。
    }
    //2、连接MySQL数据库 定义方法getConn()
    public Connection getConn() {
        String url = "jdbc:mysql://localhost:3306/news_db";
        String user = "root";
        String password = "119913";
        try {
            conn = DriverManager.getConnection(url,user,password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        System.out.print("恭喜你,连接上了....");
        return conn;
    }

这里,driver、user、password都写死了的,缺乏灵活性。谁知道哪天有变动。目的是:把这些短期固定的常量配置在一个.properties文件里,然后通过类来获取里面的value,存放到代码中。后期直接维护.properties文件即可。

1、设计properties文件

idea中,创建的文件类型叫做:Resource Bundle(Eclipse、MyEclipse中是file)
为便于直接读取,文件直接创建在src目录下,因为Properties类默认就是直接从src根目录开始寻找文件的。

文件名db.properties 配置如下:

#数据库驱动
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/news_db
username=root
password=119913

2、编写类,调用方法获取.properties中的value

编写ConfigUtil类,根据.properties中的key来获取其value.
package com.hmc.jdbc.news.util;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * User:Meice
 * 2017/10/3
 */
public class ConfigUtil {
    //获取db.properties文件里面的属性值value
    public void get() {
        try {
            //创建输入流,通过类自带的类加载器来加载源文件,返回输入流
            InputStream is = this.getClass().getClassLoader().getResourceAsStream("db.properties");
            //实例化Properties类
            Properties pro = new Properties();
            //加载输入流
            pro.load(is);
            //获取文件对象的属性值
            String driver = pro.getProperty("driver");
            System.out.println(driver);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new ConfigUtil().get();
    }
}

以上代码,如果我们想调用get()方法的时候,我们想获取driver、url、user、password的时候,没发根据我们想要获取的key来输出对应的value值,对吧,所以我们再次优化这段代码,带入参数和返回值。
优化如下:

package com.hmc.jdbc.news.util;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * User:Meice
 * 2017/10/3
 */
public class ConfigUtil {
    public String  get(String key){
        String val = null;
        try {
        //加载文件输入流
        InputStream is = this.getClass().getClassLoader().getResourceAsStream("db.properties");
        //创建Properties对象
        Properties pro = new Properties();
        //加载配置文件
            pro.load(is);

            //根据key获取value
         val =  pro.getProperty(key);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return  val;


        /**
         * 这里返回有两种方式,第二种直接在try catch里面返回
         * return pro.getProperty(key);
         * 在try catch外面在返回一个null值,也是可以的。
         */
    }


    public static void  main(String[] args) {
    //测试
     String val =   new ConfigUtil().get("password");
     System.out.println(val);

    }

}

以上代码就完美达到了要求,你在调用方法的时候,只需要明确key,就能给你返回对应的value。

3、重新改进连接MySQL数据库的参数方式

为了便于调用,我们把获取值的方法get(String key)修改为静态方法:
变化点主要是:

1)方法调整为了static
2) 加载文件输入流的时候有变化

package com.hmc.jdbc.news.util;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * User:Meice
 * 2017/10/3
 */
public class ConfigUtil {
    public  static String  get(String key){
        String val = null;
        try {
        //加载文件输入流
        InputStream is = ConfigUtil.class.getClassLoader().getResourceAsStream("db.properties");
        //创建Properties对象
        Properties pro = new Properties();
        //加载配置文件
            pro.load(is);

            //根据key获取value
         val =  pro.getProperty(key);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return  val;


        /**
         * 这里返回有两种方式,第二种直接在try catch里面返回
         * return pro.getProperty(key);
         * 在try catch外面在返回一个null值,也是可以的。
         */
    }


    public static void  main(String[] args) {
     String val =  get("password");
     System.out.println(val);

    }

}

之前是这么加载输入流的:

InputStream is = this.getClass().getClassLoader().getResourceAsStream("db.properties");
变化为:
 InputStream is = ConfigUtil.class.getClassLoader().getResourceAsStream("db.properties");

修改连接MySQL数据库代码如下:

public class BaseDao {
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    //1、加载驱动,把加载类定义为静态语句块
    static {
        try {
            Class.forName(ConfigUtil.get("driver"));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        //说实话感觉卡顿的问题也没怎么解决。可能搜狗输入法还没有和捷克公司做好沟通吧。
    }
    //2、连接MySQL数据库 定义方法getConn()
    public Connection getConn() {
        String url = ConfigUtil.get("url");
        String user = ConfigUtil.get("user");
        String password = ConfigUtil.get("password");
        try {
            conn = DriverManager.getConnection(url,user,password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        System.out.print("恭喜你,连接上了....");
        return conn;
    }
    ........
 }

这样,关于连接数据库的所有参数都灵活了,经过测试,News显示正常。以后只用修改.properties即可。

好了,晚安。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值