在本文中将给出一个例子来介绍使用AJAX 技术从服务端获得数据的三种方法。这个例子很简单,就是两个选择框(html 中的 标签中选项的格式文本( "
            }
        }
            
        
var  id  =  select.id;
        
if (isIE())
            select.outerHTML 
=   " "   +  id  +   " ' onchange='onChange(this)'> "   +  options  +   " " ;
        
else
            select.innerHTML 
=  options;                
        
    }
}

    onReadState 函数将在XMLHttpRequest 对象的异步访问服务端时调用。当readyState 4 时表示成功从服务端返回XML 数据。这个函数的实现代码如下:

//  myRequest表示XMLHttpRequest对象,selectId表示对象
            addOptions(kind, xml);   //  向 标签的数据,并将其加载到第1 标签分别是bigKind smallKind ,里面并没有
window.onload  =  onLoad
function  onLoad()
{                         

    
try
    {
        getData(
" ../GetXML " " bigKind " );
               
    }
    
catch (e)
    {
        alert(
" onLoad: "   +  e);
    }
}

     其中 GetXML 是一个 Servlet 程序(读者可以将其换成其他的服务端程序,如 asp.net php 的)。下面是这个 GetXML 程序的实现代码:

package  servlet;

import  java.io. * ;
import  javax.servlet. * ;
import  javax.servlet.http. * ;
import  database.MyData;

public   class  GetXML  extends  HttpServlet
{

    
protected   void  proce***equest(HttpServletRequest request, HttpServletResponse response)
            
throws  ServletException, IOException
    {
        response.setContentType(
" application/xml;charset=UTF-8 " );

        PrintWriter out 
=  response.getWriter();

        
try
        {
            String s 
=  request.getParameter( " kind " );

            out.println(
" " );
            
if  (s  ==   null )
            {
                
for  (String key : MyData.data.keySet())
                {
                    out.println(
" "   +  key  +   " " );
                }
            } 
else
            {
                s 
=  java.net.URLDecoder.decode(s,  " UTF-8 " );
                System.out.println(s);
                java.util.List
< String >  smallKind  =  MyData.data.get(s);

                
if  (smallKind  !=   null )
                {
                    
for  (String kind : smallKind)
                    {

                        out.println(
" "   +  kind  +   " " );
                    }
                }
            }
            out.println(
" " );

        } 
finally
        {
            out.close();
        }
    }

    
protected   void  doGet(HttpServletRequest request, HttpServletResponse response)
            
throws  ServletException, IOException
    {
        proce***equest(request, response);
    }

    
protected   void  doPost(HttpServletRequest request, HttpServletResponse response)
            
throws  ServletException, IOException
    {
        proce***equest(request, response);
    }

    
public  String getServletInfo()
    {
        
return   " Short description " ;
    }
}

   不管读者会不会java servlet ,从这个程序中的proce***equest 方法中都可以看出,首先会获得请求参数kind ,如果这个参数不存在,则返回bigKind 所需要的数据,以xml 格式返回,类似于如下的格式:

< data >
  
< list > data1 list >
  
< list > data2 list >
data >

    如果 kind 参数存在,则在 MyData.data 中查询第 2 标签 bigKind 变化时,更新 smallKind 标签。 标签的onchange 事件函数。obj 表示 标签所需要的