JavaWEB中读取配置信息

第一种方法是使用java.io和java.util包,缺点是路径的概念要清晰,

  例子: Properties prop = new Properties();

  InputStream in =

  getClass().getResourceAsStream("/common.properties");

  try {

  prop.load(in);

  pool = new JedisPool(config, prop.getProperty("pay.redis.url"));

  } catch (IOException e) {

  log.info("CachePool method load property error");

  e.printStackTrace();

  }

  第二种方法是使用Apache Commons Configuration读取配置信息,优点是能读取各种配置文件信息、统一配置、自动重载等 (注意,该例子中用了/ 绝对路径,SpringJUnit4ClassRunner 做测试时,会提示找不到文件,去掉/后解决,可能因为加载配置文件的方式不同)

  例子

  PropertiesConfiguration redisConfig = null;

  try {

  redisConfig = new PropertiesConfiguration("config.properties");

  } catch (ConfigurationException e) {

  e.printStackTrace();

  } String url = redisConfig.getString("pay.redis.url");

  路径寻找顺序为:

  当前路径

  用户主目录路径(如果是jar包,默认对应jar包根目录)

  classpath (默认对应WEB-INF/classes)

  路径链接全文

  ClassLoader 提供了两个方法用于从装载的类路径中取得资源:

  public URL getResource (String name);

  public InputStream getResourceAsStream (String name);

  这里name是资源的类路径,它是相对与“/”根路径下的位置。getResource得到的是一个URL对象来定位资源,而getResourceAsStream取得该资源输入流的引用保证程序可以从正确的位置抽取数据。

  但是真正使用的不是ClassLoader的这两个方法,而是Class的 getResource和getResourceAsStream方法,因为Class对象可以从你的类得到(如YourClass.class或 YourClass.getClass()),而ClassLoader则需要再调用一YourClass.getClassLoader()方法,不过根据JDK文档的说法,Class对象的这两个方法其实是“委托”(delegate)给装载它的ClassLoader来做的,所以只需要使用 Class对象的这两个方法就可以了。

  因此,直接调用 this.getClass().getResourceAsStream(String name) ;获流, 静态化方法中则使用ClassLoader.getSystemResourceAsStream (String name) 。

  下面是一些得到classpath和当前类的绝对路径的一些方法。你可能需要使用其中的一些方法来得到你需要的资源的绝对路径

  1.this.getClass().getResource("") 得到的是当前类class文件的URI目录。不包括自己! 如:file:/D:/workspace/jbpmtest3/bin/com/test/

  2.this.getClass().getResource("/") 得到的是当前的classpath的绝对URI路径 。 如:file:/D:/workspace/jbpmtest3/bin/

  3.this.getClass() .getClassLoader().getResource("") 得到的也是当前ClassPath的绝对URI路径 。如:file:/D:/workspace/jbpmtest3/bin/

  4.ClassLoader.getSystemResource("") 得到的也是当前ClassPath的绝对URI路径 。 如:file:/D:/workspace/jbpmtest3/bin/

  5.Thread.currentThread().getContextClassLoader ().getResource("") 得到的也是当前ClassPath的绝对URI路径 。 如:file:/D:/workspace/jbpmtest3/bin/

  6.ServletActionContext.getServletContext().getRealPath(“/”)

  Web应用程序 中,得到Web应用程序的根目录的绝对路径。这样,我们只需要提供相对于Web应用程序根目录的路径,就可以构建出定位资源的绝对路径。 如:file:/D:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/WebProject

  注意点:

  1.尽量不要使用相对于System.getProperty("user.dir")当前用户目录的相对路径。

  2.尽量使用URI形式的绝对路径资源。它可以很容易的转变为URI,URL,File对象。

  3.尽量使用相对classpath的相对路径。不要使用绝对路径。使用上面ClassLoaderUtil类的public static URL getExtendResource(String relativePath)方法已经能够使用相对于classpath的相对路径定位所有位置的资源。

  4.绝对不要使用硬编码的绝对路径。因为,我们完全可以使用ClassLoader类的getResource("")方法得到当前classpath的绝对路径。如果你一定要指定一个绝对路径,那么使用配置文件,也比硬编码要好得多!

  获得CLASSPATH之外路径的方法:

  URL base = this.getClass().getResource(""); //先获得本类的所在位置,如/home/popeye/testjava/build/classes/net/

  String path = new File(base.getFile(), "……/……/……/"+name).getCanonicalPath(); //就可以得到/home/popeye/testjava/name

  另外,如果从ANT启动程序,this.getClass().getResource("")取出来的比较怪,直接用JAVA命令行调试就可成功。

