Ajax學習采用Eclipse,
輸入a自動提示以下內容。選擇下拉框內容變化到輸入框內。
首先建立前台頁面:search.jsp
<%@ 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>Insert title here</title> <style type="text/css"> #mydiv{ position:absolute; left:50%; top:50%; /*先居中在調試 */ margin-left:-200px; margin-top:-50px; } .ky{ border:1px solid ; height:20px; } .mouseOver{ background:#708090; color:#fff; } .mouseOut{ background:#FFFAFA; color:#000000; } </style> <script type="text/javascript"> var xmlHttp; function getMoreContents(){ //獲得用戶輸入的關聯內容 var content = document.getElementById("keyword"); if(content.value ==""){ clearContent(); return; } //給服務器發送數據 ,采用的是 Ajax異步傳輸數據。 //所以建立一個Ajax的對象xmlHttp, xmlHttp = createXMLHttp();//xmlhttp= 獲得 XmlHttp的對象 ; //要給服務器發送數據 var url ="search?keyword="+escape(content.value); xmlHttp.open("GET",url,true);//true表示會在send()方法之后繼續執行。 //xmlhttp綁定回調方法 ,當xmlHttp的狀態改變的時候才會調用 此方法 //xmlhttp的四種狀態我們只關心狀態4:(complete),所以說在完成之后調用回調方法才有意義 xmlHttp.onreadystatechange = callback;//onreadystatechange在這里是小寫不能大寫 。 xmlHttp.send(null); //alert(xmlHttp); } //創建XMLHttp對象的函數 function createXMLHttp(){ var xmlHttp; if(window.XMLHttpRequest) { xmlHttp = new XMLHttpRequest(); } if(window.ActiveXObject){ xmlHttp= new ActiveXObject("Microsoft.XMLHTTP"); if(!xmlHttp){ xmlHttp = new ActiveXOject("Msxml2.HTTP"); } } return xmlHttp; } //回調函數 function callback(){ if(xmlHttp.readyState == 4){ //4代表完成200代表服務器響應 、 404代表資源未找到 ,500代表 內部出現錯誤 if(xmlHttp.status == 200){ //定義交互成功時候,獲取的數據是 Text數組的格式 。 var result = xmlHttp.responseText; //結息獲取數據 var json = eval("("+result+")"); //獲得數據后就可以動態的展示數據了,並把數據展示在下拉框的下方 , //在這里打印一下json,看看是否前后台交互成功 setContent(json);//將json數據傳輸到setContent()方法中 } } } //設置關聯數據的展示,參數代表的是服務器傳遞過來的關聯數據 function setContent(contents){ clearContent(); setlocation(); //首先獲得關聯數據的長度,依次來確定生成多少tr,td var size =contents.length; //設置內容 for(var i=0;i<size;i++){ var nextNode = contents[i];//代表的是Json數據格式的第i個元素 var tr = document.createElement("tr"); var td = document.createElement("td"); td.setAttribute("border","0"); td.setAttribute("bgcolor","#FFFAFA"); //為td綁定兩個樣式(鼠標進入和鼠標移出時事件) td.onmouseover = function(){ this.className = 'mouseOver'; document.getElementById("keyword").value=this.innerHTML; }; td.onmouseout = function(){ this.className = 'mouseOut'; }; td.onclick = function(){ //方法實現的是,選擇關聯數據,自動設置為輸入框數據 }; //創建一個文本節點 var text = document.createTextNode(nextNode); td.appendChild(text); tr.appendChild(td); document.getElementById("content_table_body").appendChild(tr); //表示數據 } } //清空數據的方法 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]); } document.getElementById("popDiv").style.border="none"; } function keywordBlur(){ clearContent(); } function setlocation(){ var content=document.getElementById("keyword"); var width=content.offsetWidth; var left=content["offsetLeft"]; var top=content["offsetTop"]+content.offsetHeight; var popDiv = document.getElementById("popDiv"); popDiv.style.border="black 0px 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 class="ky" 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>
配置web.xml,新建web.xml文件。
<?xml version="1.0" encoding="UTF-8"?> <web-app version = "2.5" 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_2_5.xsd" > <display-name></display-name> <welcome-file-list> <welcome-file>search.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>search</servlet-name> <servlet-class>com.imooc.SearchServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>search</servlet-name> <url-pattern>/search</url-pattern> </servlet-mapping> </web-app>
添加json包,到lib中,全選中,右鍵Build-path
https://pan.baidu.com/s/1KBrbwj1nAwrVGMuOe-iQPQ
編寫后台代碼:
package com.imooc; import java.io.IOException; 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 net.sf.json.JSONArray; public class SearchServlet extends HttpServlet { //2018-8-3呂澤坤 static List<String> datas = new ArrayList<String>(); static{ datas.add("ajax"); datas.add("ajax post"); datas.add("becky"); datas.add("bill"); datas.add("james"); datas.add("jerry"); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); System.out.println("123"); //首先獲得客戶端發過來的數據keyword String keyword = request.getParameter("keyword"); //獲得關鍵字之后進行處理,得到關鍵數字 List<String> listData = getData(keyword); //返回Json格式 //System.out.println(JSONArray.fromObject(listData)); response.getWriter().write(JSONArray.fromObject(listData).toString()); } //獲得關聯數據的方法 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; } }