我有一个JSF中的web应用程序。我需要添加AJAX功能。我该怎么做?
我假设您使用的是JSF 1.x,因为JSF 2.x已经附带了内置的Ajax功能,所以这个问题很有说服力。如果升级到JSF 2.x确实不是一个选项,那么您将不得不寻找一个具有内置Ajax功能的第三方JSF 1.x组件库,例如RichFaces3.x(不是4.x,因为它需要JSF 2.x)或PrimeFaces1.x(不是2.x或更高版本,因为它要求JSF2.x)
RichFaces3.x附带了Ajax4jsf标记库(<a4j:xxx>
),它支持基本的ajax功能,从<a4j:support>
标记开始。这个标签与JSF 2.x <f:ajax>
标签非常相似。
引入"仅仅"一个JS库(如Dojo、jQuery等)是不容易的,因为无论何时在客户端的HTMLDOM树中进行更改,都需要来更改服务器端的JSF组件树状态。那些简单的JS库没有考虑到这一点。您将不得不以自定义视图处理程序的风格编写大量额外的服务器端代码。但这正是Ajax4jsf已经在做的事情,所以你想使用它,而不是重新发明轮子。
如果你真的打算土生土长;《JSF:完整参考》一书的第11章很好地介绍了您需要考虑的所有内容。你会发现这并不是那么微不足道。
使用jsf 2.0,我们有f:ajax
,您可以使用
另请参见
- 如何在不刷新的情况下更新页面中显示的a值
我知道这是一篇老文章,但我认为这对任何仍在使用JSF 1.1的人都有帮助。我发现了一种使用JSF 1.1获得AJAX功能的方法——只需使用jQuery和Servlet即可实现MyFaces。你需要这些元素:
- 一个只充当容器的JSF页面。使用DIV,您可以将内容放在其中,并通过AJAX刷新它们。在这个DIV中,仅对于第一次加载,您就为第二个JSF页面放置了一个包含的子视图
- 第二个JSF页面。只是一个标准的JSF页面,带有一个会话范围的托管Bean,但打算通过AJAX重新加载。在这个页面上,您将对每个请求进行Servlet转发。前面已经解释过了
- 一个Servlet,它处理AJAX请求并重新加载第二个JSF页面。关键是从FacesContext类中获取处理第二个JSF的ManagedBean,这样您就可以操作它,更改它的属性。。。要做到这一点:
//这进入Servlet代码FacesContextFactory上下文工厂=(FacesContextFactory)FactoryFinder.getFactory(FactoryFinder:FACES_CONTEXT_FACTORY);生命周期工厂生命周期工厂=(生命周期工厂)FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);生命周期生命周期=lifecycleFactory.getLifecycle(生命周期工厂.DEFAULT_LIFECYCLE);
面上下文面上下文=contextFactory.getFacesContext(request.getSession().getServlet Context(),请求、响应、生命周期);
InnerFacesContext。setFacesContextAsCurrentInstance(facesContext);
UIViewRoot视图=facesContext.getApplication().getViewHandler().createView(facesContext,");facesContext.setViewRoot(视图);
//现在您可以访问上下文,您可以获得托管beanValueBinding vb=facesContext.getApplication().createValueBinding("#{YourManagedBean}");YourManagedBeanClass yourBean=(YourManagedBeanClass)vb.getValue(facesContext);
//现在,您可以操作托管bean属性以最终转发到JSF页面//。。。yourBean.setParameter(request.getParameter("myParam"));RequestDispatcher调度器=getServlet上下文().getRequestDispatcher("/path/to/your_second_jsf.xhtml");dispatcher.forward(请求、响应);
第一个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);
});
}
希望它能有所帮助!