在JavaWEB中将Ajax动态查询结果转换成List<Map>型JavaScript数组

用Ajax方式查询获取一组数据,用于页面显示,会有效改善用户体验。Ajax动态查询需要注意以下几点。

一、客户端需要实现Ajax请求,标准的JavaScript Ajax代码很长,用户可以用jQuery等实现。

这里使用pvo.query(action,function(){},isText)方法

如何实现标准的JavaScript Ajax代码,在附件1的这个方法中有详细的说明,非常方便,查询结果保存在pvo.RESULT变量中。

             范例queryEx01 

                   /**

                   *在<span id="selectSPAN"></span>节点中对动态添加的分类动态添加<select/>代码:

                   */
                    function queryEx01(){
                        var action=pvo.ROOTPATH+"/ajax/ps?method=queryLabel";
                        pvo.query(action,function(){
                            //var v=pvo.RESULT;//获取查询结果
                            //var v=pvo.getResult();//获取查询结果
                            var v=pvo.getSomeRecord(pvo.getResult(), "groupid", "栏目分类");//获取查询结果子集
                            var s="";
                            for(var i=0;i<v.length;i++){
                                s=s+"<option value='"+v[i].get("label")+"'>"+v[i].get("label")+"</option>";
                            };

                            document.getElementById("selectSPAN").innerHTML="<select name='columnsid' style='width:80px;'>"+s+"</select>";
                        });
                    } 

 

2、服务器端的实现

关键要实现标准xml格式字符串,对超文本字符如“<”、“>”“要进行转换。

为了便于实现,请在http://download.csdn.net/detail/wj800/3808299下载最新的HashMap关系数据映射技术源代码和jar文件(pvo_1.3资源包)


    /**

     关键是传回

          <rocords>  

              <record><field1>value1</field1><field2>value2</field2>...<fieldn>valuen</fieldn><record>         

              <record><field1>value1</field1><field2>value2</field2>...<fieldn>valuen</fieldn><record>

              ......

         </records>

         标准xml格式的字符串
     */
    private void query(HttpServletRequest request, HttpServletResponse response) {
        response.setContentType("text/xml;charset=UTF-8");
        String returnValue = "";
        PrintWriter out = null;
        try {
            out = response.getWriter();
            String xml = "";
            ProcessVO pvo = new ProcessVO(Db.instance().getCon());
            try {
                List v = pvo.getSomeRecord("select * from label", 1, 5000, true);//查询5000条以内的数据
                if (v.size() > 0) {
                    for (int i = 0; i < v.size(); i++) {
                        Map map = (Map) v.get(i);
                        xml = xml + "<record>" + mapToXml(map) + "</record>";
                    }
                }
                xml = "<records>" + xml + "</records>";
                returnValue = xml;
            } finally {
                pvo.closeCon();
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            out.write(returnValue);
            out.close();
        }
    }

 

      /**

      *将Map对象格式化为标准的xml格式字符串

      */
    public String mapToXml(Map m) {
        String xml = "";
        if (m != null && m.size() > 0) {
            Set set = m.keySet();
            Object[] obj = set.toArray();
            for (int i = 0; i
                    < obj.length; i++) {
                xml = xml + "<" + obj[i] + ">" + filterChar(m.get(obj[i])) + "</" + obj[i] + ">";
            }
        }
        return xml;
    }


    /**
     * 在String中,使用s.replace("<","&lt;");使用s.replace(">","&gt;");不能达到预期效果

     * 替换字符'<'和'>',实现对超文本的支持
     **/
    public String filterChar(Object obj) {
        String str = "";
        if (obj == null) {
            return str;
        }
        str = obj.toString();

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i
                < str.length(); i++) {
            if (str.charAt(i) != '<' && str.charAt(i) != '>' && str.charAt(i) != '"' && str.charAt(i) != '&') {// && str.charAt(i) != '\''
                sb.append(str.charAt(i));
            } else {
                if (str.charAt(i) == '<') {
                    sb.append("&lt;");
                }
                if (str.charAt(i) == '>') {
                    sb.append("&gt;");
                }
                if (str.charAt(i) == '"') {
                    sb.append("&quot;");
                } //if (str.charAt(i) == '\'') {
                // sb.append("&#146;");//&acute;
                //}
                if (str.charAt(i) == '&') {
                    sb.append("&amp;");
                }
            }
        }
        return sb.toString();
    }

 

