怎么使用ajax为 datatables 获取数据

怎么使用ajax为 datatables 获取数据,第1张

dataTables是一种很好用前端表格显示库。当加载大量数据时,可以用Ajax 获取数据来提高效率,增速网页加载速率。下面以一个例子作示范。

首先,需要下载jquery以及dataTables库。这里使用的是版本是jQuery v1.11.3和DataTables 1.10.9。下载网址:http://datatables.net/。

先上网页的代码。要注意的是,table中的thead和tbody必须要有。

[html] view plaincopy

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<meta http-equiv="Content-Type" content="text/htmlcharset=UTF-8">

<head>

<link href="http://www.zhuhaihengxin.com/libs/datatables/1.10.0/css/jquery.dataTables.css" rel="stylesheet">

<title>dataTable example</title>

<script type="text/javascript" src="jquery.js"></script>

<script type="text/javascript" src="jquery.dataTables.js"></script>

<script type="text/javascript">

$(document).ready(function() {

$("#datatable").dataTable({

"processing" : true,

"serverSide" : true,

"paginationType":"full_numbers",

"ajax" : "load",

"columns" : [

{"data" : "id"},

{"data" : "firstName"},

{"data" : "lastName"}

]

})

})

</script>

<style>

h2{

text-align:center

}

div {

float: left

margin: 10px

padding: 4px

}

a{

margin:5px

}

table,tr,td,th{

border:2px solid #3aec7b

border-collapse:collapse

}

</style>

</head>

<body>

<TABLE id="datatable">

<THEAD>

<tr>

<th>ID</th>

<th>First Name</th>

<th>Last Name</th>

</tr>

</THEAD>

<tbody>

</tbody>

</TABLE>

</body>

</html>

当网页加载的时候,ajax发出请求,如下所示。

[html] view plaincopy

draw=[1]

columns[0][data]=[id]

columns[0][name]=[]

columns[0][searchable]=[true]

columns[0][orderable]=[false]

columns[0][search][value]=[]

columns[0][search][regex]=[false]

columns[1][data]=[firstName]

columns[1][name]=[]

columns[1][searchable]=[true]

columns[1][orderable]=[true]

columns[1][search][value]=[]

columns[1][search][regex]=[false]

columns[2][data]=[lastName]

columns[2][name]=[]

columns[2][searchable]=[true]

columns[2][orderable]=[true]

columns[2][search][value]=[]

columns[2][search][regex]=[false]

order[0][column]=[0]

order[0][dir]=[asc]

start=[0]

length=[10]

search[value]=[]

search[regex]=[false]

_=[1441278114568]

其中,draw是请求的序号,start是数据的偏移量,length是需要返回的最大数据条数。search[value]是查找的值。

服务端采用java的servlet完成。为简单起见,这里直接采用继承HttpServlet的方式实现。数据本应该从数据库中提取,但这里为了

简单,生成了静态数据集合作为数据源。每次请求都从集合中查找匹配的数据,然后转换成JSON返回。JSON库采用阿里的fastjson。

代码如下所示。

[java] view plaincopy

package jspTest

import java.io.IOException

import java.util.ArrayList

import java.util.Arrays

import java.util.Enumeration

import java.util.LinkedList

import java.util.Random

import javax.servlet.ServletException

import javax.servlet.annotation.WebServlet

import javax.servlet.http.HttpServlet

import javax.servlet.http.HttpServletRequest

import javax.servlet.http.HttpServletResponse

import com.alibaba.fastjson.JSON

import com.alibaba.fastjson.JSONObject

import java.util.List

import java.util.Map

/**

* Servlet implementation class DataLoad

*/

