A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

Ajax异步用户名校验一、案例介绍
在实际开发中,完成注册功能前,如果用户填写用户信息,准备填写其他信息时,将提示当前用户的用户名是否可用。效果图1、图2所示。
1:显示用户名不可用
2:显示用户名可用
二、相关知识2.1、AJAX原理介绍
Ajax“Asynchronous Javascript And XML”(异步JavaScript和XML)可以使网页实现异步更新,就是不重新加载整个网页的情况下,对网页的某部分进行更新(局部刷新)。传统的网页(不使用 AJAX)如果需要更新内容,必须重载整个网页页面。
AJAX 相当于是异步 JavaScript和XML的整合,是一种新的思想,整合之前的多种技术,用于创建快速交互式网页应用的网页开发技术。
2.2、AJAX原理分析
Ajax原理分析图解如图3所示。
3:Ajax原理分析图解
注解:
1.1使用JavaScript获得浏览器内置的AJAX引擎(XMLHttpRequest对象)
1.2通过AJAX引擎确定请求路径和请求参数
1.3通知AJAX引擎发送请求
AJAX引擎会在不刷新浏览器地址栏的情况下,发送请求
     2.1服务器获得请求参数
        2.2服务器处理请求参数(添加、查询等操作)
        2.3服务器响应数据给浏览器
AJAX引擎获得服务器响应的数据,通过执行JavaScript的回调函数将数据传递给浏览器页面。
        3.1通过设置给AJAX引擎的回调函数获得服务器响应的数据
        3.2使用JavaScript在指定的位置,显示响应数据,从而局部修改页面的数据,达到局部刷新目的。
2.3、JavaScript AJAX使用2.3.1、原生态JS操作Ajax步骤
1、获得Ajax引擎
2、设置回调函数
3、确定请求路径
4、发送请求
JavaScript ajax处理GET和POST请求有细微差异,接下来简单介绍,提供处理程序HelloServlet,并分别实现doGet和doPost两个方法。
1 <servlet>
2         <servlet-name>HelloServlet</servlet-name>
3         <servlet-class>cn.itcast.demo01.HelloServlet</servlet-class>
4 </servlet>
5 <servlet-mapping>
6         <servlet-name>HelloServlet</servlet-name>
7         <url-pattern>/helloServlet</url-pattern>
8 </servlet-mapping>
GET请求
步骤1:编写servletdoGet()方法获得数据,并发送响应数据
1 public void doGet(HttpServletRequest request, HttpServletResponse response)
2                 throws ServletException, IOException {
3         //1 获得数据
4         String username = request.getParameter("username");
5         String password = request.getParameter("password");
6         //2 处理
7         System.out.println(username + " : " + password);
8         //3 响应数据
9         response.getWriter().print("get success");
10 }
步骤2:在demo01.jsp提供按钮,点击发送get请求。(注意:只能谷歌或火狐浏览器使用)
1 <script type="text/javascript">
2         function sendGet(){
3                 //1 获得ajax引擎
4                 var xmlhttp = new XMLHttpRequest();
5                 //2 设置回调函数
6                 xmlhttp.onreadystatechange = function(){
7                         if(xmlhttp.readyState == 4){
8                                 if(xmlhttp.status == 200){
9                                         alert("响应数据" + xmlhttp.responseText);
10                                 }
11                         }
12                 };
13                 //3 确定请求方式、路径及参数
14                 xmlhttp.open("GET","/day15/helloServlet?username=jack&password=1234");
15                 //4 发送请求
16                 xmlhttp.send(null);
17         }
18 </script>
19 <input type="button" value="get请求"/> <br/>
POST请求
步骤1:编写servletdoPost()方法,用于接收数据和发送响应数据
1 public void doPost(HttpServletRequest request, HttpServletResponse response)
2 throws ServletException, IOException {
3         //0 处理乱码
4         request.setCharacterEncoding("UTF-8");
5         response.setContentType("text/html;charset=UTF-8");
6         //1 获得数据
7         String username = request.getParameter("username");
8         String password = request.getParameter("password");
9         //2 处理
10         System.out.println(username + " : " + password);
11         //3 响应数据
12         response.getWriter().print("post 成功");
13 }
步骤2:在demo01.jsp提供按钮,点击发送post请求。(注意:只能谷歌或火狐浏览器使用)
1 <script type="text/javascript">
2         function sendPost(){
3                 //1 获得ajax引擎
4                 var xmlhttp = new XMLHttpRequest();
5                 //2 设置回调函数
6                 xmlhttp.onreadystatechange = function(){
7                         if(xmlhttp.readyState == 4){
8                                 if(xmlhttp.status == 200){
9                                         alert("响应数据" + xmlhttp.responseText);
10                                 }
11                         }
12                 };
13                 //3 确定请求方式、路径及参数
14                 xmlhttp.open("POST","helloServlet");
15                 //4 设置请求编码
16                 xmlhttp.setRequestHeader
17 ("content-type","application/x-www-form-urlencoded");
18                 //5 发送请求
19                 xmlhttp.send("username=杰克&password=1234");
20         }
21 </script>
22 <input type="button" value="post请求"/> <br/>
XMLHttpRequest对象浏览器兼容
1 function getXMLhttp(){
2         var xmlhttp=null;
3         // 谷歌、火狐、IE最新浏览器
4         if (window.XMLHttpRequest){
5                 xmlhttp=new XMLHttpRequest();
6         }else if (window.ActiveXObject){
7                 //IE老版本浏览器(IE678 等)
8                 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
9         }
10 }
2.3.2JQueryAjax使用2.3.2.1$.post() post请求方式发送ajax
格式:jQuery.post(url, [data], [callback], [type])
        参数1:url,请求路径
        参数2:data,请求参数
        参数3:callback,回调函数
        参数4:type,返回内容格式,xml, html, script, json, text, _default。
                服务器响应编码为:application/json;charset=UTF-8,回调函数data类型是json对象
                服务器响应编码为:text/html;charset=UTF-8,回调函数data类型是字符串。
