簡體   English   中英

如何在我的 JSF web 應用程序中擁有 AJAX 功能?

[英]How can I have AJAX functionality in my JSF web application?

我在 JSF 中有一個 web 應用程序。 我需要向它添加 AJAX 功能。 我怎樣才能做到這一點?

我假設您使用的是 JSF 1.x,因為 JSF 2.x 已經附帶了 buitin Ajax 功能,那么這個問題將是非常修辭的。 If upgrading to JSF 2.x is indeed not an option, then you'll have to look for a 3rd party JSF 1.x component library with builtin Ajax functionality, such as RichFaces 3.x (not 4.x since it requires 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>標簽非常相似。

It is not easily possible to introduce "just" a JS library such as Dojo, jQuery, etc, because you need to alter the JSF component tree state in the server side as well whenever you make changes in the HTML DOM tree in the client side . 那些簡單的 JS 庫沒有考慮到這一點。 您將不得不編寫大量額外的服務器端代碼,以自定義視圖處理程序的風格。 但這正是 Ajax4jsf 已經在做的事情,所以您希望使用它而不是重新發明輪子。

如果您真的打算在家種植; JSF 一書的第 11 章:完整參考書很好地介紹了您需要考慮的所有事項。 你會發現它並不是那么微不足道。

使用 jsf 2.0 我們有f:ajax您可以使用

也可以看看

我知道這是一篇舊帖子,但我認為這可能對仍在努力使用 JSF 1.1 的任何人有所幫助。 我找到了一種方法來獲得 AJAX 功能與 JSF 1.1 - MyFaces只使用 jQuery 和 Servlet 你需要這些元素:

  1. 僅充當容器的 JSF 頁面。 使用 DIV 放置內容並通過 AJAX 刷新它們。 在此 DIV 中,僅在第一次加載時,您放置了一個包含第二個 JSF 頁面的子視圖。
  2. 第二個 JSF 頁面。 只是一個標准的 JSF 頁面,其中包含一個 Session 范圍的托管 Bean,但打算通過 AJAX 重新加載。 此頁面是您將從 Servlet 對每個請求進行轉發的地方。 前面解釋過了。
  3. 處理 AJAX 請求並重新加載第二個 JSF 頁面的 Servlet。 關鍵是從 FacesContext class 中獲取處理第二個 JSF 的托管 Bean,這樣您就可以對其進行操作,更改其屬性...為此:

//這進入 Servlet 代碼 FacesContextFactory contextFactory = (FacesContextFactory)FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY); LifecycleFactory 生命周期工廠 = (LifecycleFactory)FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY); 生命周期生命周期 = lifecycleFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);

FacesContext facesContext = contextFactory.getFacesContext(request.getSession().getServletContext(), 請求、響應、生命周期);

InnerFacesContext.setFacesContextAsCurrentInstance(facesContext);

UIViewRoot view = facesContext.getApplication().getViewHandler().createView(facesContext, ""); facesContext.setViewRoot(view);

// 現在你可以訪問上下文,你可以得到托管 bean ValueBinding vb = 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(請求,響應);

第一個 JSF 頁面是您應該為 AJAX 請求放置 javascript 功能的地方。 您從第二個 JSF 調用這些 javascript 函數。 當 AJAX 請求執行回調時,您只需將 HTML 響應放入容器 DIV 中。 IE:

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

希望能幫助到你!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM