JavaWeb学习——Ajax学习

什么是Ajax?

AJAX全称为“Asynchronous JavaScript and XML”(异步JavaScript和XML),是一种创建交互式网页应用的网页开发技术。
不是一种新技术,是如下几种技术的组合应用

  • 基于web标准(standards-based presentation)XHTML+CSS的表示;
  • 使用 DOM(Document Object Model)进行动态显示及交互;
  • 使用 XML 和 XSLT 进行数据交换及相关操作;
  • 使用 XMLHttpRequest 进行异步数据查询、检索;
  • 使用 JavaScript 将所有的东西绑定在一起。

Ajax本质上是一个浏览器端的技术。

为什么学习Ajax?

  • 通过异步模式,提升了用户体验
  • 优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用
  • 现在几乎所有的B/S软件项目都会增加Ajax,从而提高用户体验度。最典型的应用:Google  Maps!

创建ajax程序的基本流程

  • 创建XMLHttpRequest对象
  • 使用XMLHttpRequest对象创建请求
  • 监视response的状态,写回调函数处理服务器返回的数据
  • 使用XMLHttpRequest对象发送请求

<%@ page language="java" import="java.util.*" 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 href="<%=basePath%>">
    
    <title>My JSP 'demo1.jsp' starting page</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">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <!-- 声明js代码域 -->
  <!-- 
  		Ajax学习:
  			1.ajax的概念:
  				局部刷新技术,不是一门新技术,而是多种技术的集合,是浏览器端的技术
  			2。ajax的作用
  				实现当前结果页面中响应其他请求的响应内容
  			3.ajax使用
  				ajax的基本流程
  					//创建ajax引擎
  						//复写readystatementChange函数
  							//判断ajax状态吗
  								//判断响应状态码
  									//获取响应信息(响应内容的格式)
  									//处理响应信息(js操作文档结构)
  					//发出请求
  				ajax的状态码
  					ajax的状态码 ReadyState:0 1 2 3 4 
  						4——表示响应内容被成功接受
  					响应状态码
  						status
  						200	OK
  						404	资源未找到
  						500	内部服务错误
  				ajax的异步同步
  					ajax.open(method,url,async)
  					async:设置同步代码块执行还是异步代码块执行
  						false	异步(默认)
  						true	同步
  
  
  
   -->
  <script type="text/javascript">
  		function getData(){
  			//创建引擎对象
	  		var ajax;
	  		if(window.XMLHttpRequest){   //火狐   基本现在高级浏览器都支持
	  			ajax = new XMLHttpRequest();
	  		}else{ 			//低版本ie
	  			ajax = new ActiveXObject("Msxm12.XMLHTTP");
	  		}
	  		//复写onreadystateChange函数————监听函数 (声明而不是调用)
	  		ajax.onreadystatechange = function(){
	  			//判断ajax的状态吗
	  			if(ajax.readyState == 4){
	  				//判断响应状态码
	  				if(ajax.status == 200){
	  					//获取响应内容
			  			var result = ajax.responseText;
			  			//获取元素对象
			  			var shadow = document.getElementById("t1");
			  			shadow.innerHTML = result;
			  			
	  				}else if(ajax.status == 404){
	  					var shadow = document.getElementById("t1");
	  					shadow.innerHTML = "业务繁忙1";
	  				}else if(ajax.status == 500){
	  					var shadow = document.getElementById("t1");
	  					shadow.innerHTML = "业务繁忙2";
	  				}else{
	  					var shadow = document.getElementById("t1");
	  					shadow.innerHTML = "业务繁忙2";
	  				}  			
	  			
	  			}else{
	  				//当我们数据因为各种各样原因延迟获取了我们可以给用户友好显示
	  				var shadow = document.getElementById("t1");
	  					shadow.innerHTML = "<img src='2.gif' width='200px' height='200px' />  ";
	  			
	  			}
	  		}
	  		//发送请求
			ajax.open("get","ajax",false);
			//发送数据    在火狐浏览器中如果没有数据必须为null
			ajax.send(null);
  
  		
  		}
  </script>
  
  <style type="text/css">
	#t1 {width: 200px;height: 200px;border: 1px solid;}  
  	
  </style>
  
  <body>
    <input type="button" onclick="getData()" value="按钮">
    <div id="t1"></div>
  </body>
</html>
package com.servlet;


import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;

//在web3.0后不用配置web就可以直接利用注解来实在url=pattern
//@WebServlet("/ajax")  
public class myAjax extends HttpServlet {

    @Override
    public void service(ServletRequest req, ServletResponse resp)
            throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");

