一般在百度搜索框输入关键词时,会弹出一些相关信息提示,方便点选:

页面(search.jsp):

 <input type="text"  name="keyWords" id="keyWords"  style="width:200px; height:20px;"  />
<input type="button" id="button" value="百度一下">

HTML

创建新的div层,用以放置获取到的提示内容:

     <div>
<input type="text" name="keyWords" id="keyWords" style="width:200px; height:20px;" />
<input type="button" id="button" value="百度一下">
<div id="popDiv">
<table id="content_table">
<tbody id="content_table_body">
</tbody>
</table>
</div>
</div>

HTML

创建XMLHttpRequest对象:

     function createXmlHttp()
{
var xmlHttp;
//创建XMLHttpRequest
if(window.XMLHttpRequest)
{
xmlHttp = new XMLHttpRequest();
//兼容某些Mozilla浏览器的响应头,强制设置为text/xml,具体参看:http://www.cnblogs.com/perseverancevictory/p/3690769.html
if(xmlHttp.overrideMimeType){
xmlHttp.overrideMimeType("text/xml");
}
}
//兼容IE
else if(window.ActiveXObject)
{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
if(!xmlHttp)
{
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
}
}
return xmlHttp;
}

javascript

当输入时出现提示,因此需要在input框中添加onkeyup事件,用以获取相关提示:

 <input type="text"  name="keyWords" id="keyWords"  style="width:200px; height:20px;" onkeyup="getMoreContens()" />

HTML

实现onkeyup事件:

         var xmlHttp;
//获取用户输入的关联信息的函数
function getMoreContens() {
//获取用户输入
var content = document.getElementById("keyWords").value;
if (content == "") {
clearContent();
return;
}
xmlHttp = createXmlHttp();
//给服务器发送数据
var url = "search?keyword="+encodeURI(content);
xmlHttp.open("GET",url,true);
xmlHttp.onreadystatechange = //回调函数
function callback()
{
if(xmlHttp.readyState == 4)
{
if(xmlHttp.status == 200){
var result = decodeURIComponent(xmlHttp.responseText);
var json = eval("("+result+")");
clearContent(json);
intelliSense(json);
}
}
};
/*
xmlhttp的send是传递参数用的,但是只有在使用post方式提交请求的时候才有用
如下:
xmlhttp.open("post",url,true);
...
xmlhttp.send("data=data&data2=data2"); 用get的话一般就是:
xmlhttp.open("get",url,true);
...
xmlhttp.send(null);
*/
xmlHttp.send(null);
}

javascript

可以看到,getMoreConten()方法中有clearContent()和intelliSense(json)两个自定义方法,它们的作用分别是清空提示和根据输入智能获取关键字,实现如下:

intelliSense(获取智能提示并放置在输入框下方table中):

     function intelliSense(json)
{
//获取关联数据的长度
var size = json.length;
for(var i=0;i<size;i++)
{
var nextNode = json[i];
var tr= document.createElement("tr");
var td= document.createElement("td");
tr.setAttribute("border", "0");
tr.setAttribute("bgcolor", "#EDEDED");
td.setAttribute("width", "200px");
td.onmouseover=function()
{
this.className = 'mouseOver';
}
td.onmouseout=function()
{
this.className = 'mouseOut';
}
td.onclick=function()
{
document.getElementById("keyWords").value=this.innerText;
}
var text=document.createTextNode(nextNode);
td.appendChild(text);
tr.appendChild(td);
document.getElementById("content_table_body").appendChild(tr);
}
}

javascript

clearContent:

     function clearContent()
{
var contentTableBody = document.getElementById("content_table_body");
var size = contentTableBody.childNodes.length;
for(var i=size-1;i>0;i--)
{
contentTableBody.removeChild(contentTableBody.childNodes[i]);
}
}

javascript

页面上基本完成,接下来需要实现getMoreContens方法中定义的名叫search的Servlet:

在web.xml中配置:

 <servlet-mapping>
