① java web怎樣知道.properties配置的屬性在哪裡調用的
這需要你需要的時候,讀取properties文件中你所需要的那一項。
例如:
public static String readValue(String filePath,String key) {
Properties props = new Properties();
try {
InputStream in = new BufferedInputStream (new FileInputStream(filePath));
props.load(in);
String value = props.getProperty (key);
System.out.println(key+value);
return value;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
//filePath就是你的properties文件的路徑,key就是你的那個屬性的名字(也就是你的:WapDomain2
,SchoolId)。返回值就是你定義的對應的值,然後再進行使用。最好封裝到一個工具類中
② 在java中如何讀取properties文件
最常用讀取properties文件的方法
InputStream in = getClass().getResourceAsStream("資源Name");這種方式要求properties文件和當前類在同一文件夾下面。如果在不同的包中,必須使用:
InputStream ins = this.getClass().getResourceAsStream("/cn/zhao/properties/testPropertiesPath2.properties");
Java中獲取路徑方法
獲取路徑的一個簡單實現
反射方式獲取properties文件的三種方式
1 反射方式獲取properties文件最常用方法以及思考:
Java讀取properties文件的方法比較多,網上最多的文章是"Java讀取properties文件的六種方法",但在Java應用中,最常用還是通過java.lang.Class類的getResourceAsStream(String name) 方法來實現,但我見到眾多讀取properties文件的代碼中,都會這么干:
InputStream in = getClass().getResourceAsStream("資源Name");
這裡面有個問題,就是getClass()調用的時候默認省略了this!我們都知道,this是不能在static(靜態)方法或者static塊中使用的,原因是static類型的方法或者代碼塊是屬於類本身的,不屬於某個對象,而this本身就代表當前對象,而靜態方法或者塊調用的時候是不用初始化對象的。
問題是:假如我不想讓某個類有對象,那麼我會將此類的默認構造方法設為私有,當然也不會寫別的共有的構造方法。並且我這個類是工具類,都是靜態的方法和變數,我要在靜態塊或者靜態方法中獲取properties文件,這個方法就行不通了。
那怎麼辦呢?其實這個類就不是這么用的,他僅僅是需要獲取一個Class對象就可以了,那還不容易啊--
取所有類的父類Object,用Object.class難道不比你的用你正在寫類自身方便安全嗎 ?呵呵,下面給出一個例子,以方便交流。
import java.util.Properties;
import java.io.InputStream;
import java.io.IOException;
/**
* 讀取Properties文件的例子
* File: TestProperties.java
* User: leimin
* Date: 2008-2-15 18:38:40
*/
public final class TestProperties {
private static String param1;
private static String param2;
static {
Properties prop = new Properties();
InputStream in = Object. class .getResourceAsStream( "/test.properties" );
try {
prop.load(in);
param1 = prop.getProperty( "initYears1" ).trim();
param2 = prop.getProperty( "initYears2" ).trim();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 私有構造方法,不需要創建對象
*/
private TestProperties() {
}
public static String getParam1() {
return param1;
}
public static String getParam2() {
return param2;
}
public static void main(String args[]){
System.out.println(getParam1());
System.out.println(getParam2());
}
}
運行結果:
151
152
當然,把Object.class換成int.class照樣行,呵呵,大家可以試試。
另外,如果是static方法或塊中讀取Properties文件,還有一種最保險的方法,就是這個類的本身名字來直接獲取Class對象,比如本例中可寫成TestProperties.class,這樣做是最保險的方法
2 獲取路徑的方式:
File fileB = new File( this .getClass().getResource( "" ).getPath());
System. out .println( "fileB path: " + fileB);
2.2獲取當前類所在的工程名:
System. out .println("user.dir path: " + System. getProperty ("user.dir"))<span style="background-color: white;">3 獲取路徑的一個簡單的Java實現</span>
/**
*獲取項目的相對路徑下文件的絕對路徑
*
* @param parentDir
*目標文件的父目錄,例如說,工程的目錄下,有lib與bin和conf目錄,那麼程序運行於lib or
* bin,那麼需要的配置文件卻是conf裡面,則需要找到該配置文件的絕對路徑
* @param fileName
*文件名
* @return一個絕對路徑
*/
public static String getPath(String parentDir, String fileName) {
String path = null;
String userdir = System.getProperty("user.dir");
String userdirName = new File(userdir).getName();
if (userdirName.equalsIgnoreCase("lib")
|| userdirName.equalsIgnoreCase("bin")) {
File newf = new File(userdir);
File newp = new File(newf.getParent());
if (fileName.trim().equals("")) {
path = newp.getPath() + File.separator + parentDir;
} else {
path = newp.getPath() + File.separator + parentDir
+ File.separator + fileName;
}
} else {
if (fileName.trim().equals("")) {
path = userdir + File.separator + parentDir;
} else {
path = userdir + File.separator + parentDir + File.separator
+ fileName;
}
}
return path;
}
4 利用反射的方式獲取路徑:
InputStream ips1 = Enumeration . class .getClassLoader() .getResourceAsStream( "cn/zhao/enumStudy/testPropertiesPath1.properties" );
InputStream ips2 = Enumeration . class .getResourceAsStream( "testPropertiesPath1.properties" );
InputStream ips3 = Enumeration . class .getResourceAsStream( "properties/testPropertiesPath2.properties" );
③ java web應用程序的properties文件路徑
這個問題就得看你的配置文件放在哪裡啦,如果放在了項目的Classes目錄(或子目錄)下,你可以用**.Class.getResource('相對路徑')來獲取配置文件路徑.如果是其他目錄,那你只能在項目啟動時通過ServletContext獲取項目根目錄+配置文件的目錄來確定路徑.並把路徑放到類文件可以引用的地方啦.
以下是我在做項目時寫的一個用於獲取路徑的類,寫的可能不太好.但還是希望能對你有所幫助:
package com.example.web;
import java.io.File;
import java.net.URL;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
/**
* 路徑獲取類
* */
public class WebPath {
/**
* 獲取項目根目錄的絕對路徑
*
* @return 如:F:\TongJianpeng\J2EEUtil
* */
public static String getAbsolutePathWithProject() {
return System.getProperty("user.dir");
}
/**
* 獲取項目所在盤符
* */
public static String getDriverPathWithProject() {
return new File("/").getAbsolutePath();
}
/**
* 獲取項目根目錄的絕對路徑
*
* @return 項目根目.例如<br/> F:\tomcat\webapps\J2EEUtil\
* */
public static String getAbsolutePathWithWebProject(
HttpServletRequest request) {
return request.getSession().getServletContext().getRealPath("/");
}
/**
* 獲取項目根目錄下的指定目錄的絕對路徑
*
* @param 項目根目下的指定目錄
* .例如:/login/
* @return 項目根目下的指定目錄.例如:<br/> F:\tomcat\webapps\J2EEUtil\login\
* */
public static String getAbsolutePathWithWebProject(
HttpServletRequest request, String path) {
return request.getSession().getServletContext().getRealPath(path);
}
/**
* 獲取項目根目錄的絕對路徑
*
* @return 項目根目.例如<br/> F:\tomcat\webapps\J2EEUtil\
* */
public static String getAbsolutePathWithWebProject(ServletContext context) {
return context.getRealPath("/");
}
/**
* 獲取項目根目錄下的指定目錄的絕對路徑
*
* @param 項目根目下的指定目錄
* .例如:/login/
* @return 項目根目下的指定目錄.例如:<br/> F:\tomcat\webapps\J2EEUtil\login\
* */
public static String getAbsolutePathWithWebProject(ServletContext context,
String path) {
return context.getRealPath(path);
}
/**
* 獲取項目classpath目錄的絕對路徑
*
* @return classes目錄的絕對路徑<br/>
* file:/F:/tomcat/webapps/J2EEUtil/WEB-INF/classes/
* */
public static URL getAbsolutePathWithClass() {
return WebPath.class.getResource("/");
}
/**
* 獲取項目classPath目錄下的指定目錄的絕對路徑
*
* @param path
* classes目錄下的指定目錄.比如:/com/
* @return file:/F:/tomcat/webapps/J2EEUtil/WEB-INF/classes/com/
* */
public static URL getAbsolutePathWithClass(String path) {
return WebPath.class.getResource(path);
}
/**
* 獲取指定類文件的所在目錄的絕對路徑
*
* @param clazz
* 類
* @return 類文件的絕對路徑.例如:<br/> 包com.Aries.Util.Web下的Main.java類.<br/>
* 路徑為:file:/
* F:/tomcat/webapps/J2EEUtil/WEB-INF/classes/com/Aries/Util/Web/
* */
public static URL getAbsolutePathWithClass(Class clazz) {
return clazz.getResource("");
}
}
④ java讀取properties配置文件路徑問題
說說我的項目中的情況吧:
配置文件「weblogic11g.properties」保存在WEB-INFO目錄下,和web.xml在同一個目錄下。
一個JavaBean專門用於讀取配置文件的內容:
public class PropertiesIO {
private String fileName = null;
public PropertiesIO(String fileName){
this.fileName = getClass().getClassLoader().getResource("/").getPath() + "..\\" + fileName;
}
public String getValue(String key){
try{
InputStream in = new FileInputStream(fileName);
Properties prop = new Properties();
prop.load(in);
in.close();
return prop.getProperty(key);
}
catch(Exception err){
err.printStackTrace();
return null;
}
}
}
重點說明:getClass().getClassLoader().getResource("/")會得到當前項目下的「WEB-INF\classes」目錄,即JavaBean的*.class文件的根目錄,
getClass().getClassLoader().getResource("/").getPath() + "..\\" + fileName
就會得到當前項目下的「WEB-INF\weblogic11g.properties」文件。
getValue()是根據鍵值得到相應配置項的內容,這樣就簡單了。
⑤ java web工程中讀取properties文件,路徑一直不知道怎麼寫
InputStreamin=getClass().getResourceAsStream("/config.properties");
在靜態方法中,由於不能使用getClass()方法,必須寫出類的名字。區別不大。
MyClass.class.getResourceAsStream("/config.properties");
使用這個方法,路徑前面可以加斜杠也可以不加。根據Class類getResourceAsStream()方法的JavaDoc:
Finds a resource with a given name. The rules for searching resources associated with a given class are implemented by the defining class loader of the class. This method delegates to this object's class loader. If this object was loaded by the bootstrap class loader, the method delegates to ClassLoader.getSystemResourceAsStream.
Before delegation, an absolute resource name is constructed from the given resource name using this algorithm:
If the name begins with a '/' ('u002f'), then the absolute name of the resource is the portion of the name following the '/'.
Otherwise, the absolute name is of the following form:
modified_package_name/name
Where the modified_package_name is the package name of this object with '/' substituted for '.' ('u002e').
就是說,這個path假如以斜杠開頭,則斜杠後面的部分是文件相對classpath的路徑;假如不是,Java會把這個path看作是「包名/文件名」的結構,會嘗試在這個類的包裡面去找,而不是從classpath開始找;在這種情況下,除非你把properties文件放到MyClass.class所屬的包裡面,不然都會是null的。
MyClass.class.getClassLoader().getResourceAsStream("config.properties");
這是因為使用classloader進行讀取,所輸入的參數必須是一個相對classpath的絕對路徑,在格式上,一個絕對路徑是不能以'/'開頭的。
注意這兩個方法是同名的,但路徑參數的格式截然不同。
現在幾乎所有的web project都是maven project,Maven的默認設置是把
src/main/resources/
加入到classpath裡面的。那麼,最好的做法是把你的properties文件放進src/main/resources裡面,然後用上面代碼讀取。用Class類的,一般要加斜杠;用ClassLoader類的,絕不能加斜杠!
假如是Eclipse裡面,需要把這個src/main/resources加到classpath裡面。具體操作是右擊工程,選擇「Configure buildpath」,根據Maven的要求,把src/main/java和src/main/resources都加進去,並且保證Exclude是none,Include是all,或者至少要包括你需要讀取的文件。