三、效果

 

 

 

附件使用说明:

0、附件1中主要包含了一些常用的方法,如对表单的提取、Ajax表单(包括超文本)上传、Ajax查询、对数组分页、图片的等比缩放等等。这些方法主要针对List<Map>类型的数据结构实现的一些算法,也可以说是“HashMap关系数据映射技术”这一思想在web客户端的延伸,从而将服务端与客户端的设计思想统一了起来。这些方法基本上均可在jQuery中调用。

 

1、请将附件1保存为pvo.js文件,在网页头部添加这个资源文件如:

<script type='text/javascript' src='/有效路径/pvo.js'></script>

 

2、如果你的JavaWeb应用上下文根目录不是"",请将附件2保存为jbxx.jsp文件,在网页头部添加这个资源文件如:

<script type='text/javascript' src='/有效路径/jbxx.jsp'></script>

 

3、以下文件均包含在最新上传的HashMap关系数据映射技术软件源代码和jar文件的资源包中,下载地址:http://download.csdn.net/detail/wj800/3808299

 

 

 

附件1:完整的pvo.js源代码

 

/**
 * author: Kaiming Hu  2009-01-27 Chinese New Year 2
 * task:
 * 1、取代原pvo.js
 * 2、对通用表单、菜单、页面管理等共享资源进行整合
 * 3、增强异步请求与响应处理
 * 4、iframe动态内容加载管理
 * 5、事件注册管理
 * 6、浮动层动态加载管理
 * 7、路径设置与初始化管理,如:域名、上下文路径、访问某资源的请求路径...
 * 8、共享变量管理,如:路径、命令栈、最近一次请求的变量
 * 9、数据格式转换,如表单数据转换成xml数据、xml数据转换成Array[Map]型list数据,xml数据转换成表单数据...
 * 10、根据实际需要,借鉴和利用好现有的开源代码如:Jmaki.js、JQuery.js
 * 11、字段验证
 * 12、支持JSON格式
 * 13、拒绝重复删除、更新及查询提交。若用户希望再次看到相同的结果,请将第一次提交的结果保存。如var userVar=null;在回调方法中用userVar=pvo.RESULT;保存结果
 * 14、提供与JDBC一致的查询方法executeQuery()
 * 15、提供与JDBC一致的删除或更新方法executeUpdate()
 * 16、提供表单方法ajaxForm()和ajaxEscapeForm(),根据用户需要返回两种不同的查询结果,记录集和html文本片断
 * 17、提供分页方法page()
 * 18、提供清空表单方法clearForm(formName)
 * 19、提供删除或更新后重复条件查询方法queryRepeat()
 * 20、提供一组默认的写栏目的范例方法,以exDDD命名。如:ex001()
 * 21、提供一组幻灯范例方法,以slideDDD命名。如slide001()
 * 22、增加几个实用的返回值方法:getResult(),getRootPath(),获取分页条的ID方法getPageBarID(),获取分页主体的ID方法getPageBodyID()  //2010-05-31
 * 23、增加一个实用方法:initFormOneRecord(obj) //obj={formName:null,index:0,map:null} //2010-06-07
 *
 * 约定:
 * 1、使最终结果在使用上尽可能与java语言风格保持一致,如Map、List、Set、Stack、Menu的操作方式
 * 2、与JavaBean具有一致的读写习惯,如:对对象内部变量xxx提供object.setXxx()与object.getXxx()方法
 * 3、对象中的共享常量与Java中的public常量具有相同的访问方式,如object.XXX
 * 4、对于需要对外发布的方法提供如下机制:object.方法名=方法名
 * 以上的object在内部通常用this表示,使用或继承时用对象名表示
 */


