微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用Ajax以及CSS+DIV高仿谷歌搜索附源码下载 .

在使用Google搜索或者是Baidu搜索的时候,在输入搜索关键字的同时,会自动弹出匹配的其他关键字的提示,全心全意为人民服务的精神在这里崭露无遗。这种利用Ajax技术实现输入提示自动完成的功能Google率先推出的,然后在其他的Web应用中被广泛的应用。利用Ajax实现部分页面刷新或者自动完成会使得用户体验绝大大提升。

技术永远是为用户服务的(无论是性能方面还是美观方面),脱离了用户就没有技术的发展,或者说只有用户才能促进技术的进步。

在掌握了Ajax原理之后我们也可以模仿谷歌,来实现一个搜索引擎的小Demo

在实现的过程中主要运用的是Ajax技术,CSS+DIV布局,Servlet+JavaBean,还有数据库的基本知识等等。下面大致的描述一下实现的步骤,请大家跟随文字来共同完成我们的Google。有兴趣的朋友可以点击这里下载源码(实现仓促,如有不足之处请谅解)

1、准备后台以及数据库,完成数据库MysqL)操作部分。

这里很简单,首先编写ConnectionManager类,来实现对数据库的连接、查询功能

代码如下:

  1. packagecom.ncs.common;
  2. importjava.sql.Connection;
  3. importjava.sql.DriverManager;
  4. importjava.sql.ResultSet;
  5. importjava.sql.sqlException;
  6. importjava.sql.Statement;
  7. publicclassConnectionManager{
  8. privatestaticStringURL="jdbc:MysqL://localhost:3306/test";
  9. privatestaticStringDRIVER="com.MysqL.jdbc.Driver";
  10. privatestaticStringUSER="root";
  11. privatestaticStringPASSWORD="123456";
  12. privatestaticConnectionconn=null;
  13. privatestaticStatementstmt=null;
  14. privatestaticResultSetrs=null;
  15. publicstaticvoidgetConnection(){
  16. try{
  17. Class.forName(DRIVER);
  18. try{
  19. conn=DriverManager.getConnection(URL,USER,PASSWORD);
  20. System.out.println("SuccessfullyconnectedtoMysqLDB!");
  21. }catch(sqlExceptione){
  22. System.out.println("ConnectionDBFailed!");
  23. }
  24. }catch(ClassNotFoundExceptione){
  25. System.out.println("Driver:"+DRIVER+"can'tfind!");
  26. }
  27. }
  28. publicstaticvoidcloseConnection(){
  29. try{
  30. conn.close();
  31. conn=null;
  32. }catch(sqlExceptione){
  33. e.printstacktrace();
  34. }
  35. }
  36. publicstaticResultSetexecuteQuery(Stringsql){
  37. try{
  38. stmt=conn.createStatement();
  39. rs=stmt.executeQuery(sql);
  40. returnrs;
  41. }catch(sqlExceptione){
  42. returnnull;
  43. }
  44. }
  45. publicstaticvoidmain(String[]args){
  46. //getConnection();
  47. }
  48. }
package com.ncs.common;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.sqlException;
import java.sql.Statement;

public class ConnectionManager {
	
	private static String URL="jdbc:MysqL://localhost:3306/test";
	private static String DRIVER="com.MysqL.jdbc.Driver";
	private static String USER="root";
	private static String PASSWORD="123456";
	private static Connection conn=null;
	private static Statement stmt=null;
	private static ResultSet rs=null;
	
	public static void getConnection(){
		
		try {
			Class.forName(DRIVER);
			try {
			conn = DriverManager.getConnection(URL,PASSWORD);
			System.out.println("Successfully connected to MysqL DB!");
			} catch (sqlException e) {
				System.out.println("Connection DB Failed!");
			}
		} catch (ClassNotFoundException e) {
			System.out.println("Driver:"+DRIVER+" can't find!");
		}		
		
	}
	
	
	public static void closeConnection(){
		
		try {
			conn.close();
			conn=null;
		} catch (sqlException e) {
			
			e.printstacktrace();
		}
	}
	
	
	public static  ResultSet executeQuery(String sql){
		try {
			stmt=conn.createStatement();
			rs=stmt.executeQuery(sql);
			return rs;
			
		} catch (sqlException e) {
			return null;
		}
		
	}
	
