Java Web:自己想出的连接数据库的AJAX重名验证实例源码,PPT,学习笔记【诗书画唱】
很多东西要从记录小且简单的例子开始——诗书画唱
下面是我自己想出的判断数据库中查询用户名,是否重名的判断方法:


create table user(
id int primary key auto_increment,
act varchar(100) unique,
trueName varchar(100),
pwd varchar(100) ,
sex varchar(100) ,
sfid varchar(100),
phone varchar(100),
Email varchar(100) ,
tid int,
ShippingAddress varchar(100),
ZcTime timestamp default now(),
touXiangImg varchar(100)
);
insert into User(
act ,
trueName ,
pwd ,
sex,
sfid ,
phone ,
Email ,
tid,
ShippingAddress,touXiangImg) values
("1","真实姓名","1","男","11010519491231002X","16666666666","2531894166@qq.com",1,'北京市 北京市辖区 东城区','imgLogo/MyLogo.jpg'),
("2","真实姓名","2","男","11010519491231002X","16666666666","2531894166@qq.com",2,'北京市 北京市辖区 东城区','imgLogo/MyLogo.jpg'),
("SSHC520","真实姓名","123456Aa","男","11010519491231002X","16666666666","2531894166@qq.com",1,'北京市 北京市辖区 东城区','imgLogo/MyLogo.jpg'),
("SSHC666","真实姓名","123456Aa","男","11010519491231002X","16666666666","2531894166@qq.com",2,'北京市 北京市辖区 东城区','imgLogo/MyLogo.jpg');





