ajax 加载json对象的实例

本文详细介绍了如何在Servlet中使用JSON数据交互,并通过AJAX实现异步请求与响应处理,包括返回文本与JSON数据的方法及在JavaScript中解析与展示JSON数据的实践。

对于json

从servlet中返回给ajax的dataType类型可以是text,json

1、在servlet中构造json文本,再response.getWriter()给ajax,返回json text文本

servlet中,一面一段写在doPost或doGet中,但要相互调用this.doGet(rq,rs)或this.doGet(rq,rs)

用jquery的ajax异步提交,数据必须有一个明确的ID(不再是name,和form提交方式不一样),比如下面jsp中的username就是ID


[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  2.                 response.setContentType("text/html;;charset=utf-8");//注意要是返回文本,那么类型为text/html  
  3.         String username1 = request.getParameter("username");  
  4.         String username = URLDecoder.decode(username1,"UTF-8");  
  5.         StringBuilder message = new StringBuilder("");  
  6.         if(username!=null)  
  7.         {  
  8.             EmployeeDao employeeDao = new EmployeeDao();  
  9.             ArrayList<Employee> employees = employeeDao.select(username);  
  10.               
  11.             if(employees!=null&&employees.size()>0)  
  12.             {  
  13.                  message.append("{\"emp\":[");  
  14. //              for(Employee employee: employees)  
  15. //              {  
  16.                  //对于这样的集合类型的数据,不推荐使用构造字符串的方式来构造json数组  
  17. //                  System.out.println(employee.getEmpNo());  
  18. //                  message.append("{\"eno\":"+employee.getEmpNo()+","+"\"ename\""+employee.getEname()+"}");  
  19. //              }  
  20.                  //为了说明构造json文本,仅使用2条记录  
  21.                  message.append("{\"eno\":"+"\""+employees.get(0).getEmpNo()+"\""+","+"\"ename\""+":"+"\""+employees.get(0).getEname()+"\""+"}");  
  22.                  message.append(",");  
  23.                  message.append("{\"eno\":"+"\""+employees.get(1).getEmpNo()+"\""+","+"\"ename\""+":"+"\""+employees.get(1).getEname()+"\""+"}");  
  24.                  message.append("]}");  
  25.             }  
  26.              PrintWriter out = response.getWriter();  
  27.              out.println(new String(message));  
  28.         }  
  29.           

在ajax中

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <%@ page language="java" contentType="text/html; charset=utf-8"  
  2.     pageEncoding="utf-8"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">  
  7. <title>Insert title here</title>  
  8. <script type="text/javascript" src="js/jquery-1.7.js"></script>  
  9.   
  10.   
  11. <script type="text/javascript">  
  12. function check(){  
  13.     var resultNode = $("#result");  
  14.     var username = $("#username").val();  
  15.       
  16.     $.ajax({  
  17.         url:"ShowEmp_ajax_json2",  
  18.         type:"POST",  
  19.         data:{username:username},  
  20.         dataType:"text",  
  21.         success:function(data){  
  22.             //转换成jquery对象  
  23.             var s = "<table border='1' width='100' height='100'>";  
  24. //          若servlet中采用构造的json语句,jsp返回datatype类型为text  
  25.             var obj = eval("("+data+")");  
  26.                        //这里需要用eval函数,eval() 函数使用的是 JavaScript 编译器,可解析 JSON 文本,然后生成 JavaScript 对象。必须把文本包围在括号中,这样才能避免语法错误:  
  27.             alert(obj);  
  28.             $.each(obj.emp,function(index,element){  
  29.                 alert(element.ename);  
  30.             })  
  31.               
  32.             //遍历方法二或者  
  33.             $(obj.emp).each(function(index){//注意function写法不一样  
  34.                 alert(obj.emp[index].eno);  
  35.             });  
  36.               
  37.             //错误写法  
  38.             $(obj).each(function(index){//这样遍历的是obj,obj是根据得到的整条text转换而来,因为只有一个obj,所以index的都是0,obj.emp[index].eno得到的是emp中第0个对象的数据  
  39.                 alert(obj.emp[index].eno);  
  40.             });  
  41.             s += "</table>";  
  42.             $("#result").html(s);  
  43.               
  44.         }  
  45.     });  
  46. }  
  47. </script>  
  48. </head>  
  49. <body>  
  50.     输入用户名<input type="text" id="username"    />  
  51.     <input type="button" value="查找" onclick="check()" />  
  52.     <div id="result" ></div>  
  53. </body>  
  54. </html>  

2、用字符串构造json数据,返回json对象

servlet中返回application/json

ajax中dateType用json


servlet代码,和上面没有什么区别,主要是把contentype改为application/json

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  2.         response.setContentType("application/json;charset=utf-8");  
  3.         String username1 = request.getParameter("username");  
  4.         String username = URLDecoder.decode(username1,"UTF-8");  
  5.         StringBuilder message = new StringBuilder("");  
  6.           
  7.         if(username!=null)  
  8.         {  
  9.             EmployeeDao employeeDao = new EmployeeDao();  
  10.             ArrayList<Employee> employees = employeeDao.select(username);  
  11.               
  12.             if(employees!=null&&employees.size()>0)  
  13.             {  
  14.                  message.append("{\"emp\":[");  
  15. //              for(Employee employee: employees)  
  16. //              {  
  17.                  //对于这样的集合类型的数据,不推荐使用构造字符串的方式来构造json数组  
  18. //                  System.out.println(employee.getEmpNo());  
  19. //                  message.append("{\"eno\":"+employee.getEmpNo()+","+"\"ename\""+employee.getEname()+"}");  
  20. //                    
  21. //              }  
  22.                  //为了说明构造json文本,仅使用2条记录  
  23.                  message.append("{\"eno\":"+"\""+employees.get(0).getEmpNo()+"\""+","+"\"ename\""+":"+"\""+employees.get(0).getEname()+"\""+"}");  
  24.                  message.append(",");  
  25.                  message.append("{\"eno\":"+"\""+employees.get(1).getEmpNo()+"\""+","+"\"ename\""+":"+"\""+employees.get(1).getEname()+"\""+"}");  
  26.                    
  27.                  message.append("]}");  
  28.             }  
  29.                  System.out.println(message);  
  30.                  PrintWriter out = response.getWriter();  
  31.                  out.println(new String(message));  
  32.                   
  33.         }  
  34.           
  35.           
  36.     }  
 