        //模拟数据获取阻塞
        try {
	    Thread.sleep(3000);
	} catch (InterruptedException e) {
	    e.printStackTrace();
	}
        resp.getWriter().write("执手相看泪眼,竟无语凝噎");
        
        
        
    }
}

Ajax的俩种传参方式

  • Get方法
    • 直接通过url传参
    • 注意:get方式提交经常会遇到浏览器缓存问题,浏览器不对同样的url重复提交。这时可以在url后面增加参数:

      • ?rand = Math.random()   或者:rand = new Date();

  • Post方法

    • 需要设置参数解析格式
    • request.open(“post”,url);
      req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
      req.send("a=3&b=中国");  

      <%@ page language="java" import="java.util.*" 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 href="<%=basePath%>">
          
          <title>My JSP 'demo2.jsp' starting page</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">
      	<!--
      	<link rel="stylesheet" type="text/css" href="styles.css">
      	-->
      
        </head>
        
        <script type="text/javascript">
        		function getData(){
        			//创建引擎对象
      	  		var ajax;
      	  		if(window.XMLHttpRequest){   //火狐   基本现在高级浏览器都支持
      	  			ajax = new XMLHttpRequest();
      	  		}else{ 			//低版本ie
      	  			ajax = new ActiveXObject("Msxm12.XMLHTTP");
      	  		}
      	  		//复写onreadystateChange函数————监听函数
      	  		ajax.onreadystatechange = function(){
      	  			//判断ajax的状态吗
      	  			if(ajax.readyState == 4){
      	  				//判断响应状态码
      	  				if(ajax.status == 200){
      	  					//获取响应内容
      			  			var result = ajax.responseText;
      			  			//获取元素对象
      			  			var shadow = document.getElementById("t1");
      			  			shadow.innerHTML = result;	
      			  			
      	  				}
      	  			}
      	  		}
      	  		//发送请求
      /* 		  		//get    请求实体拼接在url后面
      				ajax.open("get","ajax?name=田坤&password=123456");
      				//发送数据    在火狐浏览器中如果没有数据必须为null
      				ajax.send(null); */
      				//post	请求需要单独的发送
      				ajax.open("post", "ajax");
      				//post方法需要设置解析格式		以下格式是以键值对的格式解析 	当然在form表单中也有
      				ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
      				ajax.send("name=田坤&password=123456");
      
        		}
        </script>
        
        <style type="text/css">
      	#t1 {width: 200px;height: 200px;border: 1px solid;}  
        	
        </style>
        
        <body>
          <input type="button" onclick="getData()" value="按钮">
          <div id="t1"></div>
          <!-- 解析编码格式 -->
          <form action="" enctype="application/x-www-form-urlencoded">
          
          </form>
        </body>
      </html>
      
      package com.servlet;
      
      
      import java.io.IOException;
      
      import javax.servlet.ServletException;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      
      //在web3.0后不用配置web就可以直接利用注解来实在url=pattern
      //@WebServlet("/ajax")  
      public class myAjax extends HttpServlet {
      
          @Override
          public void service(HttpServletRequest req, HttpServletResponse resp)
                  throws ServletException, IOException {
      	req.setCharacterEncoding("utf-8");
              resp.setContentType("text/html;charset=utf-8");
      
              String name = req.getParameter("name");
              String password = req.getParameter("password");
              System.out.println(name+"---"+password+"---"+req.getMethod());
              
              resp.getWriter().write("执手相看泪眼,竟无语凝噎");
      
              
          }
      }
      

Ajax接受数据的几种方式

  • 普通文本数据
    • req.responseText得到返回的文本数据
  • XML数据(testxml.jsp)
    • 暂时没学习,先空着
  • JSON(javascript object native)(重点)
