2013-06-04 56 views
-2

我正在使用struts 2.0。我正在設計一個Web應用程序。 我在我的應用程序中使用Jasper Report。我想訪問我的操作類中的*.jrxml文件。我不想給這些文件提供硬編碼的路徑。所以爲了動態獲取路徑,我使用了搜索方法,並得到了使用getRealPath()方法獲得路徑的解決方案。但是,我發現了兩個實施這樣做的:實現getRealPath()的最佳方法

  1. 使用HttpSession得到的ServletContext對象並使用ServletContext對象的getRealPath()方法。 像這樣:

    HttpSession session = request.getSession(); 
    String realPath = session.getServletContext().getRealPath("/"); 
    
  2. 第二個辦法做到這一點直接使用靜態方法ServletActionContextgetServletContext()。然後我們可以使用getRealPath()方法獲得應用程序的真實路徑。 像這樣:

    String realPath = ServletActionContext.getServletContext().getRealPath("/");

請告訴我,有沒有上面的兩個,也請告訴我是否有任何其他方式來獲取路徑之間有什麼區別?

+0

相關:http://stackoverflow.com/questions/12160639/what-does-mean-in-the-function-servletcontext-getrealpath和http://stackoverflow.com/questions/14843615/servlet-failing-to -write-uploaded-image-to-disk – BalusC

+0

你爲什麼不把你的文件放入webapp? –

+0

@AleksandrM這些文件在我的web應用程序中。但是我們有三個地方部署我們的應用程序。 localhost開發和測試應用程序,然後演示我們公司的服務器和現場服務器。如果我給出'/ WebContent/reports /'位置的硬編碼路徑,那麼每次將它部署到服務器時都必須更改它。而且我想要一種方式,所以我不需要每次都改變它。 – Vicky

回答

0

兩者都不是「更好」,真的,我認爲這兩者都不是特別好。

我可能會嘗試獲取初始化servlet中的上下文路徑並將其粘貼到應用程序上下文中,然後執行您的操作ApplicationAware並從映射中檢索值。

這有助於可測試性和刪除操作中的靜態引用。這就是說,我看到零理由要經過你的第一種方法的額外機制:它增加了很多噪音,沒有可感知的好處;我甚至不知道爲什麼它會被考慮。

我也會有點警惕將你的行爲綁定到這樣的路徑,除非有真正的需求,具體用途是什麼?一般而言,您不需要通過路徑訪問應用內資源。

+0

我在我的應用程序中使用JasperReports,需要路徑訪問操作類中的jasper文件,並且我使用路徑字符串作爲字段,以便我可以訪問報告所需的圖像。我所做的只是避免給出靜態路徑。 – Vicky