【发布时间】:2011-06-07 14:07:06
【问题描述】:
我在 JSF 中有一个 Web 应用程序。我需要向它添加 AJAX 功能。我该怎么做?
【问题讨论】:
-
你具体想要完成什么?
标签: java javascript ajax jsf dojo
我在 JSF 中有一个 Web 应用程序。我需要向它添加 AJAX 功能。我该怎么做?
【问题讨论】:
标签: java javascript ajax jsf dojo
我假设您正在使用 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 很好地介绍了您需要考虑的所有事项。你会发现这并不是那么简单。
【讨论】:
【讨论】:
我知道这是一篇旧帖子,但我认为这可能对仍在为 JSF 1.1 苦苦挣扎的任何人有所帮助。我找到了一种通过 JSF 1.1 获得 AJAX 功能的方法 - MyFaces 只需使用 jQuery 和 Servlet。你需要这些元素:
//这进入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);
});
}
希望对你有帮助!
【讨论】: