前面总结过一次关于AJAX请求,在总结中我们通过PhaseListener来捕捉请求参数,然后进行请求的分发和返回XML参数,最后在客户端进行解析。这一节我们通过提交task按钮请求,通过AJAX响应机制,获取task中的参数。
在CoustomTask的select(MapEvent event)函数中添加了下面一段代码:
int queryResultNumber = 0;
if(listQueryResult != null){
queryResultNumber = listQueryResult.size();
}
webContext.getWebSession().setAttribute("queryResultNumber", queryResultNumber);
我们定义了queryResultNumber,传入数据集的长度,作为参数加入到Session中。
下面建立一个CustomRenderer类,这个类实现AJAXRenderer接口。
public class CustomRenderer implements AJAXRenderer {
public Class getControlClass() {
return MapControl.class;
}
public Object getOriginalState(UIComponent component) {
return null;
}
public void renderAjaxResponse(FacesContext fctx, UIComponent component, Object state, boolean isEventSource, Element parent) {
WebContext wctx = WebUtil.getWebContext(component);
Object obj = wctx.getWebSession().getAttribute("queryResultNumber");
if(obj != null){
Element myElement = XMLUtil.createElement("queryResultNumber","",parent);
Element number = XMLUtil.createElement("number", "", myElement);
number.setAttribute("count", obj.toString());
wctx.getWebSession().setAttribute("queryResultNumber",null);
}
}
}
在CustomRenderer方法public void renderAjaxResponse可以看到对请求参数的处理过程,从Session中获得了queryResultNumber,XMLUtil创建xml文档,返回处理结果,然后提交XmlResponse。
类似与GISFunctionality一样,我们要将CustomRenderer类注册到Ajax-renderers配置文件中。打开WEB-INF/ajax-renderers.xml可以看到:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN" "http://java.sun.com/dtd/web-facesconfig_1_0.dtd">
<faces-config>
<managed-bean>
<display-name>AJAXRenderers</display-name>
<managed-bean-name>AJAXRenderers</managed-bean-name>
<managed-bean-class>java.util.ArrayList</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<list-entries>
<value>#{ajaxMapRenderer}</value>
<value>#{ajaxOverviewRenderer}</value>
<value>#{ajaxTocRenderer}</value>
<value>#{ajaxToolbarRenderer}</value>
<value>#{ajaxTaskRenderer}</value>
<value>#{ajaxPrintTaskRenderer}</value>
<value>#{ajaxEditRenderer}</value>
<value>#{customRenderer}</value>
<!--value>#{ajaxGpAsyncTaskResultsRenderer}</value-->
<value>#{ajaxMapViewerElementsRenderer}</value>
<value>#{ajaxMapViewerGpAsyncTaskResultsRenderer}</value>
</list-entries>
</managed-bean>
<managed-bean>
<managed-bean-name>customRenderer</managed-bean-name>
<managed-bean-class>com.esri.adf.web.developer.CustomRenderer</managed-bean-class>
<managed-bean-scope>none</managed-bean-scope>
</managed-bean>
</faces-config>
在此定义了customRenderer bean,并注册到AJAXRenderers中。
下面是前台的处理代码:
function init(){
initLayout();
closeTaskWindows();
EsriControls.addPostBackTagHandler("queryResultNumber",queryResultNumberHandler);
}
function queryResultNumberHandler(xml){
var numberTag = xml.getElementsByTagName("number").item(0);
alert("矩形框查询后结果一共有<" + numberTag.getAttribute("count") + ">个");
}
<body onload=”init()”>,在此处调用。
最后来梳理一下,从Task消息请求发起,整个响应的运行过程。首先程序会进入到select函数,执行在Session中设定queryResultNumber参数值,随后程序会进入 CustomRenderer,构建xmlResponse,之后前台的init()函数被调用,解析xml,获取参数,输出结果。