用ajax + webwork 实现google suggest 效果




代码如下:
autoComplete.html
< html >
  
< head >
      
< title > Ajax Auto Complete </ title >
      
< meta  http-equiv ="Content-Type"  content ="text/html; charset=gb2312" >
      
< style  type ="text/class" >
      .mouseOut
{
          background
: #708090;
          color
:#FFFAFA;
          
}

       .mouseOver
{
          background
:#FFFAFA;
          color
:#000000;
          
}

       
</ style >
      
< script  type ="text/javascript" >
           
var xmlHttp;
           
var completeDiv;
           
var inputField;
           
var nameTable;
           
var nameTableBody;

          
function createXMLHttpRequest(){
              
if(window.ActiveXObject){
                  xmlHttp 
= new ActiveXObject("Microsoft.XMLHTTP");
              }
else if(window.XMLHttpRequest){
                  xmlHttp 
= new XMLHttpRequest();
              }

          }


          
function initVars(){
              inputField 
= document.getElementById("names");
              nameTable 
= document.getElementById("name_table");
              completeDiv 
= document.getElementById("popup");
              nameTableBody 
= document.getElementById("name_table_body");
          }


          
function findNames(){
              initVars();
              
if(inputField.value.length > 0){
                  createXMLHttpRequest();
                  
var url = "AutoComplete.action?name=" + escape(inputField.value);
                  xmlHttp.open(
"GET",url,true);
                  xmlHttp.onreadystatechange 
= callback;
                  xmlHttp.send(
null);
              }
else{
                  clearNames();
              }

          }


          
function callback(){
              
              
if(xmlHttp.readyState ==4 ){
                  
if(xmlHttp.status == 200){
                      setNames(xmlHttp.responseXML.getElementsByTagName(
"name"));
                  }
else if(xmlHttp.status == 204 || xmlHttp.status == 1223){
                      clearNames();
                  }

              }

          }


          
function setNames(the_names){
              clearNames();
             
              
var size = the_names.length;
              setOffsets();
              
              
var row,cell,txtNode;
              
for(var i=0; i<size; i++){
                  
var nextNode = the_names[i].firstChild.data;
                  row  
= document.createElement("tr");
                  cell 
= document.createElement("td");

                  
//cell.onmouseout = function(){this.className = 'mouseOver';};
                  //cell.onmouseover = function(){this.className = 'mouseOut';};
                  cell.setAttribute("bgcolor","#FFFAFA");
                  cell.setAttribute(
"border","0");
                  cell.onclick 
= function(){ populateName(this);};
                  cell.onmouseover 
= function(){ doOnMouseOver(this)}
                  cell.onmouseout 
= function() { doOnMouseOut(this)}
                  txtNode 
= document.createTextNode(nextNode);
                  cell.appendChild(txtNode);
                  row.appendChild(cell);
                  nameTableBody.appendChild(row);
              }

          }


          
function setOffsets(){
              
var end = inputField.offsetWidth;
              
var left = calculateOffsetLeft(inputField);
              
var top = calculateOffsetTop(inputField) + inputField.offsetHeight;

              completeDiv.style.border 
= "black 1px solid";
              completeDiv.style.left 
= left + "px";
              completeDiv.style.top 
= top + "px";
              completeDiv.style.width 
= end + "px";
          }


          
function calculateOffsetLeft(field){
              
return calculateOffset(field,"offsetLeft");
          }


          
function calculateOffsetTop(field){
              
return calculateOffset(field,"offsetTop");
          }

          
function calculateOffset(field,attr){
              
var offset = 0;
              
while(field){
                  offset 
+= field[attr];
                  field 
= field.offsetParent;
              }

              
return offset;
          }


          
function populateName(cell){
              inputField.value 
= cell.firstChild.nodeValue;
              clearNames();
          }

          
          
function doOnMouseOver(cell){
                cell.style.background 
= "blue";
          }

          
          
function doOnMouseOut(cell){
                cell.style.background 
= "#FFFFFF";
          }


          
function clearNames(){
              
              
var ind = nameTableBody.childNodes.length;
              
for(var i= ind - 1; i>=0; i--){
                  nameTableBody.removeChild(nameTableBody.childNodes[i]);
              }

              completeDiv.style.border 
= "none";
          }

      
