最近开始接触AJAX,最初以为是一种很新很时髦的技术,等学习了一段时间后,
发现不过是一些老技术的结合。最重要的就是XMLHttpRequest对象(JS)
正所谓学以致用,今天突发灵感,觉得百度的自动下拉提示框应该是用AJAX实现的,
于是心头一热,忙了大半个晚上,写了个简单的WEB程序。
下面给大家分享下自己的拙作,希望大家多点评下。
本网站前端采用的JSP,后台为Servlet模块。
数据库采用流行的MySQL。
在实现功能之前,应该了解一下基本的原理。
首先是要知道对表单的输入框的响应事件。
Javascript中有onpropertychange(IE支持)和oninput(FF等)
对于IE来说,可以这样来实现:
<script type="text/javascript">
document.getElementById('myinput').attachEvent('onpropertychange',function(o){
if(o.propertyName =='value') {
//doSth ex. alert(myinput.value);
}
});
</script>
<script type="text/javascript">
document.getElementById('myinput').addEventListener( "input",function(o) {
//doSth
// ex. alert(myinput.value);
},false);
</script>
这样,我们就可以动态地取得用户输入的内容。通过AJAX的异步交互,将信息传递给Servlet处理,
Servlet连接数据库,得到匹配的信息,返回给页面。
在数据库中,可以这样模糊查询:
SELECT * FROM table_name WHERE column_name = 'content%';
如果匹配多个字符则用"%",单个字符用"_"。
**************************************************************************************
中文乱码问题
另外,由于我们是利用JS取得用户的数据,因此如果含有中文信息会乱码,
我们可以利用JS里的函数库来处理乱码内容:
encodeURI() 或者 encodeURIComponent(uriComponent)
(调用一次还是会乱码,网上有人说要两次掉要该方法就可以解决问题,即encodeURI(encodeURI()))
在Servlet对得到的信息解码:
URLDecoder.decode(request.getParameter("msg","UTF-8"));
这样,我们就解决了中文乱码问题.
***************************************************************
整个流程大概如下:
下面给出一些关键代码:
首先是数据库:
创建数据库:
CREATE DATABASE autoComplete;
接着创建表:
Create Table: CREATE TABLE `hotwords` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`msg` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8
再随机插入一些数据:
如图:
mysql> select * from hotwords;
+----+---------+
| id | msg |
+----+---------+
| 1 | china |
| 2 | chinese |
| 3 | cake |
| 4 | cub |
| 5 | chaos |
| 6 | chicken |
| 7 | 陈旭 |
| 8 | 陈龙 |
| 9 | 陈滟龙 |
+----+---------+
9 rows in set (0.00 sec)
接下来是JSP页面:
index.jsp:
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
<title>自动提示框</title>
<style type="text/css">
.mystyle
{ background:white none repeat scroll 0 0;
border:1px solid black;
cursor:default;
font-size:13px;
line-height:17px;
margin:0;
z-index:99;
width:150px;
left:10px;
top:10px;
visibility: hidden;
}
</style>
</head>
<body>
<img src="pics/baidu_sylogo1.gif"/>
<form>
<input type="text" name="myinput" id="myinput" autocomplete="off"/>
<input type="submit" value="百度一下" />
</form>
<div id="aaa" class="mystyle"></div>
</body>
<script type="text/javascript">
<!--
var xmlHttp; //XMLHttpRequest对象
//判断浏览器类型
function isIE() {
if(navigator.userAgent.indexOf( "MSIE")>0) {
return true;
}
}
//定义表单内容改变事件
if(isIE()) {
document.getElementById('myinput').attachEvent('onpropertychange',function(o){
if(o.propertyName =='value') {
var msg = document.getElementById('myinput').value; //取得用户输入实时信息
getContent(msg);
}
});
} else {
document.getElementById('myinput').addEventListener( "input",function(o) {
var msg = document.getElementById('myinput').value; //取得用户输入实时信息
getContent(msg);
},true);
}
//创建XMLHttpRequest对象
function createXMLHttp() {
if(window.ActiveXObject)
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
else
xmlHttp = new XMLHttpRequest();
}
//向服务器取数据
function getContent(msg) {
createXMLHttp();
var url = encodeURI(encodeURI("query.do?msg=" + msg));
xmlHttp.open("POST",url,true);
xmlHttp.onreadystatechange = function() {
if(xmlHttp.readyState == 4) {
if (xmlHttp.responseText == '')
document.getElementById("aaa").style.visibility = 'hidden';
else{
document.getElementById("aaa").style.visibility = 'visible';
document.getElementById("aaa").innerHTML = xmlHttp.responseText;
}
}
};
xmlHttp.send();
}
//-->
</script>
</html>
再来是Servlet
QueryServlet.java:
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
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;
public class QueryServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String msg = request.getParameter("msg");
String decoded_msg = URLDecoder.decode(msg,"UTF-8");
System.out.println(decoded_msg);
getContent(decoded_msg, out);
}
public static Connection getConnection() {
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/autocomplete", "root",
"your password");
return conn;
} catch (ClassNotFoundException cnfe) {
cnfe.printStackTrace();
return null;
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
public static void getContent(String msg, PrintWriter out) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
if ( !msg.equals("")) {
System.out.println(msg);
String sql = "select * from hotwords where msg like '" + msg + "%'";
System.out.println(sql);
try {
conn = getConnection();
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
while (rs.next()) {
out.print(rs.getString("msg") + "<br/>");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
try{
if(rs != null) {
rs.close();
}
if(pstmt != null) {
pstmt.close();
}
if(conn != null) {
conn.close();
}
}catch(SQLException e) {
e.printStackTrace();
}
}
}
}
//删除内容
public static boolean deleteContent(String msg) {
Connection conn = null;
PreparedStatement pstmt = null;
System.out.println(msg);
String sql = "delete * from hotwords where msg =?";
try {
conn = getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1,msg);
int n = pstmt.executeUpdate();
if ( n > 0) {
return true;
}else {
return false;
}
} catch (SQLException e) {
e.printStackTrace();
return false;
}finally {
try{
if(pstmt != null) {
pstmt.close();
}
if(conn != null) {
conn.close();
}
}catch(SQLException e) {
e.printStackTrace();
}
}
}
}
最后贴一个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>
<servlet>
<servlet-name>QueryServlet</servlet-name>
<servlet-class>QueryServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>QueryServlet</servlet-name>
<url-pattern>/query.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
大功告成,下面看一下效果:
IE9:
Google Chrome:
(数据库用户名和密码可以在QueryServlet.java类里改)
(别忘了在类库里添加MySQL驱动包)
(整个web项目放在资源里,供大家分享)
至于百度的图片,呵呵,自己去官网索取吧。
Over...