今天在用jsonp回调数据库操作返回的list封装成的json数据时,发现一直进不了回调函数,后面发现是servlet中没有把callback的内容封装进json,还是没有认真看底层代码的原因。
下面贴上代码:
servlet:
package cn.edu.control;
import java.util.List;
import java.io.Console;
import java.io.IOException;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.edu.Object.classes;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
/**
* Servlet implementation class Json
*/
public class json extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public json() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/json;character=utf-8");
try {
//创建Person对象,保存数据,如果有数据库的话,此处数据应该为从数据库中取出
classManager cl = new classManager();
List<classes> list = new ArrayList<classes>();
String callback = request.getParameter("callback");
cl.showClass(list);//数据库操作返回一个list对象数组
try {
//创建JsonArray对象,JSONArray则是[]包裹起来的一个数组(Array),此处调用方法将对象集合装入
JSONArray json = JSONArray.fromObject(list);
//JSONObject是一个{}包裹起来的一个对象(Object),此处希望以对象为单位进行操作,所以创建JSONObject对象
JSONObject jb = new JSONObject();
//将jsonArray对象装入
jb.put("person", json);
//输出Json数据,它就是一种特殊格式的字符串
response.getWriter().write(callback+"("+jb.toString()+")"); //这一步是关键少了callbcak就找不到回调函数
/*此处可以用另一种方式将数据装入Json,同样可以,只是前台接受的是JSONArray对象,是[]包裹起来的一个数组(Array)
*JSONArray jsonArray = new JSONArray();
*JSONObject jb = new JSONObject();
*jb.put("person", json);
*jsonArray.add(jb);
*response.getWriter().write(jsonArray.toString());
*/
} catch (IOException e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
index.jsp
<%@ 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 'index.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>
<body>
<div id="div"></div>
<table border="1" style="width:300px;height:200px;" id="table">
<tr id="tr" border="1">
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
</tr>
<tr border="1">
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
</tr>
</table>
<script type="text/javascript">
console.log("aaaaa");
function validate(sa){
console.log("aa");
var div=document.getElementById("div");
var table=document.getElementById("table");
div.innerHTML = sa;
var i = 0;
for ( var a in sa.person) {//获取有几个person
var count = 0;//计算person属性值的个数
i++;
for ( var item in sa.person[a]) {
count++;
var p = sa.person[a][item];//得到属性值的内容
table.rows[i - 1].cells[count - 1].innerHTML = p;//把内容填向table表格
}
}
}
</script>
<script src="json?callback=validate"></script>
</body>
</html>