2011-06-07 64 views

回答

1

我知道這是一個老帖子,但我認爲這可能對仍然在JSF 1.1中掙扎的人有所幫助。我發現了一種使用JSF 1.1獲得AJAX功能的方法 - 僅使用jQuery和Servlet的MyFaces 。你需要這些元素:

  1. 一個JSF頁面,只是作爲一個容器。用DIV放置你的內容並通過AJAX刷新它們。在這個DIV內部,爲了第一次加載,你爲第二個JSF頁面添加了一個包含子視圖的子視圖。
  2. 第二個JSF頁面。只是一個標準的JSF頁面,帶有一個Session範圍的Managed Bean,但是打算通過AJAX重新加載。這個頁面是您在每次請求時都會從Servlet轉發的地方。提前解釋。
  3. 處理AJAX請求並重新加載第二個JSF頁面的Servlet。關鍵是要得到管理bean處理來自FacesContext中類第二JSF,這樣你就可以操縱它,改變它的性質......爲了做到這一點:

//這正好servlet代碼的FacesContextFactory內contextFactory = (FacesContextFactory)FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY); LifecycleFactory lifecycleFactory = (LifecycleFactory)FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);生命週期生命週期= lifecycleFactory.getLifecycle(LifecycleFactory。DEFAULT_LIFECYCLE);

FacesContext facesContext = contextFactory.getFacesContext(request.getSession()。getServletContext(), request,response,lifecycle);

InnerFacesContext.setFacesContextAsCurrentInstance(facesContext);

UIViewRoot view = facesContext.getApplication()。getViewHandler()。createView(facesContext, 「」); facesContext.setViewRoot(視圖);

//現在您可以訪問的背景下,你可以得到託管bean VB的ValueBinding = facesContext.getApplication()createValueBinding( 「#{} YourManagedBean」)。 YourManagedBeanClass yourBean =(YourManagedBeanClass) vb.getValue(facesContext);您可以操縱託管bean屬性,最終將 轉發到JSF頁面// ... yourBean.setParameter(request.getParameter(「myParam」)); RequestDispatcher dispatcher = getServletContext()。getRequestDispatcher(「/ path/to/your_second_jsf.xhtml」); dispatcher.forward(request,response);

第一個JSF頁面是您應該爲AJAX請求提供javascript功能的地方。您可以從第二個JSF調用這些JavaScript函數。當AJAX請求執行回調時,您只需將HTML響應放入容器DIV中。 I.E:

//param: json structure of parameters 
function reloadAjaxPanel(param) { 
    $.get("/ajaxController", param, function(data) { 
     $("#container").html(data); 
    }); 
} 

希望它有幫助!

3

我假設你使用JSF 1.x中,因爲JSF 2.x已經附帶了buitin Ajax功能,那麼這個問題就非常有說服力。如果升級到JSF 2.x確實不是一種選擇,那麼您將不得不尋找具有內置Ajax功能的第三方JSF 1.x組件庫,例如RichFaces 3.x(不是4.x,因爲它需要JSF 2.x )或PrimeFaces 1.x(不是2.x或更新版本,因爲它需要JSF 2.x)。

RichFaces 3.x附帶了Ajax4jsf標籤庫(<a4j:xxx>),它支持基本的ajax功能,從<a4j:support>標籤開始。該標籤與JSF 2.x <f:ajax>標籤非常相似。

它是不會輕易可以引入「只是」一個JS庫例如Dojo,jQuery的,等等,因爲你需要改變在服務器端的JSF組件樹狀態以及每當您在HTML的變化客戶端的DOM樹。這些簡單的JS庫沒有考慮到這一點。你將不得不在自定義視圖處理程序中編寫大量額外的服務器端代碼。但這正是Ajax4jsf已經在做的,所以你想用它來代替重新發明輪子。

如果你真的打算自行增長; chapter 11 of the book JSF: The Complete Reference可以很好地介紹您需要考慮的所有事情。你會發現它並不是那麼簡單。

相關問題