2013-03-29 124 views
2

我使用的RequestContext的primeFaces在託管bean方法對象,以便從服務器端執行一些javascript。我以前做這個監聽處理方法(從f:ajax標籤的AjaxBehaviourEvent參數處理請求的方法)內,它的工作原理,但這個時候,我使用的方法不帶任何參數。顯示java.lang.NullPointerException在org.primefaces.context.RequestContext.getCurrentInstance

問題是,即時追加一些html與jquery .append()和不得不使用jquery ajax從添加元素髮送請求到服務器(我不能追加任何jsf組件,因爲它們不會工作,因爲它們是不是由jsf本身生成的),所以我必須使用不帶參數的bean方法,並從處理ajax來處理resquest的servlet調用該方法。

解釋這個更詳細,假設我添加HTML代碼與jQuery這樣:

$('#substartmenudiv').append('<div id="congesdiv" />'); 

然後添加必須執行一次新增加的div被點擊代碼:

$('#congesdiv').click(function(){ 
$.post('AjaxRelaisServlet',{action:"setstrtmenustatus",startmenuisopen:startmenuisopen}); 
}); 

和從servlet我趕由AJAX請求發送參數和呼叫bean方法:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 


boolean startmenuisopen= Boolean.valueOf(request.getParameter("startmenuisopen")); 

     UserBean.testcmdlink(startmenuisopen); 

被叫testcmdlink bean方法包含RequestContext對象,它看起來像這樣:

public static void testcmdlink(boolean startmenuisopen){   

     RequestContext context = RequestContext.getCurrentInstance(); 
     if(!startmenuisopen){ 
     context.execute("$('#substartmenudiv').append('<div id="+"gestprofdiv"+" />');"); 
     context.execute("displaymenuitems();"); 
     context.execute("console.log('more elements are appended !!');"); 
     startmenuisopen=true; 

     }else{ 
      context.execute("$('#substartmenudiv').empty();"); 
      context.execute("window['bottomvalue'] =30;"); 
      context.execute("console.log('start menu div is emptied !!');"); 
      startmenuisopen=false; 
     } 

    } 

有沒有辦法讓它在任何地方工作?

喝彩!

+0

請張貼代碼,解釋你想在AJAX請求做什麼,你要調用的方法。 – partlov

+0

Hi BalusC !!我需要你爲我剛纔的問題請http://stackoverflow.com/questions/15691240/servlet-3-0-doesnt-work – Bardelman

+0

我知道其他一些方法可以使獲得相同的結果,但我需要更多的控制從服務器端的視圖,因爲我將需要保存數據庫中的HTML組件css屬性。其實我需要這種方式來工作,因爲我將來需要更多的東西。 – Bardelman

回答

2

你不能做到這一點。在引擎蓋下,RequestContext依賴於FacesContext對象。此對象is not available outside of a JSF lifecycle processing

可能能夠找到一個方法來的東西正確的JSF請求期間獲得Constants.REQUEST_CONTEXT_ATTR對象到一般ServletContext,然後檢索servlet中的對象作弊這一點。我要去這一飛躍信仰的基礎上,RequestContext.getCurrentInstance()在PF源實施

public static RequestContext getCurrentInstance(){ 
return (RequestContext)FacesContext.getCurrentInstance().getAttributes().get(Constants.REQUEST_CONTEXT_ATTR); 
} 
+0

似乎仍然有希望在處理生命週期之外使用RequestContext,就像您在之前的文章中提到的BalusC的文章中所述,但我仍然需要知道如何從FacesContext獲取RequestContext,並且我懷疑這是可能的RequestContext i實際上需要的是一個org.primefaces.context.RequestContext,它有一個方法execute(.. JS ..) – Bardelman

+0

RequestContext的實例被保存爲FacesContext.i中的一個屬性,在這裏找到了我的問題的答案:http:// stackoverflow。 com/questions/15428342/requestcontext-throws---a-different-context-than-facescontext – Bardelman

+0

@ user1705922,yup,看起來像它。所以結合BalusC的黑客和建議,你會得到你想要的。恭喜。我正在更新 – kolossus

0

你可以找到你的問題的答案。我假設你有一個Listener處理程序方法,它監聽請求並用參數處理它們。所以你需要傳遞一些參數,或者你需要創建一個不接受任何參數來處理你的請求的新方法。 當沒有參數時,它拋出一個NullPointerException異常。

希望它有幫助!

相關問題