您的位置:首页 > 编程语言 > Java开发

ArcGIS Server Java ADF 案例教程 32

2009-06-24 00:54 393 查看
监听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的菜单来定义,这比手动去改代码和配置文件要方便多了:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: