2013-05-30 71 views
1

我在我的項目中有一個屬性文件message_en.properties message_de.properties,並且我有條目InfoBox_description =歡迎使用這個應用程序和德語對應的值。現在用戶應該被允許動態地改變描述,並且同樣應該反映在其他屬性文件中並且具有正確的轉換。我應該這樣做嗎?我使用JSF2和總理面臨提前動態編輯屬性文件

+0

如果應該動態更改某些內容,則不應使用屬性。重新思考你的設計,因爲你打算做的事實在是個壞主意。 –

+0

[在何處放置配置屬性文件到JSP/Servlet Web應用程序中?](http://stackoverflow.com/questions/2161054/where-to-place-configuration-properties-files-in-a-jsp -servlet-web-application)雖然在你的具體情況下,我認爲存儲在數據庫中並使用自定義資源包控制是一個更好的解決方案,這樣你也可以更好地控制緩存。 – BalusC

+0

@LukŁukaszLech:我同意你的看法,但這對我來說並不合適,但在我的情況下,用戶不會經常更改描述,但只需很少的時間,他希望動態地執行此操作,並希望使用屬性文件進行轉換。 – shreekanth

回答

0

感謝假設你有你的屬性文件你的戰爭中,在源文件夾中的包,你這是怎麼加載在託管bean:

Properties properties = new Properties(); 
try { 
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
    properties.load(classLoader.getResourceAsStream("/yourfile.properties")); 
} catch (IOException e) { 
    // handle exception 
} 

// then initialize attributes with the contents of properties file. Example: 
property1 = properties.getProperty("property1"); 
property2 = properties.getProperty("property2"); 

然後,當用戶更新值(提交表格),並要更新的屬性文件,請執行下列操作:

properties.setProperty("property1", property1); 
properties.setProperty("property2", property2); 

try { 
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
    URL url = classLoader.getResource("/yourfile.properties"); 
    properties.store(new FileOutputStream(new File(url.toURI())), null); 
} catch (Exception e) { 
    // handle exception 
} 

如果屬性文件是不是在T他的戰爭(這是在服務器的文件系統),也可以,但有點複雜..

編輯:如BalusC解釋的,具有屬性文件,你的戰爭中變化並不方便,因爲如果你重新部署你的戰爭,然後改變失敗。如果您有權訪問它,您可以將屬性文件放入服務器的文件系統中;或不使用屬性文件(使用數據庫)

+0

該webapp的'/ resources'文件夾沒有被類路徑覆蓋。另外,當WAR不在磁盤文件系統上展開時,寫入這種方式完全不起作用,而是在內存中展開。即使它起作用,在重新部署WAR或重新啓動服務器時,所有更改都會丟失,原因很簡單,原因是這些更改未包含在原始WAR中。 – BalusC

+0

感謝@BalusC的評論。我前段時間實現了這個,我記不起是否放置了屬性文件。我想這是在源文件夾中的包中。在我的實現中,我使用了一些服務器配置來訪問服務器文件系統中的屬性文件,因此重新部署後配置不會丟失,但問題未指定此 – Damian

+0

@BalusC:如果用戶動態改變英文,現在該怎麼做我也反映德國人的變化嗎?反之亦然。是否有任何此轉換的API – shreekanth