如何在JSF Web应用程序中使用AJAX功能?

时间:2011-06-07 14:07:06

标签: java javascript ajax jsf dojo

我在JSF中有一个Web应用程序。我需要为它添加AJAX功能。我怎么能这样做?

3 个答案:

答案 0 :(得分: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可以很好地介绍您需要考虑的所有事项。你会发现它并不是那么微不足道。

答案 1 :(得分:2)

使用jsf 2.0,我们可以使用f:ajax

另见

答案 2 :(得分:1)

我知道这是一个老帖子,但我认为这对任何仍在努力使用JSF 1.1的人都有帮助。我找到了一种使用JSF 1.1获取AJAX功能的方法 - MyFaces 只使用jQuery和Servlet 。你需要这些元素:

  1. 一个充当容器的JSF页面。使用DIV,您可以放置​​内容并通过AJAX刷新它们。在这个DIV中,只是为了第一次加载,你将一个带有include的子视图放到第二个JSF页面。
  2. 第二个JSF页面。只是一个带有会话范围的Managed Bean的标准JSF页面,但是打算通过AJAX重新加载。这个页面是您在每次请求时从Servlet转发的地方。提前解释。
  3. 处理AJAX请求并重新加载第二个JSF页面的Servlet。关键是从FacesContext类中获取处理第二个JSF的Managed Bean,这样你就可以操作它,改变它的属性......为此:
  4.   

    //这里面是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()方法,   请求,响应,生命周期);

         

    InnerFacesContext.setFacesContextAsCurrentInstance(FacesContext的);

         

    UIViewRoot view =   facesContext.getApplication()。getViewHandler()。CreateView的(FacesContext中,   “”); facesContext.setViewRoot(视图);

         

    //现在您可以访问上下文,您可以获取托管bean   ValueBinding vb =   facesContext.getApplication()createValueBinding( “#{YourManagedBean}”)。   YourManagedBeanClass yourBean =(YourManagedBeanClass)   vb.getValue(FacesContext的);

         

    //现在您可以最终操作托管bean属性   转发到JSF页面// ...   yourBean.setParameter(用request.getParameter( “myParam”));   RequestDispatcher dispatcher =   。getServletContext()方法的getRequestDispatcher( “/路径/到/ your_second_jsf.xhtml”);   dispatcher.forward(请求,响应);

    第一个JSF页面是你应该为AJAX请求添加javascript功能的地方。你从第二个JSF调用这些javascript函数。当AJAX请求执行回调时,您只需将HTML响应放在容器DIV中。即:

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

    希望它有所帮助!