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 阅读(326)
评论(0) 编辑 收藏 所属分类:
Ajax