package bean;
import java.sql.Timestamp;
import java.util.Date;
public class User {
private Integer id;
private String act;
private String pwd;
private Integer tid;
private String trueName;
private String sfid;
private String phone;
private String sex;
private String Email;
private String ShippingAddress;
private Timestamp ZcTime;
private String TouXiangImg;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getAct() {
return act;
}
public void setAct(String act) {
this.act = act;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public Integer getTid() {
return tid;
}
public void setTid(Integer tid) {
this.tid = tid;
}
public String getTrueName() {
return trueName;
}
public void setTrueName(String trueName) {
this.trueName = trueName;
}
public String getSfid() {
return sfid;
}
public void setSfid(String sfid) {
this.sfid = sfid;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getEmail() {
return Email;
}
public void setEmail(String email) {
Email = email;
}
public String getShippingAddress() {
return ShippingAddress;
}
public void setShippingAddress(String shippingAddress) {
ShippingAddress = shippingAddress;
}
public Timestamp getZcTime() {
return ZcTime;
}
public void setZcTime(Timestamp zcTime) {
ZcTime = zcTime;
}
public String getTouXiangImg() {
return TouXiangImg;
}
public void setTouXiangImg(String touXiangImg) {
TouXiangImg = touXiangImg;
}
}

package com.SSHC.servlet;
import java.io.IOException;
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 DAO.UserDao;
import bean.User;
/**
* Servlet implementation class DupServlet
*/
@WebServlet("/loginServlet")
public class loginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public loginServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request,
* HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
this.doPost(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest
* request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
//——————
//获取账号和密码
String act = request.getParameter("act");
String pwd = request.getParameter("pwd");
UserDao ud = new UserDao();
List<Object> list;
try {
list = ud.selectAll(User.class,null);
String msg = "";
int i=1;
for(Object o : list) {
User u = (User)o;
System.out.println(u.getAct());
//重名验证
if(u.getAct().equals(act)) {
i=i*0;
} else if(act.length()==0&&!u.getAct().equals(act)){
i=i;
}
else if(act.length()>0&&!u.getAct().equals(act)){
i=i*2;
}
}
if(i==0) {
msg = "该账号名已被使用";
} else if(i==1){
msg = "请输入账号名,账号名不能为空";
}
else if(i%2==0){
msg = "该账号名可以使用";
}
//中文乱码处理
response.setCharacterEncoding("utf-8");
//将msg返回到jsp页面中去
//servlet中的数据只能在ajax的回调函数中才能拿到
response.getWriter().write(msg);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


package DAO;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import utils.DBUtils;
//万能Dao
//T不是一个具体的java类,他是一个泛型参数
public class BaseDao<T> {
public<T> List<T>selectAll(Class cls,String SQL) throws Exception{
Connection conn = null;
PreparedStatement pstm = null;
ResultSet rs = null;
List<T>list = new ArrayList<T>();
//通过反射技术获取表的名字,表的名字刚好和bean的名字一样
//获取类的类名
String tableName = cls.getSimpleName();
String sql=null;
if(SQL==null){
sql = "select * from " + tableName;}
else if(SQL!=null){
sql = "select * from " + tableName
+SQL;}
System.out.println(sql);
conn = DBUtils.getConn();
pstm = conn.prepareStatement(sql);
rs = pstm.executeQuery();
//获取bean中的所有属性名
Field []fs = cls.getDeclaredFields();
while(rs.next()) {
//通过反射创建出cls对象的实例
Object obj = cls.newInstance();
for(int i = 0;i < fs.length;i ++) {
//bean中的属性名
String fname = fs[i].getName();
//获取bean中的属性的类型
Class type = fs[i].getType();
Object o = rs.getObject(fname);
//System.out.println(o);
//将属性对应的set方法名拼接出来
//取出属性名的首字母,将它变成大写
String methodName = "set"
+ fname.substring(0,1).toUpperCase()
+ fname.substring(1);
//System.out.println(methodName);
//通过反射调用set方法
Method m = cls.getDeclaredMethod(methodName, type);
System.out.println(m);
m.invoke(obj, o);
}
list.add((T)obj);
}
return list;
}
public static Integer countAdd;
public Integer add(T t) throws Exception{
Connection conn = null;
PreparedStatement pstm = null;
Integer count = -1;
String tableName = t.getClass().getSimpleName();
//System.out.println(tableName);
StringBuilder sql = new StringBuilder("insert into "
+ tableName + " (");
//取出t对象中的所有的属性名
Field []fs = t.getClass().getDeclaredFields();
String dot = "";
for(int i = 0;i < fs.length;i ++) {
sql.append(dot);
String fname = fs[i].getName();
sql.append(fname);
dot = ",";
}
sql.append(")values(");
String dot1 = "";
for(int i = 0;i < fs.length;i ++) {
sql.append(dot1);
sql.append("?");
dot1 = ",";
}
sql.append(")");
//System.out.println(sql);
conn = DBUtils.getConn();
pstm = conn.prepareStatement(sql.toString());
//调用t对象中所有的get方法
for(int i = 0;i < fs.length;i ++) {
//取出属性名
String fname = fs[i].getName();
//拼接get方法
String methodName = "get"
+ fname.substring(0,1).toUpperCase()
+ fname.substring(1);
//取出需要调用的方法
Method m = t.getClass().getDeclaredMethod(methodName);
//反射调用get方法
Object val = m.invoke(t);
System.out.println("新增的数据是:" + val);
//设置占位符
pstm.setObject(i + 1, val);
}
count = pstm.executeUpdate();
countAdd=count;
System.out.println(countAdd);
return count;
}
public static Integer countUpdate;
public Integer update(T t,String SQL) throws Exception{
System.out.println("这时传过来的SQL为:"+SQL);
Connection conn = null;
PreparedStatement pstm = null;
Integer count = -1;
StringBuilder sql = new StringBuilder("update ");
//获取表名,就是获取t对象的类名
Class cls = t.getClass();
String tableName = cls.getSimpleName();
sql.append(tableName + " set ");
//获取t对象的所有属性名
Field[]fs = cls.getDeclaredFields();
//每个javabean的第一个属性必须是id
//下标是从1开始的,也就是排除了id属性
String dot = "";
//定义一个List存放所有的修改的值
List<Object>params = new ArrayList<Object>();
for(int i = 0;i < fs.length;i ++) {
Field f = fs[i];
//获取属性名
String fname = f.getName();
System.out.println("下标为"+i+"的属性名:"+fname);
//调用getXXX方法来获取t中的属性值
String methodName = "get"
+ fname.substring(0,1).toUpperCase()
+ fname.substring(1);
System.out.println(methodName);
//通过反射获取方法对象
Method m = cls.getDeclaredMethod(methodName);
//反射调用getXXX方法
Object obj = m.invoke(t);
//当获取到的值不为空时,才能进行修改
if(obj != null) {
sql.append(dot);
sql.append(fname + " = ? ");
dot = ",";
params.add(obj);
}
}
//将id也放到params容器中去
// Method m1 = cls.getDeclaredMethod("getId");
Method m1 = cls.getDeclaredMethod(
"get"
+fs[0].getName().substring(0,1)
.toUpperCase()
+ fs[0].getName().substring(1));
Object id = m1.invoke(t);
params.add(id);
//拼接where条件
fs[0].getName();
System.out.println("这个表的第一列的列名"
+ "(一般都为编号名)为:"+fs[0].getName());
// sql.append("where id = ? ");
if(SQL==null){
sql.append("where "+fs[0].getName()+" = ? ");}
System.out.println(sql);
conn = DBUtils.getConn();
System.out.println("SQL:"+SQL);
if(SQL!=null){
sql.append(SQL);
}
System.out.println("这时执行的修改语句为:"+sql);
pstm = conn.prepareStatement(sql.toString());
//设置占位符的值
if(SQL==null){
for(int i = 0;i < params.size();i ++) {
pstm.setObject(i + 1, params.get(i));
}}
if(SQL!=null){
pstm.setObject(1, "已支付");
}
System.out.println("这时执行的修改语句为:"+sql);
count = pstm.executeUpdate();
countUpdate=count;
return count;
}
// public Integer delete(Integer id){
// return 0;
// }
//万能Dao删除方法
public static Integer countDelete;
public Integer delete(Integer id,Class cls)
throws Exception{
Connection conn = null;
PreparedStatement pstm = null;
Integer count = -1;
String tableName = cls.getSimpleName();
Field[]fs = cls.getDeclaredFields();
for(int i = 0;i < fs.length;i ++) {
Field f = fs[i];
//获取属性名:fs[i].getName();
String fname = f.getName();
System.out.println("下标为"+i+"的属性名:"+fname);
//调用getXXX方法来获取t中的属性值
String methodName = "get"
+ fname.substring(0,1).toUpperCase()
+ fname.substring(1);
System.out.println(methodName);
//通过反射获取方法对象
Method m = cls.getDeclaredMethod(methodName);
//反射调用getXXX方法
//当获取到的值不为空时,才能进行修改
}
// String sql = "delete from " + tableName
// + " where id = ?";
String sql = "delete from " + tableName
+ " where "+fs[0].getName()+" = ?";
conn = DBUtils.getConn();
pstm = conn.prepareStatement(sql);
pstm.setInt(1, id);
count = pstm.executeUpdate();
countDelete=count;
return count;
}
public static void main(String[] args) throws Exception {
}
}





package utils;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
public class DBUtils {
private static String driverName;
private static String url;
private static String userName;
private static String pwd;
//静态块,随着类加载而运行的
static{
//读取db.properties文件中的内容:
Properties prop = new Properties();
InputStream is = DBUtils.class.getClassLoader()
.getResourceAsStream("db.properties");
try {
prop.load(is);
driverName = prop.getProperty("dn");
url = prop.getProperty("url");
userName = prop.getProperty("un");
pwd = prop.getProperty("up");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Connection getConn(){
Connection conn = null;
try {
Class.forName(driverName);
conn = DriverManager.getConnection(url,userName,pwd);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
public static void close(ResultSet rs,
PreparedStatement pstm
,Connection conn){
try {
if(rs != null) {
rs.close();
}
if(pstm != null) {
pstm.close();
}
if(conn != null) {
conn.close();
}
} catch(Exception e) {
e.printStackTrace();
}
}
}

dn=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/firstjsp?useUnicode=true&characterEncoding=utf-8
un=root
up=root

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base hreff="<%=basePath%>">
<title></title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<script type="text/javascript">
function dup(){
//获取输入文本框中的内容
var act = document.getElementById('act').value;
//console.log(act);
var xhr = null;//ajax的核心对象
if(window.XMLHttpRequest) {//判断window对象中是否有XMLHttpRequest属性
xhr = new XMLHttpRequest();
} else {//如果没有XMLHttpRequest属性,就使用ActiveXObject创建
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
//将act传递到servlet中,也就是说要从js代码跳转到java代码中去
if(xhr) {//判断xhr是否为null
//设置ajax请求方式是post和提交的url路径
xhr.open('post','loginServlet');
//设置ajax请求头
xhr.setRequestHeader("content-type",
"application/x-www-form-urlencoded");
//设置回调函数
xhr.onreadystatechange = function(){
if (xhr.readyState == 4 && xhr.status == 200){
//获取servlet中传递过来的数据msg
document.getElementById('ctx').innerHTML
= xhr.responseText;
}
}
//提交到servlet中去
//将act的值传递到servlet中去
xhr.send('act=' + act + '&pwd=123');
}
}
</script>
</head>
<body>
<form action="" method="post">
<input type="text" name="act" id="act" placeholder="请输入账号"
onpropertychange="dup();" oninput="dup();" />
<div id="ctx"></div>
<input type="submit" value="登录" />
</form>
</body>
</html>







小例子:不从数据库查就是



个人理解:AJAX可以增加运行流畅度。

个人理解:AJAX可以在输入用户名,判断是否重名等的局部刷新同时,可以做别的操作,比如输入密码,而且辛苦写的密码不会因为因为刷新而要重写。
AJAX的PPT:












AJAX简介
AJAX即Asynchronous Javascript And XML(异步的javascript和XML),由HTML、Javascript、DHTML和DOM组成。它是一种交互式的应用程序,也是一种构建网站的强大方法,它的出现使高效的WEB程序开发称为现实。
应用程序的基本选择
●桌面应用程序:可能使用互联网下载更新,但运行这些应用程序的代码在桌面计算机上。与用户进行交互时响应很快。
●WEB应用程序:Web 应用程序运行在某处的 Web 服务器上 ,要通过 Web 浏览器访问这种应用程序。与用户进行交互式时需要等待服务器响应和屏幕刷新,速度比较慢。
AJAX帮我们做什么?
AJAX 尝试建立桌面应用程序的功能和交互性与不断更新的 Web 应用程序之间的桥梁。可以使用像桌面应用程序中常见的动态用户界面和漂亮的控件,不过是在 Web 应用程序中。
开发AJAX应用程序需要掌握的技术
●HTML:用于建立 Web 表单并确定应用程序其他部分使用的字段。
●JavaScript :是运行 Ajax 应用程序的核心代码,帮助改进与服务器应用程序的通信。
●DHTML 或 Dynamic HTML:用于动态更新表单。我们将使用 div、span 和其他动态 HTML 元素来标记 HTML。
●文档对象模型 DOM :用于(通过 JavaScript 代码)处理 HTML 结构和(某些情况下)服务器返回的 XML。
XMLHttpRequest对象
在一般的 Web 应用程序中,用户填写表单字段并单击 Submit 按钮后就进入了等待处理阶段,此时网页呈现出空白状态,在服务器的响应没有完成前,用户不能做任何事情,这就是交互性差的原因,用户得不到立即反馈,因此感觉不同于桌面应用程序。
而AJAX使用XMLHttpRequest对象,对提交的请求进行幕后的处理,即网页不会出现闪烁、消失或者延迟,用户甚至不知道请求的发出。更棒的是,由于请求是异步发出的,你甚至可以不用等待服务器的响应,继续输入数据、滚动屏幕和使用应用程序。
最后,服务器将数据返回给前台javascript代码,后者决定如何处理这些数据。它可以迅速更新表单数据,让人感觉应用程序是立即完成的,表单没有提交或刷新而用户得到了新数据。结果就是类似于桌面应用程序的动态、快速响应、高交互性的体验,但是背后又拥有互联网的全部强大力量。
编写第一个AJAX程序
对于JAVA方向,AJAX的后台响应代码可以写在JSP页面里,也可以是一个servlet或者是struts框架中的action。

编写第一个AJAX程序(续)
在用户交互页面的script块中,创建XMLHttpRequest对象

编写第一个AJAX程序(续)
在用户交互页面的script块中,进行AJAX请求,注意回调函数ajaxCallback,在后面会进行定义。

编写第一个AJAX程序(续)
在用户交互页面的script块中,创建回调函数,对服务器发送来的响应信息进行处理。

HTTP 就绪状态
HTTP 就绪状态表示请求的状态或情形。它用于确定该请求是否已经开始、是否得到了响应或者请求/响应模型是否已经完成。它还可以帮助确定读取服务器提供的响应文本或数据是否安全。在 Ajax 应用程序中需要了解五种就绪状态:

HTTP 状态码
有可能服务器履行了请求(即 HTTP 就绪状态是 4)但是没有返回客户机预期的数据(例如找不到指定的页面)。因此除了就绪状态外,还需要检查 HTTP状态。我们期望的状态码是 200,它表示一切顺利。下表列出了几种常见的HTTP状态码

AJAX作业
设计一个注册表单,只要求输入账号和密码即可进行注册,要求当用户输入账号名重复时,马上显示一行“您注册的账号已存在,请重新输入”。