2.3.2.2$.get() get请求方式发送Ajax
除了请求方式不同,使用方式与$.post()完全一致。
测试:
1 <script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-1.11.3.min.js"></script>
2         <script type="text/javascript">
3                 $(function(){
4                         //get请求
5                         $("#getId").click(function(){
6                                 var url = "/day15/helloServlet";
7                                 var params = {
8                                         "username":"jack",
9                                         "password":"1234"
10                                 };
11                                 $.get(url,params,function(data){
12                                         alert(data);
13                                 });
14                                
15                         });
16                         //post请求
17                         $("#postId").click(function(){
18                                 var url = "helloServlet";
19                                 var params = {
20                                         "username":"杰克",
21                                         "password":"1234"
22                                 };
23                                 $.post(url,params,function(data){
24                                         alert(data);
25                                 });
26                         });
27                 });
28         </script>
三、案例分析
本案例是在浏览器上输入用户名,在数据库中进行查询,如果用户名存在,则提示“用户名不可使用”,如果用户名不存在,则提示“用户名可使用”。具体业务分析如图4所示。
4:案例分析图解
注解:
1、<input name=”username”>失去焦点时,使用$.post() 将用户名username以ajax方式发送给服务器
2、服务器获得用户名,并通过用户名查询用户
3、如果用户名存在,返回不可用提示
4、如果用户名可用,返回可用提示
5、根据服务器响应的json数据,控制提示信息的显示和提交的按钮是否可用。
四、案例实现4.1、服务器端程序
步骤1:编写servlet,获得用户名查询是否存在,并返回json数据。
1 public class UserCheckServlet extends HttpServlet {
2         public void doGet(HttpServletRequest request, HttpServletResponse response)
3                         throws ServletException, IOException {
4                 //编码
5                 request.setCharacterEncoding("UTF-8");
6                 response.setContentType("text/html;charset=UTF-8");
7                 // 获得用户名
8                 String username = request.getParameter("username");       
9                 // 查询是否存在
10                 UserService userService = new UserService();
11                 User user = userService.findByName(username);
12                 // 处理
13                 String jsonData = "";
14                 if(user != null){
15                         jsonData = "{\"message\":\"用户名不可用\",\"flag\":false}";
16                 } else {
17                         jsonData = "{\"message\":\"用户名可用\",\"flag\":true}";
18                 }
19                 response.getWriter().print(jsonData);       
20         }
步骤2:编写service
1 public class UserService {
2         /**
3          * 通过用户名查询
4          * @param username
5          * @return
6          */
7         public User findByName(String username) {
8                 UserDao userDao = new UserDao();
9                 return userDao.findByName(username);
10         }
11 }
步骤3:编写dao,提供findByName()方法
1 public class UserDao {
2         /**
3          * 通过用户名查询用户
4          * @param username
5          * @return
6          */
7         public User findByName(String username) {
8                 try {
9                         QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
10                         String sql = "select * from user where username = ?";
11                         Object[] params = {username};
12                         return queryRunner.query(sql, new BeanHandler<User>(User.class), params);
13                 } catch (Exception e) {
14                         throw new RuntimeException(e);
15                 }
16         }
17 }
4.2、浏览器JS
步骤1:修改提示信息显示区域
1 <input type="text"  id="username" name="username" placeholder="请输入用户名">
2                 <span id="showUsernameSpan"></span>
步骤2:编写js,当input失去焦点,发送ajax,并控制提示信息显示和按钮是否可用。
1 <script type="text/javascript">
2         $(function(){
3                 $("input[name='username']").blur(function(){
4                         //1 确定请求路径
5                         var url = "${pageContext.request.contextPath}/userCheckServlet";
6                         //2 确定请求参数
7                         var params = {"username":$(this).val()};
8                         //3 发送ajax请求
9                         $.post(url,params,function(data){
10                                 //4.1 给“提示显示”区域添加label样式
11                                 $("#showUsernameSpan").addClass("label");
12                                 if(data.flag){
13                                         //4.2 可用 ,添加success样式(bootstrap提供),并移除按钮禁用
14                                         $("#showUsernameSpan").addClass("label-success");
15                                         $("#showUsernameSpan").removeClass("label-danger");
16                                         $("#registButton").removeProp("disabled");
17                                 } else {
18                                         //4.3不可用,添加danger样式(bootstrap提供),并禁用按钮
19                                         $("#showUsernameSpan").addClass("label-danger");
20                                         $("#showUsernameSpan").removeClass("label-success");
21                                         $("#registButton").prop("disabled","disabled");
22                                 }
23                                 //4.4 设置提示信息
24                                 $("#showUsernameSpan").text(data.message);
25                         },"json");
26                 });
27         });
28 </script>

4 个回复

倒序浏览
回复 使用道具 举报
奈斯,很赞
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马