用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("<","<");使用s.replace(">",">");不能达到预期效果
* 替换字符'<'和'>',实现对超文本的支持
**/
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("<");
}
if (str.charAt(i) == '>') {
sb.append(">");
}
if (str.charAt(i) == '"') {
sb.append(""");
} //if (str.charAt(i) == '\'') {
// sb.append("’");//´
//}
if (str.charAt(i) == '&') {
sb.append("&");
}
}
}
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.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='下一组'> </a>";
}else{
next="<a class='nextBtn' href='javascript:showGroup("+(group-1)+");' title='下一组'> </a>";
}
var pre="";
if(numGroup>0){
pre="<a class='preBtn' href='javascript:showGroup("+(numGroup-1)+");' title='上一组'> </a>";
}else{
pre="<a class='preBtn' href='javascript:showGroup(0);' title='上一组'> </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