public class DataLoad extends HttpServlet {

private static final long serialVersionUID = 1L

static class Person {

private long id

private String firstName

private String lastName

public long getId() {

return id

}

public void setId(long id) {

this.id = id

}

public String getFirstName() {

return firstName

}

public void setFirstName(String firstName) {

this.firstName = firstName

}

public String getLastName() {

return lastName

}

public void setLastName(String lastName) {

this.lastName = lastName

}

public boolean match(String pattern) {

return firstName.contains(pattern) || lastName.contains(pattern) || Long.toString(id).contains(pattern)

}

}

private static Random r = new Random()

private static List<Person>ps = new ArrayList<Person>()

static {

int size = 2512

for (int k = 0k <size++k)

ps.add(generatePerson())

}

static Person generatePerson() {

Person p = new Person()

p.setId(ps.size() + 1)

p.setFirstName(generateName())

p.setLastName(generateName())

return p

}

private static String generateName() {

StringBuilder sb = new StringBuilder()

sb.append((char) (r.nextInt(26) + 'A'))

int len = 2 + r.nextInt(4)

for (int k = 0k <len++k)

sb.append((char) (r.nextInt(26) + 'a'))

return sb.toString()

}

private List<Person>result

public List<Person>getResult(){

return result

}

/**

* @see HttpServlet#HttpServlet()

*/

public DataLoad() {

super()

}

/**

* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse

* response)

*/

protected void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

int start=0

int length=10

String pattern=""

String draw="1"

Map<String,String[]>params=request.getParameterMap()

for(String attr:params.keySet()){

String[] val=params.get(attr)

System.out.println(attr+"="+Arrays.toString(val))

if(attr.equals("start"))

start=Integer.parseInt(val[0])

if(attr.equals("length"))

length=Integer.parseInt(val[0])

if(attr.equals("search[value]"))

pattern=val[0]

if(attr.equals("draw"))

draw=val[0]

}

int total=filter(start, length, pattern)

JSONObject obj = new JSONObject()

obj.put("draw", draw)

obj.put("recordsTotal", ps.size())

obj.put("recordsFiltered", total)

System.out.println(obj.toJSONString())

obj.put("data", result)

response.getWriter().println(obj.toJSONString())

}

/**

* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse

* response)

*/

protected void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response)

}

private int filter(int start,int length,String pattern){

result=new LinkedList<Person>()

int total=0

for(Person s:ps){

if(!s.match(pattern))

continue

++total

if(start-->0)

continue

if(length--<=0)

continue

result.add(s)

}

return total

}

public static void main(String[] rags) {

System.out.println(JSON.toJSONString(ps))

DataLoad load=new DataLoad()

load.filter(0, 10, "")

System.out.println(JSON.toJSONString(load.getResult()))

load.filter(0, 10, "a")

System.out.println(JSON.toJSONString(load.getResult()))

load.filter(10, 10, "a")

System.out.println(JSON.toJSONString(load.getResult()))

load.filter(20, 10, "a")

System.out.println(JSON.toJSONString(load.getResult()))

}

}

服务端返回的JSON数据如下所示。其中draw是请求中的draw参数,data是表格中的数据。recordsFiltered是过滤后的数据总数,recordsTotal是原始数据总数。

[html] view plaincopy

{"recordsFiltered":2512,

"data":[{"firstName":"Bzf","id":1,"lastName":"Hazkm"},{"firstName":"Imxi","id":2,"lastName":"Oieb"},{"firstName":"Glyag","id":3,"lastName":"Gvqlf"},{"firstName":"Lwbhl","id":4,"lastName":"Fvvf"},{"firstName":"Audds","id":5,"lastName":"Seunp"},{"firstName":"Otbrq","id":6,"lastName":"Hnal"},{"firstName":"Loji","id":7,"lastName":"Qicn"},{"firstName":"Rjy","id":8,"lastName":"Emrygr"},{"firstName":"Gcglkd","id":9,"lastName":"Ldgrs"},{"firstName":"Txh","id":10,"lastName":"Qwe"}],

"draw":"1",

"recordsTotal":2512}

可能是你的dataTable下面的不参与排序的列序号不存在!找到dataTable下面的这个属性:

"aoColumnDefs": [

// 制定列不参与排序,从0开始,列序号用逗号隔开

{"aTargets":[0,5]}

]

