ajax+servlet实现百度智能提示搜索框–来自慕课课程

  • 2020 年 2 月 18 日
  • 笔记

查看Demo

/**   * @author xiaohejun   * Man Always Remember Love Because of Romance Only.   *   */

一.实现效果:

1.serach.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%>  <html>  <head>      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">      <title>搜索</title>      <style type="text/css">          #myDiv {              position:absolute;              left: 50%;              top: 50%;              margin-left: -200px;              margin-top: -50px;          }          .mouseOver{              background: #708090;              color: #FFFAFA;          }          .mouseOut{              background: #FFFAFA;              color: #000000;          }      </style>        <script type="text/javascript">          var xmlHttp;          /*获得用户关联信息*/          function getMoreContents() {              // 首先获得用户输入              var content = document.getElementById("keyword");              if(content.value == ""){                  return;              }              // 然后给服务器发送用户输入类容,用ajax异步发送请求,获得一个对象,骄傲做xmlHttp              xmlHttp = createXmlHttp();              // 要给服务器发送数据,escape()方法对字符串进行编码              var url="search?keyword=" + decodeURI(content.value);              // 和服务器建立链接,true参数表示javascript脚本会在send()方法之后继续执行,而且不会等待来自服务器的响应              xmlHttp.open("GET",url);              // 绑定一个回调方法,这个会调方法会在xmlHttp状态改变0-4,我们只关心4(complete)这个状态,完成之后,调用回调方法              xmlHttp.onreadystatechange=callback;              xmlHttp.send(null);          }            // 清空之前的数据          function clearContent() {              var tbody = document.getElementById("content_table_body");              var size = tbody.childNodes.length;              for (var i = size-1; i >= 0;i--) {                  tbody.removeChild(tbody.childNodes[i]);              }              document.getElementById("popDiv").style.border = "none";          }            //回调函数          function callback() {                if(xmlHttp.readyState==4){                  // 服务器响应成功                  if(xmlHttp.status==200){                      // 交互成功,获得响应数据                      var result = xmlHttp.responseText;                      // 解析成JSON格式                      var json = eval("("+result+")");                      // 获得数据之后,就可以动态显示这些数据,把这些数据展示到输入框的下面                      setContent(json);                  }              }          }          // 设置关联数据的展示          function setContent(contents) {                clearContent();              setLocation();              var size = contents.length;              for (var i = 0; i < size; i++) {                  var nextNode = contents[i];                  var tr = document.createElement("tr");                  var td = document.createElement("td");                  td.setAttribute("border","0");                  td.bgColor = "white";                  td.onmouseover = function () {                      this.className = 'mouseOver';                  };                  td.onmouseout = function () {                      this.className = 'mouseOut';                  }                  td.onmousedown = function() {                      document.getElementById("keyword").value = this.innerHTML;                  }                  var text = document.createTextNode(nextNode);                  td.appendChild(text);                  tr.appendChild(td);                  document.getElementById('content_table_body').appendChild(tr);              }          }          // 获得xmlHttp对象          function createXmlHttp() {              // 对于大多数浏览器适用的              var xmlHttp;              if (window.XMLHttpRequest) {                  xmlHttp = new XMLHttpRequest();              }              // 要考虑浏览器的兼容              if (window.ActiveXObiect) {                  xmlHttp = new ActiveXObiect("Microsoft.XMLHTTP");                  if (!xmlHttp) {                      xmlHttp = new ActiveXObiect("Msxml2.XMLHTTP");                  }              }              return xmlHttp;          }            function keywordBlur() {              clearContent();          }            // 设置显示的位置          function setLocation() {              // 关联信息的显示位置要和输入框一致              var content = document.getElementById("keyword");              // 输入框的宽度              var width = content.offsetWidth;              // 到左边框的距离              var left = content["offsetLeft"];              // 到顶部的距离              var top = content["offsetTop"] + content.offsetHeight;              // 获得显示数据的div              var popDiv = document.getElementById("popDiv");              popDiv.style.border = "black 1px solid";              popDiv.style.left = left + "px";              popDiv.style.top = top + "px";              popDiv.style.width = width + "px";              document.getElementById("content_table").style.width = width + "px";          }      </script>  </head>  <body>  <div id="myDiv">      <!-- 输入框 -->      <input type="text" size="50" id="keyword" onkeyup="getMoreContents()" onblur="keywordBlur()" onfocus="getMoreContents()"/>      <input type="button" value="百度一下" width="50px"/>      <!-- 内容展示的区域 -->      <div id="popDiv">          <table id="content_table" bgcolor="#FFFAFA" border="0" cellspacing="0" cellpadding="0">              <tbody id="content_table_body">                </tbody>          </table>      </div>  </div>  </body>  </html>

2.SearchServlet.java

package com.servlet;      import java.io.IOException;  import java.util.ArrayList;  import java.util.List;    import javax.servlet.ServletException;  import javax.servlet.annotation.WebServlet;  import javax.servlet.http.HttpServlet;  import javax.servlet.http.HttpServletRequest;  import javax.servlet.http.HttpServletResponse;    import net.sf.json.JSONArray;    /**   * Servlet implementation class search   */  @WebServlet("/search")  public class SearchServlet extends HttpServlet {  	private static final long serialVersionUID = 1L;      private static List<String> datas;      /**       * @see HttpServlet#HttpServlet()       */      public SearchServlet() {          super();          // TODO Auto-generated constructor stub      }    	/**  	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)  	 */      static {      	datas  = new ArrayList<String>();      	datas.add("ajax");      	datas.add("ajax post");      	datas.add("b啊哈");      	datas.add("b哈");      	datas.add("这是ajax");      	datas.add("你全家都是ajax");      }      public List<String> getData(String keyword) {  		List<String> list = new ArrayList<String>();  		for (String data : datas) {  			if (data.contains(keyword)) {  				list.add(data);  			}  		}      	return list;  	}    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{  		response.setCharacterEncoding("UTF-8");  		request.setCharacterEncoding("UTF-8");;  		String keyword = request.getParameter("keyword");  		List<String> listData = getData(keyword);  		response.getWriter().write(JSONArray.fromObject(listData).toString());  	}    	/**  	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)  	 */  	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  		// TODO Auto-generated method stub  		doGet(request, response);  	}    }

注意:不可以使用escape()函数编码,已经过时