本文共 5389 字,大约阅读时间需要 17 分钟。
我们要做的是异步校验用户名的案例,很多网站上实现注册功能的时候,需要输入用户名,当光标离开文本框的时候,会给我们这样一个提示:显示用户名已经存在或者用户名可以使用!我们首先来看一下要做出来的效果:
搭建环境
新建一个动态Web项目,比如AjaxProject。
并在WebContent根目录下创建一个用户注册页面,即register.jsp。<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>Insert title here
用户名: | |
密码 | |
邮箱 | |
简介 | |
然后,在MySQL数据库中新建一个user数据库,并在该数据库中新建一个t_user表,表中记录类似如下:
由于建库建表语句非常简单,所以这里我就省略不写了。异步校验用户名
开发环境搭建好了之后,接下来我们就要编写程序,异步校验用户名了。
开发数据访问层(dao、dao.impl)
为了提升程序的数据库访问性能,我们通常应在项目开发中使用C3P0数据源。所以应在类目录下加入C3P0的配置文件:c3p0-config.xml。
c3p0-config.xml配置文件的内容如下:com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/user root liayun 10 30 100 10 200 50 100 50 1000 0 5 1 1 1 5 50
也是为了简化JDBC的开发,我们使用Apache组织提供的一个开源JDBC工具类库——commons-dbutils-1.4.jar。然后在com.meimeixia.util包下创建一个工具类——JDBCUtil02.java,用于读取C3P0的xml配置文件创建数据源,该工具类的具体代码如下:
package com.meimeixia.util;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.sql.DataSource;import com.mchange.v2.c3p0.ComboPooledDataSource;public class JDBCUtil02 { static ComboPooledDataSource dataSource = null; static { dataSource = new ComboPooledDataSource(); } public static DataSource getDataSource() { return dataSource; } /** * 获取连接对象 * @return * @throws SQLException */ public static Connection getConn() throws SQLException{ return dataSource.getConnection(); } /** * 释放资源 * @param conn * @param st * @param rs */ public static void release(Connection conn , Statement st , ResultSet rs){ closeRs(rs); closeSt(st); closeConn(conn); } public static void release(Connection conn , Statement st){ closeSt(st); closeConn(conn); } private static void closeRs(ResultSet rs){ try { if(rs != null){ rs.close(); } } catch (SQLException e) { e.printStackTrace(); }finally{ rs = null; } } private static void closeSt(Statement st){ try { if(st != null){ st.close(); } } catch (SQLException e) { e.printStackTrace(); }finally{ st = null; } } private static void closeConn(Connection conn){ try { if(conn != null){ conn.close(); } } catch (SQLException e) { e.printStackTrace(); }finally{ conn = null; } }}
准备好以上这些工作之后,我们正式步入开发数据库访问层的阶段。在com.meimeixia.dao包下创建一个UserDao接口,该接口的具体代码如下:
package com.meimeixia.dao;import java.sql.SQLException;public interface UserDao { /** * 用于检测用户名是否存在 * @param username * @return true:存在,false:不存在 */ boolean checkUsername(String username) throws SQLException; }
紧接着在com.meimeixia.dao.impl包中新建UserDao接口的实现类,即UserDaoImpl类,该实现类的代码如下:
package com.meimeixia.dao.impl;import java.sql.SQLException;import org.apache.commons.dbutils.QueryRunner;import org.apache.commons.dbutils.handlers.ScalarHandler;import com.meimeixia.dao.UserDao;import com.meimeixia.util.JDBCUtil02;public class UserDaoImpl implements UserDao { @Override public boolean checkUsername(String username) throws SQLException { QueryRunner runner = new QueryRunner(JDBCUtil02.getDataSource()); String sql = "select count(*) from t_user where username = ?"; Long result = (Long) runner.query(sql, new ScalarHandler(), username); return result > 0; }}
开发web层
当某人在用户注册页面填写用户信息进行注册时,键入用户名之后,会发送请求给服务器端,所以应将请求交给一个Servlet进行处理。于是,我们要在com.meimeixia.servlet中新建一个CheckUsernameServlet,用于校验用户名是否在数据库中已存在。
package com.meimeixia.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.meimeixia.dao.UserDao;import com.meimeixia.dao.impl.UserDaoImpl;public class CheckUsernameServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { //1. 检测是否存在 String name = request.getParameter("name"); System.out.println("name = " + name); UserDao dao = new UserDaoImpl(); boolean isExist = dao.checkUsername(name); //2. 通知页面,到底有还是没有 if (isExist) { response.getWriter().println(1);//存在该用户名 } else { response.getWriter().println(2);//不存在该用户名 } } catch (Exception e) { e.printStackTrace(); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}
这样,客户端发送请求的同时,不仅想传送一些数据,而且还想获取服务器端回送的数据,那么register.jsp页面的内容就要修改为:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>Insert title here
用户名: | |
密码 | |
邮箱 | |
简介 | |
如果文章有错的地方欢迎指正,大家互相交流。
转载地址:https://liayun.blog.csdn.net/article/details/95039427 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!