随笔-4  评论-0  文章-0  trackbacks-0

Struts2的action的实现:

package org.gordon;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;

import com.opensymphony.xwork2.ActionSupport;

public class AutoCompleteAction extends ActionSupport implements
  ServletRequestAware, ServletResponseAware, ApplicationAware 
{

 
private HttpServletRequest request;
 
 
private HttpServletResponse response;
 
 
private Map map ;
 
 
private String key;
 
 
public void setServletRequest(HttpServletRequest request) {
  
this.request = request;
 }


 
public void setServletResponse(HttpServletResponse response) {
  
this.response = response;
 }


 
public void setApplication(Map map) {
  
this.map = map;
 }

 
 
public void setKey(String key){
  
this.key = key;
 }

 
private String getAutoCompleteInformation(List list){
  StringBuffer sb 
= new StringBuffer();
  sb.append(
"<response>");
  
for (Iterator it = list.iterator(); it.hasNext();) {
   String str 
= (String) it.next();
   sb.append(createXMLView(str));
  }

  sb.append(
"</response>");
  
return sb.toString();
 }

 
private List<String> createResults(){
  Set info 
= (Set) map.get("autoComplete");
  List
<String> list = null;
  
if(info!=null){
   list 
= new ArrayList<String>();
   
for (Iterator it = info.iterator(); it.hasNext();) {
    String str 
= (String) it.next();
    String getStr 
= str.toUpperCase();
    String keyword 
= key.toUpperCase();
    
if(getStr.startsWith(keyword)){
     list.add(str);
    }

   }

  }

  
return list;
 }

 
 
private String createXMLView(String str){
  StringBuffer sb 
= new StringBuffer();
  sb.append(
"<value>");
  sb.append(str);
  sb.append(
"</value>");
  
return sb.toString();
 }

 
 
public String addAutoComplete(){
  
if(map.containsKey("autoComplete")){
   Set
<String> set = null;
   set 
= (Set) map.get("autoComplete");
   set.add(key);
  }
 else {
   Set
<String> set = new HashSet<String>();
   set.add(key);
   map.put(
"autoComplete", set);
  }

  
return SUCCESS;
 }

 
 
public void returnAutoComplete(){
  PrintWriter out 
= null;
  
try {
    out 
= response.getWriter();
  }
 catch (IOException e) {
   e.printStackTrace();
  }

  List list 
= createResults();
  
if(list != null && list.size()>0){
   response.setContentType(
"text/xml");
   response.setHeader(
"Cache-Control""no-cache");
   out.println(getAutoCompleteInformation(list));
   out.close();
  }
 else {
   response.setStatus(
204);
  }

 }

 
 
public String execute(){
  addAutoComplete();
  
return SUCCESS;
 }

}



html

 

  1<%@ page language="java" pageEncoding="utf-8"%>
  2<%@ taglib uri="/struts-tags" prefix="s"%>
  3<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  4<html>
  5  <head>
  6    <title>Ajax Auto Complete</title>
  7    <style type="text/css">
  8
  9    .mouseOut {
 10    background: #708090;
 11    color: #FFFAFA;
 12    }

 13
 14    .mouseOver {
 15    background: #FFFAFA;
 16    color: #000000;
 17    }

 18    
