【问题标题】:How can I have AJAX functionality in my JSF web application?如何在我的 JSF Web 应用程序中拥有 AJAX 功能?
【发布时间】:2011-06-07 14:07:06
【问题描述】:

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

【问题讨论】:

  • 你具体想要完成什么?

标签: java javascript ajax jsf dojo


【解决方案1】:

我假设您正在使用 JSF 1.x,因为 JSF 2.x 已经附带了 buitin Ajax 功能,那么这个问题将是非常夸张的。如果升级到 JSF 2.x 确实不是一个选项,那么您将不得不寻找具有内置 Ajax 功能的第 3 方 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 很好地介绍了您需要考虑的所有事项。你会发现这并不是那么简单。

【讨论】:

    【解决方案2】:

    在 jsf 2.0 中,我们有 f:ajax,您可以使用它

    另见

    【讨论】:

      【解决方案3】:

      我知道这是一篇旧帖子,但我认为这可能对仍在为 JSF 1.1 苦苦挣扎的任何人有所帮助。我找到了一种通过 JSF 1.1 获得 AJAX 功能的方法 - MyFaces 只需使用 jQuery 和 Servlet。你需要这些元素:

      1. 仅充当容器的 JSF 页面。使用 DIV 放置内容并通过 AJAX 刷新它们。在这个 DIV 中,仅在第一次加载时,您放置了一个包含第二个 JSF 页面的子视图。
      2. 第二个 JSF 页面。只是一个带有会话范围托管 Bean 的标准 JSF 页面,但打算通过 AJAX 重新加载。此页面是您将从 Servlet 对每个请求进行转发的地方。提前解释。
      3. 处理 AJAX 请求并重新加载第二个 JSF 页面的 Servlet。关键是从 FacesContext 类中获取处理第二个 JSF 的 Managed 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 视图 = facesContext.getApplication().getViewHandler().createView(facesContext, ""); facesContext.setViewRoot(view);

      // 现在你可以访问上下文了,你可以得到托管的bean 值绑定 vb = facesContext.getApplication().createValueBinding("#{YourManagedBean}"); YourManagedBeanClass yourBean = (YourManagedBeanClass) vb.getValue(facesContext);

      // 现在您可以操作托管 bean 属性到 finally 转发到 JSF 页面 // ... yourBean.setParameter(request.getParameter("myParam")); RequestDispatcher 调度员 = getServletContext().getRequestDispatcher("/path/to/your_second_jsf.xhtml"); dispatcher.forward(request, response);

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

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

      希望对你有帮助!

      【讨论】:

        猜你喜欢
        • 2013-11-26
        • 2011-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-12
        • 1970-01-01
        • 2017-06-29
        • 2013-04-12
        相关资源
        最近更新 更多