var DESC=false;
var ASC=true;
var pre_IFRAME_ID="_IFRAME_";
function pvoObject(){
    var pvo=this;
    pvo.sys={
        AUTHOR:"Kaiming Hu from China",
        VERSION:"pvo v1.4"
    };

    pvo.SITE="网址=协议+域名+端口
    pvo.ROOTPATH = "";//上下文路径,根目录
    pvo.SUBPATH="";//上下文路径下,用于存放子网站的路径
    pvo.MENUITEM = null;
    pvo.PRE_MENUITEM = null;
    pvo.RESULT =null;

    pvo.getRoot=function(){
        return pvo.ROOTPATH;
    }

    pvo.setRoot=function(root){
        if(root!=null){
            pvo.ROOTPATH=root;
        }
    }

    pvo.getSubPath=function(){
        return pvo.SUBPATH;
    }
    pvo.setSubPath=function(subPath){
        if(subPath!=null){
            pvo.SUBPATH=subPath;
        }
    }


    初始化pvo.IFRAMES
    //一组参数与方法,对xml文档进行分页 开始 *********************************************************************************************
    //一组共享查询结果集 开始
    var lastList=null;//这是一个被共享访问的,最新被选择的活跃的查询结果,以便于在分页标签中重复使用,
    var setLastList=function(_lastList){
        lastList=_lastList;
    }
    var getLastList=function(){
        return lastList;
    }
    var pageList=null;//分页时,从lastList中提取的当前页中使用的查询结果
    pvo.setPageList=function(_pageList){
        pageList=_pageList;
    }
    pvo.getPageList=function(){
        return pageList;
    }

    //一组共享查询结果集 结束

    //分页开始
    /**
     * 分页方法
     * @param divID 将要在其中显示的容器,
     * @param list 通过XMLHttpRequest查询返回的xml文档,将此xml转换成的list
     * @param numPerPage 每页显示的记录条数
     * @param numPerOne 每一维显示的分页数
     * @param numCurrent 当前显示的页码
     * @param userPageContentMethod 当前调用的用户方法,主要用于写数据内容
     * @param bodyClass 主体内容的样式类
     * @param barClass 主体内容的样式类
     *  //format 数据显示格式 详见pvo.js中的格式化
     *  //className 数据显示样式类名
     *  任务:
     *  1、根据条件,判断是否显示分页导航条
     *  2、返回当前从一个完整的List对象中所选部分数据
     */
    pvo.page=function(divID,list,numPerPage,numPerOne,numCurrent,userPageContentMethod,barClass,bodyClass){
        if(bodyClass==null)bodyClass='pageContent';
        if(barClass==null)barClass='pageBar';
        var page=this;
        if(list==null)list=getLastList();//
        var tmpList=list.slice(numPerPage*numCurrent,numPerPage*numCurrent+numPerPage);
        pvo.setPageList(tmpList);
        page.list=list;
        //设置当前分组号 开始
        var numGroup=0;
        this.setNumGroup=function(_numGroup){
            numGroup=_numGroup;
        }
        this.getNumGroup=function(){
            return numGroup;
        }
        //设置当前分组号 结束
        //设置当前索引号 开始
        var current=0;
        this.setNumCurrent=function(_numCurrent){
            current=_numCurrent;
        }
        this.getNumCurrent=function(){
            return current;
        }
        this.setNumCurrent(numCurrent);
        //设置当前索引号 结束
        //容器 开始
        var indexBarID=divID+"Header";//用于定义索引容器的id
        var listContentID=divID+"Body";//用于定义内容容器的id
        var listDiv="<div class='pageList'><div id='"+indexBarID+"' class="+barClass+" style='width:100%;' style='display:none;'></div><div id='"+listContentID+"' class="+bodyClass+"></div></div>";
        function initDiv(){//写容器//分页页面结构
            if(!document.getElementById(indexBarID))document.getElementById(divID).innerHTML=listDiv;
            if(list.length<=numPerPage){
                document.getElementById(indexBarID).style.display="none";
            }else{
                document.getElementById(indexBarID).style.display="block";
            }
        }
        initDiv();
        //容器 结束
        /**
         * 用户自定义方法 如:pvo.method001=function(){}
         * 供分页方法调用 如: οnmοuseοver=\"pvo.page('coNews',null,3,10,0,method001);
         * pvo.userPage将执行method001方法
         * 在用户自定义方法中,
         * 用户可以用 var list=getPageList();获取分页数据结果,
         * 待填写的容器是:<div id='"+listContentID+"'></div>,该容器已提供
         * 其中 var listContentID=divID+"Body";
         **/
        pvo.userPage=function(){}
        if((userPageContentMethod!=null))userPage=userPageContentMethod;//使用回调函数

        //初始化索引条 开始
        var all=list.length;
        var allPages=0;//总页数
        var i=all%numPerPage;
        if(i==0){
            allPages=parseInt(all/numPerPage);
        }else{
            allPages=parseInt(all/numPerPage+1);
        }

        var group=1;//总分组数
        var j=all%(numPerPage*numPerOne);
        if(j==0){
            group=parseInt(all/(numPerPage*numPerOne));
        }else{
            group=parseInt(all/(numPerPage*numPerOne)+1);
        }
        var oneGroupPages=numPerOne;//当前组的页面数,
        if(allPages<numPerOne){
            oneGroupPages=allPages;
        }
        pvo.showGroup=function(numGroup){
            setNumGroup(numGroup);
            numCurrent=numGroup*numPerOne;
            showPage(numCurrent);
        }
        pvo.showPage=function(numCurrent){
            numGroup=getNumGroup();
            if(allPages-numGroup*numPerOne<numPerOne)oneGroupPages=allPages-numGroup*numPerOne;
            else{
                oneGroupPages=numPerOne;
            }
            var tmpList=list.slice(numPerPage*numCurrent,numPerPage*numCurrent+numPerPage);
            setPageList(tmpList);
            setNumCurrent(numCurrent);
            var begin=numGroup*numPerOne;
            var end=numGroup*numPerOne+oneGroupPages;
            var visit="";
            for(i=begin;i<end;i++){
                visit=visit+"<a id='__pageA_"+i+"' class='aBtn0' href='javascript:showPage("+i+");' target='_self'> "+(i+1)+"</a>";
            }
            var next="";
            if(numGroup<(group-1)){
                next="<a class='nextBtn' href='javascript:showGroup("+(numGroup+1)+");' title='下一组'>&nbsp;&nbsp;&nbsp;</a>";
            }else{
                next="<a class='nextBtn' href='javascript:showGroup("+(group-1)+");' title='下一组'>&nbsp;&nbsp;&nbsp;</a>";
            }
            var pre="";
            if(numGroup>0){
                pre="<a class='preBtn' href='javascript:showGroup("+(numGroup-1)+");' title='上一组'>&nbsp;&nbsp;&nbsp;</a>";
            }else{
                pre="<a class='preBtn' href='javascript:showGroup(0);' title='上一组'>&nbsp;&nbsp;&nbsp;</a>";
            }

            var s="";

            if(group>1){//按多组方式显示索引
                s="<span class='span'>共" + allPages + "页 共" + all + "条  "+pre+ next+"  "+visit +"</span>";
            }else{//按一组方式显示索引
                s="<span class='span'>共" + allPages + "页 共" + all + "条  "+"  "+visit+"</span>";
            }
            document.getElementById(indexBarID).innerHTML=s;
            document.getElementById("__pageA_"+numCurrent).className="aBtn1";//原pageBtn
            pvo.userPage();
        }

        if(list.length<=numPerPage){//不显示索引条
            setPageList(list);
            pvo.userPage();
            if(document.getElementById(indexBarID)){
                document.getElementById(indexBarID).innerHTML="";
            }//防止删除记录后,条件不足,却依然存在
        }
        else{
            showPage(numCurrent);//调用用户方法写内容
        }
    //初始化索引条 结束
    }
    //分页结束


    //一组参数与方法,对xml文档进行分页 结束 *********************************************************************************************


    //一组工具方法和系统方法,相当于java.util中的部分 开始 *********************************************************************************************
    /**
     * 转换结果相当于java中的List对象,其中每一个元素相当于java中的Map对象
     * @param xmlRecords 通过XMLHttpRequest查询返回的xml文档 在本系统中是记录集
     * 约定
     * xmlRecords遵循三层,即根、记录、字段数据。例:
     * <records><record><id>100</id><label>稻米</label><value>4.6</value><unit>kg</unit></record><record><id>101</id><label>面粉</label><value>5.2</value><unit>kg</unit></record></records>
     * 访问结果://alert(typeof data);//object  //alert(data.tagName);//undefined  //alert(data.nodeValue);//null  //alert(data.childNodes.length);//1  //alert(data.childNodes[0].tagName);//records  //alert(data.childNodes[0].childNodes.length);//2  //alert(data.childNodes[0].childNodes[0].tagName);//record    //alert(data.childNodes[0].childNodes[0].childNodes.length);//4  //alert(data.childNodes[0].childNodes[0].childNodes[0].tagName);//id  //alert(data.childNodes[0].childNodes[0].childNodes[0].firstChild.nodeValue);//100  //alert(data.childNodes[0].childNodes[0].childNodes[1].tagName);//label  //alert(data.childNodes[0].childNodes[0].childNodes[1].firstChild.nodeValue);//稻米 *
     */
    pvo.xmlToList=function(xmlRecords){

        var list=new Array();
        if(xmlRecords==null)return list;
        if(xmlRecords.length==0)return list;
        if(xmlRecords.childNodes[0]==undefined)return list;
        if(xmlRecords.childNodes[0].childNodes==undefined)return list;
        if(xmlRecords.childNodes[0].childNodes.length==0)return list;

        var i=0;
        var j=0;
        for(i=0;i<xmlRecords.childNodes[0].childNodes.length;i++){
            var record=xmlRecords.childNodes[0].childNodes[i];//第i条记录集,如例中的"<record><id>100</id><label>稻米</label><value>4.6</value><unit>kg</unit></record>"部分
            var m=new Map();
            for(j=0;j<record.childNodes.length;j++){
                //alert(record.childNodes[j].firstChild.nodeValue);//
                if(record.childNodes[j].firstChild!=null){
                    m.put(record.childNodes[j].tagName, record.childNodes[j].firstChild.nodeValue);
                }
                else{
                    //m.put(record.childNodes[j].tagName, null);//原
                    m.put(record.childNodes[j].tagName, "");//2010-06-26修改,这样还原了服务器端xml的原意,也便于表单赋值
                }
            }
            list.push(m);
        }
        return list;
    }

    /**  Map is a general map object for storing key value pairs
     *  @param m - default set of properties
     */
    pvo.Map =function(m) {
        var map;
        if (typeof m == 'undefined') map = new Array();//原{}
        else map = m;

        /**
         * Get a list of the keys to check
         */
        this.keys = function() {
            var _keys = new Array();
            for (var _i in map){
                _keys.push(_i);
            }
            return _keys;//
        };
        /**
         * Put stores the value in the table
         * @param key the index in the table where the value will be stored
         * @param value the value to be stored
         */
        this.put = function(key,value) {
            map[key] = value;
        };
        /**
         * Return the value stored in the table
         * @param key the index of the value to retrieve
         */
        this.get = function(key) {
            return map[key];
        };
        /**
         * Remove the value from the table
         * @param key the index of the value to be removed
         */
        this.remove =  function(key) {
            map[key]=null;
            delete map[key];
        };
        /**
         *  Clear the table
         */
        this.clear = function() {
            delete map;
            map = new Array();
        };
    }


    //一组工具方法和系统方法,相当于java.util中的部分 结束 *********************************************************************************************


    //Ajax部分 开始 *********************************************************************************************
    //参考代码 pvoAjax.js

    var xhr=null;
    pvo.setXhr=function(_xhr){
        xhr=_xhr;
    }
    pvo.getXhr=function(){
        return xhr;
    }
    //创建XMLHttpRequest对象 开始
    pvo.createXHR=function(){
        var xhr;
        try {
            xhr = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                xhr = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch (E) {
                xhr = false;
            }
        }
        if (!xhr && typeof XMLHttpRequest != 'undefined') {
            xhr = new XMLHttpRequest();
        }
        return xhr;
    }
    //创建XMLHttpRequest对象 结束

 

    /**
     * 用Ajax方式实现的上传xml片断及响应处理方法
     * @param action 请求方法
     * @param xml 准备好的xml片断
     * @param userFunction 响应时调用的方法,由用户自定义实现
     * @param isGetText nul;当为null时,将返回responseXML;当为true时,将返回responseText。
     */
    pvo.ajaxXML=function(action,xml,userFunction,isGetText){    //保持原始值
        if(xml=="")return;//没有可上传的数据则退出
        var requestXml=function(){
            var _action=pvo.getLastRequestAction();
            var _xml=pvo.getLastRequestData();
            if((action==_action)&&(xml==_xml)){
                pvo.RESULT = getLastList();//以文本方式获取返回结果,该结果必须是格式良好的xml或html文档 ;否则,在Firefox中会检测其为错误
                if(userFunction==null)userFunction=ok;
                response=userFunction;//这个方法需要用户定义,用于处理用户业务,然后指定给response,
                response();
                pvo.RESULT=null;
                return;
            }//重复提交时,直接将保存的结果赋值给pvo.RESULT,调用用户响应方法,拒绝上传请求。
            var xhr = createXHR();
            pvo.setXhr(xhr);
            xhr.onreadystatechange=processAjaxForm;//处理返回结果
            xhr.open("POST", action);//注意,当POST变成GET时,无查询结果,故未使用form.method替代"POST"
            xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            xhr.setRequestHeader("Content-Type", "text/plain; charset=UTF-8");
            xhr.send(xml);
            pvo.setLastRequestAction(action);
            pvo.setLastRequestData(xml);
            lastForm.action=action;
            lastForm.sendXml=xml;
            lastForm.userFunction=userFunction;
            lastForm.isGetText=isGetText;
        }
        var processAjaxForm=function() {//作用:处理返回状态值。
            var xhr=pvo.getXhr();
            if (xhr.readyState == 4) {
                if (xhr.status == 200) {
                    if(isGetText){
                        pvo.RESULT = xhr.responseText;//以文本方式获取返回结果,该结果必须是格式良好的xml或html文档 ;否则,在Firefox中会检测其为错误
                        if(userFunction==null)userFunction=ok;
                        response=userFunction;//这个方法需要用户定义,用于处理用户业务,然后指定给response,
                        response();
                        pvo.RESULT=null;
                    }else{
                        var data = xhr.responseXML;//以DOM方式获取返回结果,该结果必须是格式良好的xml文档。本方法中必须是与数据库表结构对应的三层结构。
                        var list=xmlToList(data);
                        setLastList(list);
                        pvo.RESULT =list;
                        if(userFunction==null)userFunction=ok;
                        response=userFunction;//这个方法需要用户定义,用于处理用户业务,然后指定给response,
                        response();
                        pvo.RESULT =null;
                    }
                }
            }
        }
        var response=function(){};
        requestXml();
    }

 

 


    /**
     * 用一条Map记录给表单指定记录赋值,map.keyName与form.fieldName相同
     * @param obj={formName:"",index:0,map:new Map()}//formName 表单名,index 表单中一条记录的索引号,map 一条记录的值
     */
    pvo.initFormOneRecord=function(obj){
        if(obj==null)return;
        var formName=obj.formName;
        var index=0;
        if(obj.index!=null)index=obj.index;
        var m=obj.map;

        if(m==null)return;
        var recordCount=0;
        var firstName="id";
        var form=null;
        if(formName!=null)form=document.forms[formName];
        else form=document.forms[0];
        for(var i=0;i<form.elements.length;i++){
            if(i==0){
                firstName=form.elements[i].name;
            }
            if(recordCount==index){
                if(m.get(form.elements[i].name)!=null){
                    //alert(form.elements[i].name+"||"+form.elements[i].type+"||"+form.elements[i].value+"||"+form.elements[i].checked);
                    if(form.elements[i].type=="text"||form.elements[i].type=="textarea"||form.elements[i].type=="hidden"){
                        form.elements[i].value=m.get(form.elements[i].name);
                    }
                    if(form.elements[i].type=="radio"){
                        if(form.elements[i].value==m.get(form.elements[i].name)){
                            form.elements[i].checked=true;
                        }else{
                            form.elements[i].checked=false;
                        }
                    }
                    if(form.elements[i].type=="checkbox"){
                        form.elements[i].value=m.get(form.elements[i].name);
                        if(m.get(form.elements[i].name)==true||m.get(form.elements[i].name)=="true"||m.get(form.elements[i].name)=="1"){
                            form.elements[i].checked=true;//需要进一步研究,原意应当是m.get(form.elements[i].name)!=null
                        }else{
                            form.elements[i].checked=false;
                        }
                    }
                    if(form.elements[i].type=="select-one"){
                        form.elements[i].value=m.get(form.elements[i].name);//需要进一步研究
                    }
                }
            //正对radio|checkbox|select的赋值
            }
            if(i>0){
                if(firstName==form.elements[i].name)recordCount++;
            }
        }
    }


    /**
     * 一条map记录转换成xml
     * @param map; 一条记录
     */
    pvo.mapToXML=function(map){
        var fields="";
        var k=map.keys();
        for(var i=0;i<k.length;i++){
            fields=fields+"<"+k[i]+">"+pvo.filterChar(map.get(k[i]))+"</"+k[i]+">";
        }
        return "<record>"+fields+"</record>";
    }


    /**
     * 一条map记录转换成xml
     * @param map; 一条记录
     */
    pvo.mapToEscapeXML=function(map){
        var fields="";
        var k=map.keys();
        for(var i=0;i<k.length;i++){
            fields=fields+"<"+k[i]+">"+escape(map.get(k[i]))+"</"+k[i]+">";
        }
        return "<record>"+fields+"</record>";
    }

    /**
     * 提取一条Map记录
     * @param formName 表单名
     * @param index 0; 表单中一条记录的索引号
     */
    pvo.formOneMap=function(formName,index){
        var map=new Map();
        var fieldNum=0;
        var recordCount=0;
        var firstName="id";
        var form=null;
        if(formName!=null)form=document.forms[formName];
        else form=document.forms[0];
        var fields="";
        for(var i=0;i<form.elements.length;i++){
            if(i==0){
                firstName=form.elements[i].name;
            }
            if(recordCount==0){
                fieldNum++;
            }
            if(i>0){
                if(firstName==form.elements[i].name)recordCount++;
            }
            if(form.elements[i].type=="hidden"||form.elements[i].type=="text"||form.elements[i].type=="textarea"||form.elements[i].type=="password"||form.elements[i].type=="file"||form.elements[i].type=="select-one"){
                if(recordCount==index){
                    map.put(form.elements[i].name,form.elements[i].value);
                }
            }
            if(form.elements[i].type=="checkbox"){
                if(recordCount==index){
                    if(form.elements[i].checked){
                        //map.put(form.elements[i].name,form.elements[i].value);
                        map.put(form.elements[i].name,true);//参照pvo.formOneRecord
                    }else{
                        //map.put(form.elements[i].name,"");
                        map.put(form.elements[i].name,false);//参照pvo.formOneRecord
                    }
                }
            }
            if(form.elements[i].type=="radio"){
                if(recordCount==index){
                    if(form.elements[i].checked){
                        map.put(form.elements[i].name,form.elements[i].value);
                    }
                }
            }
        }
        return map;
    }

    /**
     * 用Ajax方式实现的通用表单上传及响应处理方法XML格式一条记录
     * @param formName 表单名
     * @param index 0; 表单中一条记录的索引号
     */
    pvo.formOneRecord=function(formName,index){
        var fieldNum=0;
        var recordCount=0;
        var firstName="id";
        var form=null;
        if(formName!=null)form=document.forms[formName];
        else form=document.forms[0];
        var fields="";
        for(var i=0;i<form.elements.length;i++){
            if(i==0){
                firstName=form.elements[i].name;
            }
            if(recordCount==0){
                fieldNum++;
            }
            if(i>0){
                if(firstName==form.el

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值