jsp中代码

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <%@ page language="java" contentType="text/html; charset=utf-8"  
  2.     pageEncoding="utf-8"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">  
  7. <title>Insert title here</title>  
  8. <script type="text/javascript" src="js/jquery-1.7.js"></script>  
  9. <script type="text/javascript">  
  10. function check(){  
  11.     var resultNode = $("#result");  
  12.     var username = $("#username").val();  
  13.     $.ajax({  
  14.         url:"ShowEmp_ajax_json2",  
  15.         type:"POST",  
  16.         data:{username:username},  
  17.         dataType:"json",//注意此时这里是json  
  18.         success:function(data){  
  19.             //转换成jquery对象  
  20.             var s = "<table border='1' width='100' height='100'>";  
  21. //          //若servlet中采用构造的json语句,jsp返回类型dataType为json对象  
  22.             //写法一、  
  23.             $.each(data.emp,function(index,element){//element是data.emp json数组之中的数据  
  24. //                  alert(element.eno);  
  25.                     s+="<tr>";  
  26.                     s += "<td>"+element.eno+"</td>";  
  27.                     s += "<td>"+element.ename+"</td>";  
  28.                     s+="</tr>";  
  29.             });  
  30.             //写法二、  
  31.             $(data.emp).each(function(index){//将data.emp转换成jquery对象遍历  
  32.                 alert(data.emp[index].eno);  
  33.             });   
  34.             s += "</table>";  
  35.             $("#result").html(s);  
  36.         }  
  37.     });  
  38. }  
  39. </script>  
  40. </head>  
  41. <body>  
  42.     输入用户名<input type="text" id="username"    />  
  43.     <input type="button" value="查找" onclick="check()" />  
  44.     <div id="result" ></div>  
  45. </body>  
  46. </html>  


3、返回json对象,但是在servlet中直接用把一个数组或集合转换成为json类型的数组对象

如果抛出 NestableRuntimeException异常,

 说明没有导包,注意导入相关的jar包

commons-beanutils-1.8.3

commons-lang-2.6 (注:导入最新的 3.1 版本会继续报如下错误)

commons-collections-3.2.1

commons-logging-1.1.1

ezmorph-1.0.6

参考:http://blog.youkuaiyun.com/wugewuge/article/details/8074272

在servlet写法

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  2.         response.setContentType("application/json;charset=utf-8");  
  3.         String username1 = request.getParameter("username");  
  4.         String username = URLDecoder.decode(username1,"UTF-8");  
  5.         StringBuilder message = new StringBuilder("");  
  6.           
  7.         if(username!=null)  
  8.         {  
  9.             EmployeeDao employeeDao = new EmployeeDao();  
  10.             ArrayList<Employee> employees = employeeDao.select(username);  
  11.              JSONArray jsonArray=JSONArray.fromObject(employees);  
  12.              PrintWriter out = response.getWriter();  
  13.              out.println(jsonArray.toString());//在jsp中的数据类型dataType:"json"  
  14.                   
  15.         }  
  16.           
  17.           
  18.     }  

在jsp中

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <%@ page language="java" contentType="text/html; charset=utf-8"  
  2.     pageEncoding="utf-8"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">  
  7. <title>Insert title here</title>  
  8. <script type="text/javascript" src="js/jquery-1.7.js"></script>  
  9. <script type="text/javascript">  
  10. function check(){  
  11.     var resultNode = $("#result");  
  12.     var username = $("#username").val();  
  13.     $.ajax({  
  14.         url:"ShowEmp_ajax_json2",  
  15.         type:"POST",  
  16.         data:{username:username},  
  17.         dataType:"json",//注意此时这里是json  
  18.         success:function(data){  
  19.             //转换成jquery对象  
  20.             var s = "<table border='1' width='100' height='100'>";  
  21.             //若servlet中要是用   
  22. //          JSONArray jsonArray=JSONArray.fromObject(employees);  
  23. //          out.println(jsonArray.toString())  
  24. //          这样的形式返回json对象,那么将相当于返回了一个json数组,  
  25. //          类似这样[{"eno":"7369","ename":"SMITH"},{"eno":"7499","ename":"ALLEN"}],  
  26. //          而不是这样{"emp":[{"eno":"7369","ename":"SMITH"},{"eno":"7499","ename":"ALLEN"}]}  
  27. //          这样在jsp中就可以直接遍历data这个json数组,不需要再转换,也不需要用data.emp(本身在servlet转换过来的也没有emp),  
  28.   
  29. //          servlet中的contentType为application/json   jsp中dataType为json  
  30.               
  31.             $.each(data,function(index,element){  
  32. //              alert(element.empNo+element.ename);  
  33.                 s+="<tr>";  
  34.                 s += "<td>"+element.empNo+"</td>";  
  35.                 s += "<td>"+element.ename+"</td>";  
  36.                 s += "<td>"+element.job+"</td>";  
  37.                 s += "<td>"+element.mgr+"</td>";  
  38.                 s += "<td>"+element.date+"</td>";  
  39.                 s += "<td>"+element.sal+"</td>";  
  40.                 s += "<td>"+element.comm+"</td>";  
  41.                 s += "<td>"+element.deptNo+"</td>";  
  42.                 s+="</tr>";  
  43.             });  
  44.             s += "</table>";  
  45.             $("#result").html(s);  
  46.         }  
  47.     });  
  48. }  
  49. </script>  
  50. </head>  
  51. <body>  
  52.     输入用户名<input type="text" id="username"    />  
  53.     <input type="button" value="查找" onclick="check()" />  
  54.     <div id="result" ></div>  
  55. </body>  
  56. </html>  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值