2008-09-03 73 views
4

是否有從豆或工廠類中不與Web容器相關聯的所有Servlet API的web.xml中指定的訪問屬性(如初始化參數)以任何方式?有沒有辦法從Java Bean訪問web.xml屬性?

例如,我正在編寫一個Factory類,並且我想在Factory中包含一些邏輯來檢查文件和配置位置的層次結構,以查看哪些可用來確定要實例化哪個實現類 - 例如,

  1. 屬性文件在類路徑中,
  2. 一個web.xml參數,
  3. 系統屬性,或
  4. 一些默認的邏輯,如果沒有其他可用。

我希望能夠做到這一點,而不會注入任何對ServletConfig或類似於我的工廠的任何參考 - 代碼應該能夠在Servlet容器外運行良好。

這可能聽起來有點不尋常,但我希望我正在研究的這個組件能夠與我們的一個web應用程序打包在一起,而且它還具有足夠的多功能性,可以與我們的一些命令打包在一起在線工具不需要一個新的屬性文件只爲我的組件 - 所以我希望能搭載其他配置文件,如web.xml。

如果我沒有記錯,.NET具有類似Request.GetCurrentRequest()獲得對當前正在執行Request參考 - 但由於這是一個Java應用程序,我尋找的東西simliar可以用來獲得對ServletConfig訪問。

回答

5

的一種方法是做一些事情:

public class FactoryInitialisingServletContextListener implements ServletContextListener { 

    public void contextDestroyed(ServletContextEvent event) { 
    } 

    public void contextInitialized(ServletContextEvent event) { 
     Properties properties = new Properties(); 
     ServletContext servletContext = event.getServletContext(); 
     Enumeration<?> keys = servletContext.getInitParameterNames(); 
     while (keys.hasMoreElements()) { 
      String key = (String) keys.nextElement(); 
      String value = servletContext.getInitParameter(key); 
      properties.setProperty(key, value); 
     } 
     Factory.setServletContextProperties(properties); 
    } 
} 

public class Factory { 

    static Properties _servletContextProperties = new Properties(); 

    public static void setServletContextProperties(Properties servletContextProperties) { 
     _servletContextProperties = servletContextProperties; 
    } 
} 

然後在下面你的web.xml

<listener> 
    <listener-class>com.acme.FactoryInitialisingServletContextListener<listener-class> 
</listener> 

如果您的應用程序在Web容器中運行,那麼聽者將由容器一旦環境已經創建調用。在這種情況下,_servletContextProperties將被替換爲web.xml中指定的任何上下文參數。

如果你的應用運行在Web容器之外,那麼_servletContextProperties將是空的。

1

你有沒有考慮使用這個Spring框架?這樣,你的豆沒有得到任何額外的污點,並且彈簧爲你處理配置設置。

0

我認爲你必須添加一個相關的引導類將參考到的ServletConfig(或ServletContext中)和轉錄這些值的工廠類。至少這樣你可以分開打包。

@toolkit:優秀,最卑微 - 這是我一直在嘗試了一段時間,你可以做到這一點

相關問題