</style>
 19    <script type="text/javascript">        
 20        var xmlHttp;
 21        var completeDiv;
 22        var inputField;
 23        var nameTable;
 24        var nameTableBody;
 25
 26        function createXMLHttpRequest() {
 27            if (window.ActiveXObject) {
 28                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
 29            }

 30            else if (window.XMLHttpRequest) {
 31                xmlHttp = new XMLHttpRequest();                
 32            }

 33        }

 34
 35        function initVars() {
 36            inputField = document.getElementById("names");            
 37            nameTable = document.getElementById("name_table");
 38            completeDiv = document.getElementById("popup");
 39            nameTableBody = document.getElementById("name_table_body");
 40        }

 41
 42        function findNames() {
 43            initVars();
 44            if (inputField.value.length > 0{
 45                createXMLHttpRequest();            
 46                var url = "getInfo.action?key=" + escape(inputField.value) +"&time=" + new Date().getTime();                        
 47                xmlHttp.open("GET", url, true);
 48                xmlHttp.onreadystatechange = callback;
 49                xmlHttp.send(null);
 50            }
 else {
 51                clearNames();
 52            }

 53        }

 54
 55        function callback() {
 56            if (xmlHttp.readyState == 4{
 57                if (xmlHttp.status == 200{
 58                    setNames(xmlHttp.responseXML.getElementsByTagName("value"));
 59                }
 else {
 60                    clearNames();
 61                }

 62            }

 63        }

 64        
 65        function setNames(the_names) {
 66            clearNames();
 67            var size = the_names.length;
 68            setOffsets();
 69            var row, cell, txtNode;
 70            for (var i = 0; i < size; i++{
 71                var nextNode = the_names[i].firstChild.data;
 72    row = document.createElement("tr");
 73                cell = document.createElement("td");
 74
 75                cell.onmouseout = function() {this.className='mouseOver';};
 76                cell.onmouseover = function() {this.className='mouseOut';};
 77                cell.setAttribute("bgcolor""#FFFAFA");
 78                cell.setAttribute("border""0");
 79                cell.onclick = function() { populateName(this); } ;                             
 80
 81                txtNode = document.createTextNode(nextNode);
 82                cell.appendChild(txtNode);
 83              row.appendChild(cell);
 84                nameTableBody.appendChild(row);
 85            }

 86            createClose();
 87        }

 88
 89  function createClose(){
 90   row = document.createElement("tr");
 91            cell = document.createElement("td");
 92            txtNode = document.createTextNode("close");
 93            cell.appendChild(txtNode);
 94            cell.setAtrribute();
 95            row.appendChild(cell);
 96            nameTableBody.appendChild(row);
 97  }

 98        function setOffsets() {
 99            var end = inputField.offsetWidth;
100            var left = calculateOffsetLeft(inputField);
101            var top = calculateOffsetTop(inputField) + inputField.offsetHeight;
102
103            completeDiv.style.border = "black 1px solid";
104            completeDiv.style.left = left + "px";
105            completeDiv.style.top = top + "px";
106            nameTable.style.width = end + "px";
107        }

108        
109        function calculateOffsetLeft(field) {
110          return calculateOffset(field, "offsetLeft");
111        }

112
113        function calculateOffsetTop(field) {
114          return calculateOffset(field, "offsetTop");
115        }

116
117        function calculateOffset(field, attr) {
118          var offset = 0;
119          while(field) {
120            offset += field[attr]; 
121            field = field.offsetParent;
122          }

123          return offset;
124        }

125
126        function populateName(cell) {
127            inputField.value = cell.firstChild.nodeValue;
128            clearNames();
129        }

130
131        function clearNames() {
132            var ind = nameTableBody.childNodes.length;
133            for (var i = ind - 1; i >= 0 ; i--{
134                 nameTableBody.removeChild(nameTableBody.childNodes[i]);
135            }

136            completeDiv.style.border = "none";
137        }

138
139    
</script>
140  </head>
141  <body>
142    <h1>Ajax Auto Complete Example</h1>
143    <s:form action="search">
144    <s:textfield label="Input the info which you want to search"
145   name="key" id="names" cssStyle="height:20;" maxlength="20" onkeyup="findNames();"></s:textfield>
146    <s:submit label="Search"></s:submit>
147    </s:form>
148    <div style="position:absolute;" id="popup">
149        <table id="name_table" bgcolor="#FFFAFA" border="0" cellspacing="0" cellpadding="0"/>            
150            <tbody id="name_table_body">
151            </tbody>
152        </table>
153    </div>
154  </body>
155</html>
156
157


注:引入struts2的用到的jar  struts.xml文件  修改web.xml文件。

posted on 2008-08-30 18:53 Gordon 阅读(325) 评论(0)  编辑  收藏 所属分类: Ajax

只有注册用户登录后才能发表评论。


网站导航: