Ajax中传参问题、JSON对象处理问题,jquery对ajax的支持和一些函数的使用

1.前端获取输入框内容的两种小思想

  1.1 使用jQuery插件采用给输入框加入标签标识id号的方式进行定位。

<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" >
	function sendAjax(val) {
		alert($('#acc_no').val());
	}	
</script>
</head>
<body>
	<form >
		账号:<input type="text" id="acc_no" onblur="sendAjax()">
	</form>
</body>

1.2 使用传参的思想

<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" >
	function sendAjax(val) {
		alert(val);
	}	
</script>
</head>
<body>
	<form >
		账号:<input type="text" onblur="sendAjax(this.value)">
	</form>
</body>

1.3不使用jQuery插件使用document属性。

2.ajax中传参问题

2.1get传参

url 后面通过问号 拼接参数 如: login.do?a=va&b=vb

例子:

再发送ajax函数中
function sendAjax(val) {
		//alert($('#acc_no').val());
		//alert(val);
		var xhr = createXHR();
		//准备发送请求
		xhr.open('get', 'CheckAccNo.do?acc_no='+val, true);
		xhr.onreadystatechange=function(){
			if(xhr.readyState==4 && xhr.status ==200){
				var text = xhr.responseText;
				$('#sp1').html(text);
			}
		};
		//发送请求
		xhr.send(null);
	}	
servlet中
response.setContentType("text/html;charset=utf-8");
		String acc_no = request.getParameter("acc_no");
		PrintWriter pWriter = response.getWriter();
		if ("abc".equals(acc_no)) {
			pWriter.write("账号可用");
		} else {
			pWriter.write("账号不可用");
		}
		pWriter.close();

 

2.2post传参

 url 后面通过问号 拼接参数 如: login.do?a=va&b=vb
          更推荐 使用 send 进行参数传递  send传递时需要设置请求头  来对数据进行编码

     xhr.open('post', 'CheckAccNo.do', true);
     xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded');
     xhr.send('acc_no='+val);    

3.AJAX + JSON  (AJAJ)


  3.1 什么JSON


     JavaScript  Object  Notation   JS对象通知类型 
          它是JS中的一种 按照 {"key":value,"key":value} 格式 


  3.2 JSON 字符串 


     '{"key":value,"key":value}'
     java 中的JSON字符串 
     "{\"key\":value,\"key\":value}"
     java 中 JSON对象数组字符串 
     "[{\"key\":value,\"key\":value},{\"key\":value,\"key\":value},
     {\"key\":value,\"key\":value}]"


  3.3 在java语言中如何把 JAVA对象 转换成JSON字符串 
     

     XdlUser  ----     
     List<XdlUser>  ----
          借助第三方jar包  把java对象转换成 JSON字符串 
     JSONObject.fromObject(java对象).toString(); 
          JSON对象数组转JSON字符串 
     JSONArray.fromObject(java对象).toString();    


  3.4 JS 中如何把JSON字符串 转换成JSON对象 
     

为了方便提取字符串中的数据  要把 JSON字符串转换成 JSON对象 
   eval('(' + JSON字符串 + ')')    
   JSON.parse(JSON字符串);
  
  3.5 写一个servlet 可以把 银行账户对象的信息 以 JSON字符串返回 。
  写一个jsp 页面  页面上有一个按钮 和  标签元素  当点击按钮时 发送
  ajax请求  把返回数据的账号 显示到 标签元素上。

@WebServlet("/account.do")
public class XdlBankAccountServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    protected void service(HttpServletRequest request, HttpServletResponse response) throws     
     ServletException, IOException {
		    //使用随机数构建一个银行账户对象
		    Random random = new Random();
		    response.setContentType("text/html;charset=utf-8");
   		    XdlBankAccount account = new XdlBankAccount(random.nextInt(100),         
     "李"+random.nextInt(100),
		    ""+random.nextInt(1000), random.nextInt()*165.3);
		    //使用第三方jar包把account变成json字符串
		    String jsonStr = JSONObject.fromObject(account).toString();
		    System.out.println("jsonStr=" + jsonStr);
		    PrintWriter pw = response.getWriter();
		    pw.write(jsonStr);
		    pw.close();
	}
}
//jsp中ajax发送函数。主要注意json字符串转成json对象!!!!
function sendAjax2() {
		//alert($('#acc_no').val());
		//alert(val);
		var xhr = createXHR();
		//准备发送请求
		xhr.open('post', 'account.do', true);
		xhr.onreadystatechange=function(){
			if(xhr.readyState==4 && xhr.status ==200){
				var text = xhr.responseText;
				//将json字符串转换成JSON对象
				text = JSON.parse(text);
				$('#sp2').html(text.acc_no);
			}
		};
		//发送请求
		xhr.send(null);
	}	

//标签元素(返回一个元素)
		<input type="button" onclick="sendAjax2()" value="点击进行ajax请求">
		<span id="sp2"></span><br>


  
  3.6 写一个servlet 可以把 银行账户对象的列表信息 以 JSON字符串返回 。
  写一个jsp 页面  页面上有一个按钮 和  table元素  当点击按钮时 发送
  ajax请求  把返回数据显示到表格中。

这个例子与前面那个例子的不同之处在于,上一个操作的数据是单个的,这个是一个数组。

要注意的小坑是:1.servlet中将JSON对象数组转JSON字符串 的操作。2.如何把每个JSON对象变成表格的一行

3.如何清空原来的数据。(jquery的选择器)

 

@WebServlet("/accountlist.do")
public class XdlBankAccountListServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		List<XdlBankAccount> accounts = new ArrayList<XdlBankAccount>();
		Random random = new Random();
		for (int i = 1; i < 10; i++) {
			XdlBankAccount account = new XdlBankAccount(random.nextInt(1000), "acc_"+random.nextInt(1000),
					"123", random.nextInt(1000)*1.85);
			accounts.add(account);
		}
                //将JSON对象数组转JSON字符串 
		String accountliststr = JSONArray.fromObject(accounts).toString();
		System.out.println(accountliststr);
		PrintWriter pw = response.getWriter();
		pw.write(accountliststr);
		pw.close();
	}
//主要操作的是多个数据
function sendAJAX3(){
		var xhr = createXHR();
		xhr.open('post', 'accountlist.do', true);
		//注册数据处理函数
		xhr.onreadystatechange=function(){
			if (xhr.readyState==4 && xhr.status==200) {
				//清空原来的数据
				$("#datas tr:gt(0)").remove();
				//获取返回的JSON字符串
				var text = xhr.responseText;
				//把返回的JSON对象数组字符串转换JSON对象数组
				var objs = JSON.parse(text);
				//把每个json对象 变成表格的一行
				for (var i = 0; i < objs.length; i++) {
					var obj = objs[i];
					var trStr = "<tr><td>"+obj.id+"</td><td>"+obj.acc_no+"</td><td>"+
					obj.acc_password+"</td><td>"+obj.money+"</td></tr>";
					//追加到表格对象上
					$("#datas").append($(trStr));
				}
			}
		};
		//发送
		xhr.send(null);
	}
<form >
		<input type="button" onclick="sendAJAX3()" value="点击进行ajax请求">
		<table id="datas">
			<tr><td>ID</td><td>ACC_NO</td>
			<td>ACC_PASSWORD</td><td>MONEY</td></tr>		
		</table>
</form>

 4.ajax 中的常见的问题 


  4.1 乱码问题 


     get方式在tomcat8 中虽然没有乱码问题  但是 IE浏览器地址栏不允许有中文
     如果传递中文参数  则需要转码 encodeURI(中文参数)
     
     post方式的乱码 和之前的处理方式 相同 
     request.setCharacterEncoding("utf-8"); 


   4.2 缓存问题


     4.2.1 出现的原因


     不同的浏览器  对同一个get请求 处理的方式不同,谷歌和火狐这些浏览器  会重新的
   发送请求。IE 浏览器不会再次发送这个请求 而是把上次的结果直接返回使用。
   如果返回的数据是动态的 则IE浏览器会出现问题


    4.2.2 如何解决


       把 get  换成 post
       可以通过拼接参数的方式 来改变url  
       xhr.open('get','account.do?r='+Math.random(),true);
       xhr.open('get','account.do?r='+new Date().getTime(),true);    

5. jquery 对ajax 的支持 


   5.1 做了哪些支持 


    ajax请求对象的创建发送和响应都做了相应的封装同时还考虑了浏览器的兼容问题。


   5.2 jquery中对ajax支持的函数 


   $.ajax({key:value,key:value,key:value});

例子:一个简单的函数完成了使用jquery发送ajax请求

function sendRandom(){
		var name = $("#name").val();
		$.ajax({
			url:'randomvalue.do',
			type:'post',
			cache:false,
			success:function(txt){
				$("#sp1").html(txt);
			},
			data:{name:name},
			error:function(){
				$("#sp1").html('请求失败');
			}
		});
	}

 ajax 函数中的参数  
       url: 请求的地址  string 类型 
       type: 请求的方式  string 类型
       success:数据处理函数  直接写参数 代表返回的数据 
       cache: 是否缓存   默认是true  写成false 不缓存
       async:是否异步  默认是 true  
       data:{key:value,key:value}  也可以使用 'name=' + name 推荐使用前面的方式 
       error: 错误处理函数 
       dataType: 默认数据返回文本  如果是json 则需要指定成 "json"   

关于dataType的例子:单个数据的操作 

记住再servlet中:String jsonStr = JSONObject.fromObject(account).toString()

                             servlet书写与上面XdlBankAccountServlet相同

<script type="text/javascript">
	function sendAjax() {
		$.ajax({
			url:"account.do",
			type:"post",
			success:function(obj){
				$("#sp1").html(obj.acc_no);
			},
			dataType:"json"
		});
	}
</script>

操作多个json对象

                          servlet书写与上面XdlBankAccountListServlet相同,表格表单同上。

<script type="text/javascript">
	function sendAJAX3() {
		$.ajax({
			url:"accountlist.do",
			type:"post",
			success:function(objs){
				//清空原来的数据
				$("#datas tr:gt(0)").remove();
				//把每个json对象 变成表格的一行
				for (var i = 0; i < objs.length; i++) {
					var obj = objs[i];
					var trStr = "<tr><td>"+obj.id+"</td><td>"+obj.acc_no+"</td><td>"+
					obj.acc_password+"</td><td>"+obj.money+"</td></tr>";
					//追加到表格对象上
					$("#datas").append($(trStr));
				}
			},
			dataType:"json"
		});
	}
</script>

  5.3jquery 中对ajax 支持的其它函数 


      $.get(url,data,success,dataType);
      $.post(url,data,success,dataType); 
      $.getJSON(url,data,success);
      jquery对象.load(url);  直接发出ajax请求 并把数据放入对应的jquery对象中
           可以完成数据的获取并显示  还可以完成页面加载
   页面加载三种方式:

1。第一种方式放在<body>标签前面的<script标签中>
 $(function(){
		$.ajax({
			url:"randomvalue.do",
			type:"post",
			success:function(txt){
				$("#sp1").html(txt);
			}
		});
	}); 
2.放在<body>标签前面的<script>标签中
$(function(){
		$("#sp1").load("randomvalue.do");
	});
3.放在<body>标签的后面的<script>中
<script type="text/javascript">
	$("#sp1").load("randomvalue.do");
</script>

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值