<servlet-name>search</servlet-name>
<url-pattern>/search</url-pattern>
</servlet-mapping>
<servlet>
<description>搜索</description>
<servlet-name>search</servlet-name>
<servlet-class>com.yan.search.SearchServlet</servlet-class>
</servlet>

xml

Servlet实现:

 private static List<String> keyWordList = new ArrayList<String>();
static {
// 模拟数据
keyWordList.add("yanwei");
keyWordList.add("yantian");
keyWordList.add("yanpeng");
keyWordList.add("yanweichao");
keyWordList.add("yanweiqi");
keyWordList.add("yanyurong");
keyWordList.add("yanmeirong");
keyWordList.add("yanweichen");
keyWordList.add("电影");
keyWordList.add("电影 66ys");
}
private static final long serialVersionUID = 1L; @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
} @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException { String keyWord = req.getParameter("keyword");
System.out.println(keyWord);
List<String> list = keyWord==null?new ArrayList<String>():getDatas(keyWord);
String json = JSON.toJSONString(list);
//防止乱码
String encodeJSON = URLEncoder.encode(json,"UTF-8");
resp.getWriter().write(encodeJSON);
} public static List<String> getDatas(String keyWord) {
List<String> list = new ArrayList<String>();
for (int i = 0; i < keyWordList.size(); i++) {
if (keyWordList.get(i).contains(keyWord)) {
list.add(keyWordList.get(i));
}
}
return list;
}

Java

此时基本功能已经实现,但还有一些小细节需要处理:

1.当文本框失去焦点时,提示应该消失

在输入框属性中添加onblur事件,触发clearContent方法;

2.获得焦点时再次出现提示

在输入框属性中添加onfocus事件,触发intelliSense方法;

3.当鼠标滑过载有提示信息的table时,应加一些样式显得更友好:

我们在intelliSense方法中已经为td元素设置了类名mouseOver和mouseOut,因此添加css样式即可:

 .mouseOver {
background: #00B2EE;
color: white;
width: 200px;
}
.mouseOut {
background: #EDEDED;
width: 200px;
}

CSS

呈现效果:

最终代码:

 <?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet-mapping>
<servlet-name>search</servlet-name>
<url-pattern>/search</url-pattern>
</servlet-mapping>
<servlet>
<description>搜索</description>
<servlet-name>search</servlet-name>
<servlet-class>com.yan.search.SearchServlet</servlet-class>
</servlet>
</web-app>