技术分享:www.kaige123.com

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。

请教一个问题 - 2016-09-13 17:09:03

请问谁有java persistence api的中文版,分享一下,英文实在看不懂,例如下面的pdf,如果谁有请打救一下,谢谢
//0代表前面的补充//8代表长度为8//d代表参数类型为正整数int val=12;System.out.println(String.format("%08d", val)); 打印结果: 00000012 System.out.println(String.format("你是谁?%2$s,他是谁%1$s", "wj","jw")); 你是谁?jw,他是谁wj
Java 抽象类和接口 一、抽象类 :   1) 由 abstract 修饰   2) 包含抽象方法的类必须是抽象类     不包含抽象方法的类也可以声明为抽象类 ---- 我乐意   3) 抽象类不能被实例化   4) 抽象类是需要被继承的,子类 :     4.1) 重写所有抽象方法 ---- 常用     4.2) 也声明为抽象类 ------ 不常用   5) 抽象类的意义 :     5.1) 包含公共的属性和行为,被子类所共享 -- 代码重用     5.2) 为所有子类提供一种公共的类型 -

Java 获取当前JVM进程ID - 2016-09-13 15:09:48

Java 获取当前JVM进程ID   public static final int jvmPid() {try {RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();Field jvm = runtime.getClass().getDeclaredField("jvm");jvm.setAccessible(true);VMManagement mgmt = (VMManagement) jvm.get(runtime);Metho

java面试必备之多线程 - 2016-09-13 15:09:44

     Java 多线程 一、 线程     线程:可以并发执行多个任务。 二、 线程创建方式     线程有两种创建方式。 方式一 : 直接继承 Thread 并重写 run 方法。需要注意,启动线程要调用 start 方法, start 方法调用完毕后,线程纳入到线程调度中,线程调度会分配 CPU 时间片来运行该线程,当线程运行时会自动调用 run 方法。 第一种创建线程方式有两个不足 :  1: 由于要求继承 Thread 类,那么在将来项目中,就有可能出现继承冲突。  2: 由于继承了 Thre
JeeWx_2.4.2 版本发布,免费开源 微信 管家系统   1. JEEWX系统介绍        Jeewx是一款开源、免费的微信管家系统,采用 Java 语言实现,支持微信公众号、微信企业号,Jeewx实现了微信平台管理的基础功能,便于用户二次开发。        后续升级亮点: 即将推出“支付服务窗”插件,后续会扩展支持“微博”, “百度直达号”, “QQ公众号”等。 2. 版本升级亮点    推出扁平化UI界面,支持首页风格切换 (点击右上角-控制面板 -首页风格) 3. JEEWX系统功能

java面试必备之String类 - 2016-09-13 15:09:37

       String 类 一、 基础知识    在 Java 中将字符串作为对象来处理,有两种创建形式: String str= ” abc ” ;String str=new String( “ abc ” ). String 是不可变对象。 二、 常用 API int indexOf(int ch): 用来检查给定的一个字符在当前字符串中第一次出现的下标位置。 String substring(int begin,int end): 用来截取当前字符串的部分内容以获取这个子字符串。 String

Java之泛型(Generic Type) - 2016-09-13 15:09:37

Java之泛型(Generic Type) 一、背景知识     在面向对象编程中有四个概念:抽象、封装、继承、多态         这四种编程思想在Java中的体现:         1、抽象:接口(Interface)、抽象类     2、封装:用权限关键字控制自身属性对外的访问/继承权限:public、protected、default、private     3、继承:一个类可以继承另一个类的属性或方法。     4、多态:有继承必然有多态。允许子类重写 (overwrite) 父类中的方法。  

Java集合 - 2016-09-13 14:09:09

Map ConcurrentHashMap HashMap LinkedHashMap Hashtable WeakHashMap   Set HashSet LinkedHashSet TreeSet   List ArrayList LinkedList
Java 程序的三种结构 一、 顺序结构     从上往下逐行执行,每句必走。 二、 分支结构     有条件的执行某语句,并非每句必走。 1)if 结构 :1 条路 if(boolean 表达式 ){   语句块 } 若语句块仅有一条语句,可以省略“ {} ”。 2)if...else 结构 :2 条路     3)if...else if 结构 : 多条路 4)switch...case 结构 : 多条路 在 JDK1.6 及其以前版本中 switch 语句中的表达式的值必须是整型和字符型,在 JDK