	public static void main(String[] args) {
		//getConnection();
	}

}


2、编写页面

页面添加必须要有的文本框,以及两个按钮。其中必不可少的是在文本框输入文本时才出现的一个隐藏DIV

代码如下:

  1. <%@pagelanguage="java"contentType="text/html;charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  4. <htmlxmlns="http://www.w3.org/1999/xhtml">
  5. <head>
  6. <title>Google</title>
  7. <%
  8. response.setHeader("Cache-Control","no-store");
  9. response.setHeader("Pragrma","no-cache");
  10. response.setDateHeader("Expires",0);
  11. %>
  12. <linktype="text/css"href="css/autoComplete.css"rel="stylesheet"/>
  13. <scripttype="text/javascript"src="scripts/autoComplete.js"></script>
  14. </head>
  15. <bodyonload="setPosition($('txtKeyword'))">
  16. <divid="img"><imgsrc="images/google.jpg"></img></div>
  17. <formid="form1">
  18. <divid="input"><inputtype="text"onkeydown="if(GetKeyCode(event)==13)form_submit()"onkeyup="GetSuggest(this.value,event);updown(event)"autocomplete="off"id="txtKeyword"/>
  19. </div>
  20. <divid="dSuggest"></div>
  21. <divid="button">
  22. <inputid="submit"type="submit"value="Google搜索"onclick="alert('NowSearch...')"/>
  23. <inputid="submit"type="submit"value="手气不错"onclick="alert('NowSearch...')"/>
  24. </div>
  25. </form>
  26. </body>
  27. </html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Google</title>
    <%
	    response.setHeader("Cache-Control","no-store"); 
	    response.setHeader("Pragrma","no-cache"); 
	    response.setDateHeader("Expires",0); 
    %>
    <link type="text/css" href="css/autoComplete.css" rel="stylesheet"/>
    <script type="text/javascript" src="scripts/autoComplete.js"></script>
</head>
<body onload="setPosition($('txtKeyword'))">
	<div id="img"><img src="images/google.jpg"></img></div>
    <form id="form1">
    <div id="input"><input type="text" onkeydown="if(GetKeyCode(event)==13)form_submit()" onkeyup="GetSuggest(this.value,event);updown(event)" autocomplete="off" id="txtKeyword" />
    </div>
    <div id="dSuggest"></div>
    <div id="button">
    <input id="submit" type="submit"  value="Google 搜索" onclick="alert('Now Search ...')" /> 
    <input id="submit" type="submit"  value="手气不错" onclick="alert('Now Search ...')" />
    </div>
    </form>
</body>
</html>


3、实现Servlet

编写Servlet来实现将页面的数据拼成sql语句并传到ConnectionManager类,将返回的结果输出页面。(需要注意的是,这里我们采用得是直接输出jsp代码,所以要为DIV加上id属性以便在CSS中控制样式,以及相关事件以便于在js中控制效果。)

