ArcGIS Server Java ADF 案例教程 32

来源:互联网 发布:手机应用分身软件 编辑:程序博客网 时间:2024/05/18 00:15

监听AJAX请求并响应
当从页面使用JavaScript发送了一个AJAX请求到服务器,服务器就需要对这个请求进行处理,因此这一小节的内容主要就是在服务器端。首先,让我们来了解一些JSF的内容——有关PhaseListener 。
所谓的Phase就是JSF请求的阶段,一个JSF请求的生命周期中存在不同的阶段,当用户从页面向服务器发送一个请求的时候,JSF请求的生命周期就开始了。以下就是著名的JSF请求生命周期中6个阶段:

图 23   JSF请求的生命周期

PhaseListener是对JSF请求的阶段进行监听的接口,当某个类实现了这个接口并添加到JSF应用中以后,每当服务器接收到JSF请求,并处理这个请求到某个阶段的时候,这个监听类就会被触发。
下面是实现的一个监听自定义AJAX请求的监听类:
public class MapUpdatePhaseListener implements PhaseListener
{
    public void afterPhase(PhaseEvent event)
    {
        FacesContext facesContext = event.getFacesContext();
        Map params = facesContext.getExternalContext().getRequestParameterMap();
        WebContext webContext = WebUtil.getWebContext(facesContext.getViewRoot());
        WebMap webMap = webContext.getWebMap();
        if("true".equals(params.get("mapZoom")))
        {          
            UIComponent form = facesContext.getViewRoot().findComponent("formMain");
            Vector eventSources = new Vector();
            try
            {
AJAXResponseRenderer renderer = new
AJAXResponseRenderer(facesContext, eventSources, form);
WebExtent extent = webMap.getCurrentExtent();
extent.expand(0.2);
webContext.refresh();
Document doc = renderer.renderResponse(facesContext);
AJAXUtil.writeResponse(facesContext, doc);
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
            finally
            {
                facesContext.responseComplete();
            }
        }
    }
    public void beforePhase(PhaseEvent event) { }
    public PhaseId getPhaseId()
    {
        return PhaseId.APPLY_REQUEST_VALUES;
    }
}
通过实现getPhaseId方法,我们指定了这个类监听的是JSF请求的应用请求值阶段;在这个阶段中,我们截获请求,并判断请求的参数。上一小节我们在请求的参数中加上了mapZoom这个属性,这里我们就要判断请求中有没有这个属性,如果这个属性值为true,那么就表示当前请求正是需要服务器处理 “地图放大5倍”这个功能的自定义请求。
在对这个请求的处理中,我们可以通过对WebContext对象的操作实现地图放大5倍的功能,但是在这里你会发现,实现这个功能以后并不像以前那样直接调用WebContext的refresh方法就可以展示给浏览器了,这是为什么呢?
关于WebContext的refresh方法为何可以将结果输出到浏览器,你可以回顾一下前面的《WebContext的refresh方法》。由于这里我们的请求并没有通过ADF组件来发送,因此PostBackPhaseListener不会被触发(而且其中也没有我们需要服务器实现的业务逻辑),这里的MapUpdatePhaseListener就需要自己输出AJAX响应。
具体如何构造AJAX响应,并通过AJAXUtil的writeResponse方法输出到浏览器,看一下上面的代码就清楚了。这里构造AJAX响应的过程显得比较复杂,这是因为我们在这里实现了对地图进行了更新(而不是通过Tool或Command),所以也需要我们自己去通知客户端当前服务器端Map 等组件的状态以便其刷新(如果你不需要通知客户端关于ADF组件的相关信息,比如只想通过AJAX获得某些信息,那就会比较简单,在下一小节中有这样的例子)。顺便提醒一下,自己构造AJAX响应的时候一定要注意实例化AJAXResponseRenderer对象、刷新WebContext、输出 AJAX响应这几个环节的先后顺序。
还有一点,需要使用这个PhaseListener,需要把这个类注册到faces-config.xml文件中去,如下所示:

wuyf.MapUpdatePhaseListener

当然,还有一种比较简便的办法就是在新建这个PhaseListener类的时候使用eclipse的菜单来定义,这比手动去改代码和配置文件要方便多了:

原创粉丝点击