web.xml

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>smart search</title>
<style type="text/css">
.mouseOver {
background: #00B2EE;
color: white;
width: 200px;
}
.mouseOut {
background: #EDEDED;
width: 200px;
}
</style>
<script type="text/javascript">
var xmlHttp;
//获取用户输入的关联信息的函数
function getMoreContens() {
//获取用户输入
var content = document.getElementById("keyWords").value;
if (content == "") {
clearContent();
return;
}
xmlHttp = createXmlHttp();
//给服务器发送数据
var url = "search?keyword="+encodeURI(content);
xmlHttp.open("GET",url,true);
xmlHttp.onreadystatechange = //回调函数
function callback()
{
if(xmlHttp.readyState == 4)
{
if(xmlHttp.status == 200){
var result = decodeURIComponent(xmlHttp.responseText);
var json = eval("("+result+")");
clearContent(json);
intelliSense(json);
}
}
};
/*
xmlhttp的send是传递参数用的,但是只有在使用post方式提交请求的时候才有用
如下:
xmlhttp.open("post",url,true);
...
xmlhttp.send("data=data&data2=data2"); 用get的话一般就是:
xmlhttp.open("get",url,true);
...
xmlhttp.send(null);
*/
xmlHttp.send(null);
} //创建XMLHttpRequest
function createXmlHttp()
{
var xmlHttp;
if(window.XMLHttpRequest)
{
xmlHttp = new XMLHttpRequest();
//兼容某些Mozilla浏览器的响应头,强制设置为text/xml,具体参看:http://www.cnblogs.com/perseverancevictory/p/3690769.html
if(xmlHttp.overrideMimeType){
xmlHttp.overrideMimeType("text/xml");
}
}
//兼容IE
else if(window.ActiveXObject)
{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
if(!xmlHttp)
{
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
}
}
return xmlHttp;
} function clearContent()
{
var contentTableBody = document.getElementById("content_table_body");
var size = contentTableBody.childNodes.length;
for(var i=size-1;i>0;i--)
{
contentTableBody.removeChild(contentTableBody.childNodes[i]);
}
}
function intelliSense(json)
{
//获取关联数据的长度
var size = json.length;
for(var i=0;i<size;i++)
{
var nextNode = json[i];
var tr= document.createElement("tr");
var td= document.createElement("td");
tr.setAttribute("border", "0");
tr.setAttribute("bgcolor", "#EDEDED");
td.setAttribute("width", "200px");
td.onmouseover=function()
{
this.className = 'mouseOver';
}
td.onmouseout=function()
{
this.className = 'mouseOut';
}
td.onclick=function()
{
document.getElementById("keyWords").value=this.innerText;
}
var text=document.createTextNode(nextNode);
td.appendChild(text);
tr.appendChild(td);
document.getElementById("content_table_body").appendChild(tr);
}
}
</script>
</head>
<body>
<div>
<input type="text" name="keyWords" id="keyWords" style="width:200px; height:20px;" onkeyup="getMoreContens()" onfocus="getMoreContens()" onblur="clearContent()" /> <input
type="button" id="button" value="百度一下">
<div id="popDiv">
<table id="content_table">
<tbody id="content_table_body">
</tbody>
</table>
</div>
</div>
</body>
</html>

search.jsp

 package com.yan.search;

 import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import com.alibaba.fastjson.JSON; public class SearchServlet extends HttpServlet { private static List<String> keyWordList = new ArrayList<String>();
static {
// 模拟数据
keyWordList.add("yanwei");
keyWordList.add("yantian");
keyWordList.add("yanpeng");
keyWordList.add("yanweichao");
keyWordList.add("yanweiqi");
keyWordList.add("yanyurong");
keyWordList.add("yanmeirong");
keyWordList.add("yanweichen");
keyWordList.add("电影");
keyWordList.add("电影 66ys");
}
private static final long serialVersionUID = 1L; @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
} @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException { String keyWord = req.getParameter("keyword");
System.out.println(keyWord);
List<String> list = keyWord==null?new ArrayList<String>():getDatas(keyWord);
String json = JSON.toJSONString(list);
//防止乱码
String encodeJSON = URLEncoder.encode(json,"UTF-8");
resp.getWriter().write(encodeJSON);
} public static List<String> getDatas(String keyWord) {
List<String> list = new ArrayList<String>();
for (int i = 0; i < keyWordList.size(); i++) {
if (keyWordList.get(i).contains(keyWord)) {
list.add(keyWordList.get(i));
}
}
return list;
}
}

SearchServlet.java