代码如下:

  1. packagecom.ncs.servlet;
  2. importjava.io.IOException;
  3. importjava.io.PrintWriter;
  4. importjava.sql.ResultSet;
  5. importjava.sql.sqlException;
  6. importjavax.servlet.servletexception;
  7. importjavax.servlet.http.HttpServlet;
  8. importjavax.servlet.http.HttpServletRequest;
  9. importjavax.servlet.http.HttpServletResponse;
  10. importcom.ncs.common.ConnectionManager;
  11. publicclasssuggestextendsHttpServlet{
  12. @Override
  13. protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)
  14. throwsservletexception,IOException{
  15. req.setCharacterEncoding("UTF-8");
  16. //resp.setContentType("text/xml;charset=utf-8");
  17. System.out.println("EnterServletgetmethod..");
  18. PrintWriterout=resp.getWriter();
  19. Stringparam=(String)req.getParameter("id");
  20. StringparamValue=param.trim().length()>0?param.trim():"unkNown";
  21. Stringsql="selectnamefromtbl_ajax_searchwherenamelike'"+paramValue+"%'";
  22. System.out.println("sql="+sql);
  23. ConnectionManager.getConnection();
  24. ResultSetrs=ConnectionManager.executeQuery(sql);
  25. StringBuffersb=newStringBuffer();
  26. //sb.append("<?xmlversion=\"1.0\"encoding=\"UTF-8\"?>")
  27. //.append("<data>");
  28. sb.append("<ulid=\"sug\">");
  29. intpos=0;
  30. try{
  31. while(rs.next()){
  32. System.out.println("pos="+pos);
  33. sb.append("<lionclick=\"form_submit()\"onmouSEOver=\"myMouSEOver(")
  34. .append(pos)
  35. .append(");\"onmouSEOut=\"myMouSEOut(")
  36. .append(pos)
  37. .append(");\">")
  38. .append(rs.getString(1)+"</li>");
  39. //sb.append("<item>")
  40. //.append(rs.getString(1))
  41. //.append("</item>");
  42. pos++;
  43. }
  44. sb.append("</ul>");
  45. intposi=sb.toString().indexOf("onmouSEOver");
  46. System.out.println("posi="+posi);
  47. if(posi==-1){
  48. System.out.println("nocontentfound.");
  49. out.write("");
  50. }else{
  51. System.out.println(sb.toString());
  52. out.write(sb.toString());
  53. }
  54. }catch(sqlExceptione){
  55. e.printstacktrace();
  56. }
  57. }
  58. @Override
  59. protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)
  60. throwsservletexception,IOException{
  61. //TodoAuto-generatedmethodstub
  62. doGet(req,resp);
  63. }
  64. }
package com.ncs.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.sqlException;

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

import com.ncs.common.ConnectionManager;

public class suggest extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req,HttpServletResponse resp)
			throws servletexception,IOException {
		req.setCharacterEncoding("UTF-8");
	//	resp.setContentType("text/xml;charset=utf-8");
		System.out.println("Enter Servlet Get Method..");
		PrintWriter out=resp.getWriter();
		String param=(String)req.getParameter("id");
		String paramValue=param.trim().length()>0?param.trim():"unkNown";
		String sql="select name from tbl_ajax_search where name like '"+paramValue+"%'";
		System.out.println("sql="+sql);
		ConnectionManager.getConnection();
		ResultSet rs=ConnectionManager.executeQuery(sql);
		StringBuffer sb=new StringBuffer();
		//sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")
		 // .append("<data>");
		sb.append("<ul id=\"sug\">");
		int pos=0;
		try {
			
			while(rs.next()){	
				System.out.println("pos="+pos);
					sb.append("<li onclick=\"form_submit()\" onmouSEOver=\"myMouSEOver(")
					.append(pos)
					.append(");\" onmouSEOut=\"myMouSEOut(")
					.append(pos)
					.append(");\">")
					.append(rs.getString(1)+"</li>");
				//sb.append("<item>")
				  //.append(rs.getString(1))
				 // .append("</item>");		
					pos++;
			}
			
			sb.append("</ul>");
			
			int posi = sb.toString().indexOf("onmouSEOver");
			System.out.println("posi="+posi);
			if(posi==-1){
				System.out.println("no content found.");
				out.write("");
			}else{
				System.out.println(sb.toString());
				out.write(sb.toString());
			}
		} catch (sqlException e) {
			
			e.printstacktrace();
		}


	}

	@Override
	protected void doPost(HttpServletRequest req,IOException {
		// Todo Auto-generated method stub
		doGet(req,resp);
	}
}


4、仿照Google调整页面的布局

这里重点就是调整隐藏的DIV以及按钮的样式。

最终效果如下图


后记:关于模仿

自呱呱坠地我们就开始了自己一生的学习,在学习的过程中有着必不缺少的一个步骤:模仿。我们的学习大多是从模仿开始的,无论是模仿父母的声音牙牙学语,还是模仿大人走路的姿势蹒跚学步;无论是模仿书本上的文字一笔一画,还是模仿课文的结构字斟句酌。这都是开始学习的第一个过程——模仿。当然随着模仿的深入我们掌握了原理就可以开始下一个阶段的学习:使用和发挥。使用和发挥有赖于模仿的功力,只有初期模仿的到位,模仿的逼真,才能有后期的漂亮运用与灵活发挥。

我们的学习之路:模仿——使用——发挥

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