我们据。首先我们需要打开一个联结,我们的数据库还是用上一节的吧:)string MyConnString = "Driver={Microsoft Access Driver (*.mdb)}DBQ=c:/test/test.mdb"string strComm = "select * from UserList"ADOConnection MyConnection = new ADOConnection(MyConnString)ADODataSetCommand MyComm = new ADODataSetCommand(strComm,MyConnection)这里我们为了讲解方便,只在DataSet存入一个表的内容:DataSet MyDataSet = new DataSet()MyComm.FillDataSet(MyDataSet,"UserList")此时我们就获得了一个拥有UserList表数据的DataSet。在讲解DataSet之前,我们还需要了解DataSet的结构下面是DataSet的结构树DataSet RelationsCollectionExtendedPropertiesTablesCollection DataTables RowsColumns其它由于我们研究的是DataTable,其它的我们暂时不管他们。一个DataSet中包含多个DataTable,一个DataTable又包含有多个Row,这就是我们 *** 作DataSet的基础啦:)添加数据添加一数据,从上面的列表中我们可以看出,其实就是添加一行Row,这里我们也来演示一下如何添加一行数据,我们程序一切以DataSet为顶点,呵呵,如果TablesCollection,RowsCollection下去的话,还有一些烦人的dt.AcceptChanges这些方法的调用,很烦人,还是一次搞定吧。DataRow dr=MyDataSet.Tables["UserList"].NewRow()dr["UserName"] = "周讯"dr["ReMark"] = "100"dr["Comment"] = "漂亮MM";MyDataSet.Tables.Rows.Add(dr)第一行,我们建立一个新的数据行,它用来储存我们新加入的数据。然后我们在这个数据行中加入我们需要的数据。dr["UserName"]表明是对UserName字段进行添加,你可以使用dr[1]来添加信息,但是这需要我们事先知道字段在数据表的位置,而且在不知道数据表结构的情况很难知道我们添加的数据的对应情况,所以还是用字段名为好。最后我们使用RowsCollection的Add方法,将我们新建这一行加入到数据表中。修改数据知道如何添加数据后,修改数据也是很简单的事情了.MyDataSet.Tables["UserList"].Rows[0]["UserName"]="飞刀大哥"这样我们就修改了第一行数据中的UserName字段。删除数据删除数据,主要是使用RowsCollection提供的Delete方法,看下面的程序也是很简单的事情啦:)MyDataSet.Tables["UserList"],Rows[0].Delete()这一行数据就已经被删除了。恢复数据有时候我们添加/修改数据会出现错误,这时候,就需要恢复原来的数据。下面的程序,显示如何判断是否有错误发生:if(MyDataSet.HasErrors){MyDataSet.RejectChanges()} 首先我们检查DataSet中是否有错误发生,如果有就使用RejectChanges()方法,恢复DataSet中的数据。注意这里恢复是在DataSet中所有表以及表中DataRow中的数据,也就是在此交次 *** 作的数据全部恢复。如果我们只需要恢复部分内容,我们可以使用DataTable或DataRow的RejectChanges(),这里就不详细讲解了,使用方法和DataSet一样,只是 *** 作的对像不同而已。探测DataSet是否有改动我们在将DataSet送交给数据库去保存去,我们需要看看这个DataSet是否已经被改动了。如果没有改动,我们也就没有必要去修改数据库了。if(MyDataSet.HasChanges){//保存}else{//不进行任何 *** 作}更新数据库我们上面的 *** 作,都只是针对DataSet的,没有 *** 作数据库,但是我们的目的还是要将数据保存到数据中去,所以我们这里就需要调用DataSetCommand的Update方法。下面的程序显示如何将DataSet的数据交给数据库。MyComm.Update(MyDataSet)很简单的一句,呵呵。这里要注意,如果一个DataSet中包含有多个表,而我们只更新一个,那我们就必须写明更新的数据表名:MyComm.Update(MyDataSet,"UserList")当Update方法被调用后,DataSetCommand会将数据库中的数据与DataSet中的数据相比较,对不相同的地方进行更新。对于DataSet的 *** 作,我们这里只讲这么多,其实DataSet的方法和属性有很多,功能也很全,我想现在这里的所讲的功能,对一般的 *** 作已经足够了。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9662244.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存