JAVA ADF运行原理(6)-----AJAXRenderer

     前面总结过一次关于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,获取参数,输出结果。

 

 JAVA ADF运行原理(6)-----AJAXRenderer

你可能感兴趣的:(java,Ajax,Web,bean,xml)