<%@ page language="java" import="java.util.*" 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 href="<%=basePath%>">
    
    <title>My JSP 'selectHero.jsp' starting page</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">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  <script type="text/javascript">
  		function GetData(){
  			//获取参数信息
  			var heroname = document.getElementById("heroname").value;
  			if(heroname!=null){
  				//创建引擎对象
  				var ajax;
	  			if(window.XMLHttpRequest){
	  				ajax = new XMLHttpRequest();
	  			}else {
	  				ajax = new ActiveXObject("MSxml2.XMLHTTP");
	  			}
	  				
	  			//重写onreadystateChange函数
	  			ajax.onreadystatechange = function(){
	  				//判断ajax状态编码
	  				if(ajax.readyState == 4){
	  					//判断响应状态码
	  					if(ajax.status == 200){
	  					
	  					
	  						/*json(重点)
	  							其实就是将数据按照json的格式拼接好的字符串,方便使用eval()将接受的
	  							字符串数据直接转成JS对象
	  							
	  							json格式
	  							var 对象名={
	  								属性名:值,
	  								属性名:值,
	  								...
	  							}
	  						
	  						*/
	  						var result = ajax.responseText;
	  						eval("var hero="+result);
	  						
	  						//处理响应数据
	  							//获取table表格对象
	  							var tab = document.getElementById("tab");
	  							tab.innerHTML="";
	  							var tr = tab.insertRow(0);
	  							var cell0 = tr.insertCell(0);
	  							cell0.innerHTML="编号";
	  							var cell1 = tr.insertCell(1);
	  							cell1.innerHTML="名称";
	  							var cell2 = tr.insertCell(2);
	  							cell2.innerHTML="价格";
	  							var cell3 = tr.insertCell(3);
	  							cell3.innerHTML="简介";
	  							//插入新的行  及其数据
	  							var tr = tab.insertRow(1);
	  							var cell0 = tr.insertCell(0);
	  							cell0.innerHTML=hero.uid;
	  							var cell1 = tr.insertCell(1);
	  							cell1.innerHTML=hero.name;
	  							var cell2 = tr.insertCell(2);
	  							cell2.innerHTML=hero.price;
	  							var cell3 = tr.insertCell(3);
	  							cell3.innerHTML=hero.desc;
			  						
	  					}
	  				
	  				}

	  			}
	  			ajax.open("get", "hero?name="+heroname);
	  			ajax.send(null);
  			
  			}

  		}
  
  </script>
  
  <body>
    <h3>欢迎来到英雄商店</h3>
    <hr>
   	英雄名称:<input type="text" id="heroname" name="heroname" value=""/>
   	<input type="button" value="查询" onclick="GetData()"/>
    <hr>
    <table border="1px" id="tab">
    
    </table>
  </body>
</html>
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        //请求编码格式
	req.setCharacterEncoding("utf-8");
	//响应编码格式
	resp.setCharacterEncoding("utf-8");
	resp.setContentType("text/html;charset=utf-8");
	//获取请求数据
	String heroname = req.getParameter("name");
	//处理请求数据
	Hero hero = null;
	
	HeroService hs = new HeroServiceImpl();
	hero =  hs.getHeroInfo(heroname);
	
	//响应处理结果
	resp.getWriter().write(new Gson().toJson(hero));

    }

我们在通过ajax实现一个检验用户名是否存在的功能

<%@ page language="java" import="java.util.*" 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 href="<%=basePath%>">
    
    <title>My JSP 'user.jsp' starting page</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">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  <script type="text/javascript">
  		function CheckUsername(){
  			//获取用户名的信息
  			var uname = document.getElementById("uname").value;
  			if(uname!=null){
  				var ajax;
  				//创建ajax引擎
  				if(window.XMLHttpRequest){
  					ajax = new XMLHttpRequest();
  				}else{
					ajax = new ActiveXObject("MSxml2:XMLHTTP");  				
  				}
  				//重写readystatechange函数
  				ajax.onreadystatechange = function(){
  					//判断ajax的状态码
  					if(ajax.readyState == 4){
  						//判断响应的状态码
  						if(ajax.status == 200){
  							//处理响应数据
  							var result = ajax.responseText;
  							if(result == "true"){
  								alert("用户名已经存在");
  							}else if (result == "false"){
  								alert("可以使用该用户名");
  							}

  						}

  					}
  				}
  				
  				//发送请求
  				ajax.open("get", "cuser?uname="+uname);
  				ajax.send(null);

  			}
  		
  		}
  
  </script>
  <body>
    <!-- 实现一个检测用户名是否存在 -->
    <input type="text" id="uname" name ="uname" value="" placeHolder="用户名">
    <input type="button" value="检测用户名是否存在" onclick="CheckUsername()">
  </body>
</html>
package com.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.servlet.service.HeroService;
import com.servlet.service.impl.HeroServiceImpl;

public class CheckUsername extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        //请求编码格式
	req.setCharacterEncoding("utf-8");
	//响应编码格式
	resp.setContentType("text/html;charset=utf-8");
	//获取请求数据
	String uname = req.getParameter("uname");
	System.out.println(uname);
	//处理请求数据
		//获取业务层对象
		HeroService hs = new HeroServiceImpl();
		Boolean flag = hs.checkUsernameExist(uname);
	System.out.println(flag);
	String str = "";
	if(flag==true){
	    str = "true";
	}else
	    str = "false";
	    
	//返回处理数据结果
	resp.getWriter().write(str);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41965731/article/details/88966426