Servlet+Ajax实现搜索智能提示的更多相关文章

  1. AJAX,JSON搜索智能提示

    效果 开发结构参考AJAX,JSON用户校验 主要有两个核心文件 1,处理输入字符,进行后台搜索的servlet Suggest.java package org.guangsoft.servlet; ...

  2. 程序员编程艺术第三十六~三十七章、搜索智能提示suggestion,附近点搜索

    第三十六~三十七章.搜索智能提示suggestion,附近地点搜索 作者:July.致谢:caopengcs.胡果果.时间:二零一三年九月七日. 题记 写博的近三年,整理了太多太多的笔试面试题,如微软 ...

  3. Servlet+Ajax实现搜索框智能提示

    简介:搜索框相信大家都不陌生,几乎每天都会在各类网站进行着搜索.有没有注意到,很多的搜索功能,当输入内容时,下面会出现提示.这类提示就叫做搜索框的智能提示,本门课程就为大家介绍如何使用Servlet和 ...

  4. Ajax (jquery)实现智能提示搜索框(in Django)

    搜索框输入搜索名字,从数据库中筛选名字, 如果有包含输入的字母的名字则以json格式返回并且显示在搜索框下:          html文件: <!DOCTYPE html> <ht ...

  5. jquery+ajax 实现搜索框提示

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. winform 与百度搜索智能提示

    private void textBox1_TextChanged(object sender, EventArgs e) { listBox1.Items.Clear(); if (string.I ...

  7. 福利到~分享一个基于jquery的智能提示控件intellSeach.js

    一.需求 我们经常会遇到[站内搜索]的需求,为了提高用户体验,我们希望能做到像百度那样的即时智能提示.例如:某公司人事管理系统,想搜索李XX,只要输入“李”,系统自然会提示一些姓李的员工,这样方便用户 ...

  8. jquery的智能提示控件

    福利到~分享一个基于jquery的智能提示控件intellSeach.js   一.需求 我们经常会遇到[站内搜索]的需求,为了提高用户体验,我们希望能做到像百度那样的即时智能提示.例如:某公司人事管 ...

  9. 一个基于jquery的智能提示控件intellSeach.js

    一.需求 我们经常会遇到[站内搜索]的需求,为了提高用户体验,我们希望能做到像百度那样的即时智能提示.例如:某公司人事管理系统,想搜索李XX,只要输入“李”,系统自然会提示一些姓李的员工,这样方便用户 ...

随机推荐

  1. OpenGl学习 SelectObject函数

    SelectObject 函数功能:该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象.   函数原型:HGDIOBJ SelectObject(HDC hdc, HGDIOB ...

  2. 【Android】3.25 示例25--调启百度地图

    分类:C#.Android.VS2015.百度地图应用: 创建日期:2016-02-04 一.简介 调启百度地图是指:利用SDK接口,可直接在本地打开百度地图客户端或WebApp实现地图功能. 目前支 ...

  3. C# 使用Nlog记录日志到数据库

    [摘要]Nlog是一个很不错的.NET日志记录组件,它可以将日志输出到控件台,保存到文本,也可以很方便的记录到数据库中.本文为你介绍C# 使用Nlog记录日志到数据库. Nlog是一个很不错的.NET ...

  4. Date函数基础知识整理

    Date类型:1.Date.parse()接收一个表示日期的字符串参数,然后再根据这个字符串返回响应的日期的毫秒数:如:创建一个日期: <script> // var someDate=n ...

  5. hbase中double类型数据做累加

    public static Result incr(String tableFullName, String rowKey, String family, String qualifier, long ...

  6. vue点击返回顶部插件vue-totop

    vue-totop vue 点击返回顶部插件,可以根据参数设定按钮大小,颜色,类型,返回顶部的时间等.github地址:https://github.com/1006008051/vue-totop, ...

  7. C语言 · 最大最小值

    算法提高 题目1 最大最小值   时间限制:1.0s   内存限制:1.0GB      问题描述 给定 N 个整数,请你找出这 N 个数中最大的那个和最小的那个. 输入格式 第一行包含一个正整数 N ...

  8. tmpx75 I2C 温度传感器驱动程序添加

    在kernel 内 make menuconfig 加入相关选项 Device Drivers ---> <*> Hardware Monitoring support ---> ...

  9. Android 自定义Adapter实现多视图Item的ListView

    自定义Adapter实现多视图Item的ListView http://www.devdiv.com/adapter_item_listview-blog-20-7539.html 1.原理分析 Ad ...

  10. Android——事件处理模型一(基于回调机制的事件处理)(转)

    Android平台的事件处理机制有两种,一种是基于回调机制的,一种是基于监听接口的,现介绍第一种:基于回调机制的事件处理.Android平台中,每个View都有自己的处理事件的回调方法,开发人员可以通 ...