</ script >
</ head >
  
< body >
  
< h1 > Ajax Auto Complete Example </ h1 >
  Names: 
< input  type ="text"  size ="20"  id ="names"  onkeyup ="findNames();"  style ="height:20px;" >
  
< div  style ="position:absolute;"  id ="popup" >
      
< table  id ="name_table"  bgcolor ="#FFFAFA"  border ="0"  cellspacing ="0" >
        
< tbody  id ="name_table_body" ></ tbody >
      
</ table >
  
</ div >
  
</ body >
</ html >

AutoComplete.java
package  control;
import  java.io. * ;
import  java.util.ArrayList;
import  java.util.Iterator;
import  java.util.List;

import  javax.servlet.http.HttpServletResponse;

import  com.opensymphony.webwork.ServletActionContext;

import  core.BookActionSupport;


public   class  AutoComplete  extends  BookActionSupport {
    
private List names = new ArrayList();

    
public String execute(){
        names.add(
"Abe");
        names.add(
"Abel");
        names.add(
"Abigail");
        names.add(
"Abner");
        names.add(
"Abraham");
        names.add(
"Marcy");
        names.add(
"Marge");
        names.add(
"marie");
        names.add(
"MarcyMarcyMarcyMarcyMarcy");
        
        String prefix 
= getParameter("name");
        NameService service 
= NameService.getInstance(names);
        List matching 
= service.findNames(prefix);
        
try{
            HttpServletResponse response 
= ServletActionContext.getResponse();
            PrintWriter out 
= response.getWriter();
            
if(matching.size()>0){
                 
                response.setContentType(
"text/xml");
                response.setHeader(
"Cache-Control","no-cache");
                out.println(
"<response>");
                Iterator iter 
= matching.iterator();
                
while(iter.hasNext()){
                    String name 
= (String) iter.next();
                    out.println(
"<name>" + name + "</name>");
                }

                out.println(
"</response>");
                matching 
= null;
                service 
= null;
                out.close();
            }
else{
                response.setStatus(HttpServletResponse.SC_NO_CONTENT);
            }

        }
catch(Exception e){
            System.out.println(e.getMessage());
        }

        
return "";
    }

}

注意:  在这个类中继承了 BookActionSupport类. 这个是继承自webwork框架的ActionSupport类的.主要实现了getParameter()方法.

NameService.java
package  control;

import  java.util.ArrayList;
import  java.util.Iterator;
import  java.util.List;


public   class  NameService  {
    
private List names;
    
    
private NameService(List list_of_names){
        
this.names = list_of_names;
    }

    
    
public static NameService getInstance(List list_of_names){
        
return new NameService(list_of_names);
    }

    
    
public List findNames(String prefix){
        String prefix_upper 
= prefix.toUpperCase();
        List matches 
= new ArrayList();
        Iterator iter 
= names.iterator();
        
while(iter.hasNext()){
            String name 
= (String) iter.next();
            String name_upper_case 
= name.toUpperCase();
            
if(name_upper_case.startsWith(prefix_upper)){
                
boolean result = matches.add(name);
            }

        }

        
return matches;
    }

}


xworl.xml
<? xml version="1.0" encoding="UTF-8" ?>

<! DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "X:WorkSpaceBFPPropertyconfigwebxwork-1.0.dtd" >

< xwork >

< include  file ="webwork-default.xml" />
     
     
< package  name ="helloWorld"  extends ="webwork-default" >
         
< interceptors >
             
< interceptor  name ="params"  class ="com.opensymphony.xwork.interceptor.ParametersInterceptor" />
         
</ interceptors >     

        
< default-interceptor-ref  name ="defaultStack" />
         
         
< action  name ="AutoComplete"  class ="control.AutoComplete" >
               
< result  name ="success" > /jsp/domainS.jsp </ result >
               
< interceptor-ref  name ="model-driven" />
              
< interceptor-ref  name ="params" />           
         
</ action >
     
</ package >

</ xwork >
注意: 我的 project的名称是helloworld ,  java类在 control目录下.  请注意区分!

Ok, 代码到此结束.  虽然比google suggest要简单.  但是可以体会一下ajax的用法.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值