2011-11-26 63 views
1

我的要求如下:如何獲得真實路徑在JSF中SessionListener

信息: ICEfaces的上傳組件,將文件上傳到相對的文件夾,併爲每個用戶創建該文件夾中的子目錄sessionId。

要求:sessionDestroyed爲每個用戶,我想獲得真正的路徑,刪除當前的用戶文件夾。

我知道如何與JSF真實路徑如下:

ServletContext ctx = (ServletContext) FacesContext.getCurrentInstance() 
       .getExternalContext().getContext(); 
     String deploymentDirectoryPath = ctx.getRealPath("/"); 

問題:如果你試圖獲得sessionDestroyed真實路徑,你會得到空指針異常,所以我在想,如果有一種方法可以在偵聽器中初始化變量deploymentDirectoryPath,以便我可以在sessionDestroyed方法中使用它,或者可以在應用程序啓動時初始化實際路徑變量並在此處使用它?

請指教如何解決這個問題。

回答

2

即使你還沒有發佈,涉及到的問題,實際的代碼,下面讓我真正的路徑:

public class MySessListener implements HttpSessionListener { 

    @Override 
    public void sessionCreated(final HttpSessionEvent se) { 
     System.out.println(Thread.currentThread().getStackTrace()[1]); 
     new Timer().schedule(new TimerTask() { 

      @Override 
      public void run() { 
       HttpSession sess = se.getSession(); 
       sess.invalidate(); 
      } 
     }, 10000); 
    } 

    @Override 
    public void sessionDestroyed(HttpSessionEvent se) { 
     System.out.println(Thread.currentThread().getStackTrace()[1]); 
     String realPath = se.getSession().getServletContext().getRealPath("/"); 
     System.out.println("realPath: " + realPath); 
    } 
} 

輸出

 
INFO: com.bhesh.demo.web.listener.MySessListener.sessionCreated(MySessListener.java:13) 
INFO: com.bhesh.demo.web.listener.MySessListener.sessionDestroyed(MySessListener.java:26) 
INFO: realPath: C:\Documents and Settings\Bhesh\My Documents\NetBeansProjects\JsfMessageList\build\web\ 
+0

我試圖在sessionDestroy下面的代碼,也許這就是問題的ServletContext'CTX =(ServletContext中)FacesContext的。 getCurrentInstance() .getExternalContext()。getContext(); String deploymentDirectoryPath = ctx.getRealPath(「/」);' –

+0

這就是我真正猜測的。這些都是JSF相關的,IMO最好把它們保存在JSF中。 –

+3

在會話銷燬期間,不一定需要'FacesContext',因爲它可以在JSF資源上沒有HTTP請求的情況下執行。所以'getCurrentInstance()'將返回'null'。順便說一句,'ExternalContext'也有一個'getRealPath()'方法。你應該更喜歡使用它。在JSF支持bean內導入'javax.servlet'是一種糟糕的做法。最後但不是最後,當容器被配置爲在內存而不是磁盤上展開WAR時,你應該真的考慮到'getRealPath()'可以返回'null'。如果您沒有100%的管理員控制,則不應使用它。 – BalusC

-1

你可以得到真正的路徑如下: -

FacesContext.getCurrentInstance().getExternalContext().getRealPath("/"); 

編輯: -

正如他在回答中提及了由BalusC,你應該三思而後使用getRealPath("/"),因爲,如果沒有選擇擴大戰爭的文件,然後,getRealPath("/")可能返回null之前。

改爲使用getExternalContext.getResourceAsStream。根據docs,在應用程序啓動或關閉期間調用此方法是有效的。

+1

請解釋downvote – Madhura

+0

請首先解釋這是如何在'HttpSessionListener'內工作的。 – BalusC

-1

此基礎上BalusC合理的建議和其他地方的人可以寫一個通用的函數是這樣的:

String getPath(){ 

ExternalContext tmpEC;  

tmpEC = FacesContext.getCurrentInstance().getExternalContext(); 
String realPath=tmpEC.getRealPath("/"); 
return realPath;  
} 
+0

你能解釋一下這個問題是如何回答這個問題的:這個問題是關於在會話拆解期間獲取路徑的時候,(當@BalusC在另一個答案的註釋中解釋)*可能不是FacesContext *? – mabi

+0

根據我對此的假設:「順便說一下,ExternalContext也有一個getRealPath()方法,您應該更喜歡使用它」。但是對於JSF來說相當新,我懷疑我誤解了。 – Jan

+0

該方法沒問題。重點是**整個上下文可能不可用**。如在,某些情況下,您的代碼將導致NullPointerException。 – mabi

相關問題