我是DataTables jQuery插件的新手。在发现IE 8的Javascript性能问题后,我决定更改使用DataTables进行服务器端处理的方式。当我的JSP加载时(我正在使用Spring 3),我收到此错误消息:
DataTables warning (table id = 'results_table'): Requested unknown parameter '0' from the data source for row 0
我在Google周围搜索,发现导致该错误消息的许多原因都归结为格式错误的JSON,因此我找到了一种从Spring 3控制器函数输出JSON的方法,以查看其生成的JSON,并更改了代码以将其转换为非常接近DataTables网站所说的外观。
仍然没有喜悦,仍然收到该错误消息。
我为DataTables找到的服务器端处理示例不包含用于指定客户端使用的列的代码,因此我假设我不需要它。可以吗
这是我的results.jsp的相关部分:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head> <title>ACME: search results in a nice DataTables.net Plugin</title> </head> <body> <link rel="stylesheet" type="text/css" href="css/jquery.dataTables.css" /> <script language = "JavaScript" type = "text/javascript" src = "../nsd/js/jquery-1.7.js"></script> <script language = "JavaScript" type = "text/javascript" src = "../nsd/js/jquery.dataTables.js"></script> <script type="text/javascript"> $(document).ready(function() { $('#results_table').dataTable( { "bProcessing": true, "bServerSide": true, "sScrollX": "600px", "sServerMethod": "POST", "sAjaxSource": "/acme/resultstable", } ); } ); </script> <form id="command" name="f" action="employee" method="post"> <div id = "results"> <table id = "results_table"> <thead> <tr> <th> </th> <th>ID</th> <th>NO_PRINT</th> <th>Full Name</th> <th>Email Address</th> <th>Phone Number</th> <th>Organization</th> <th>Organization Code</th> <th>Position</th> <th>Employee Type</th> </tr> </thead> <tbody> </tbody> </table> </body> </html>
这是我一直发送给它的JSON响应:
{ "sEcho" : 1, "iTotalRecords" : 1, "iTotalDisplayRecords" : 1, "aaData" : [ { "person_id" : "888888", "ID" : "999999", "no_print" : " ", "fullname" : "Obama, Willard", "email_address" : "<a href = \"mailto:barry@whitehouse.gov\">barry@whitehouse.gov</a>", "current_phone_number" : "303-867-5309", "title" : " ", "office" : " ", "position" : "Contractor", "empl_code" : "CONT" } ] }
这是我用来通过Jackson发送JSON响应的Spring控制器函数。这包括用于输出JSON的代码,因此我可以看到它的外观。它输出到stdout的JSON和我发送回DataTables的JSON是否可能不同?
@RequestMapping(value = "/resultstable", method = RequestMethod.POST) public @ResponseBody LinkedHashMap resultstable(ModelMap model, HttpSession session, @RequestParam (required=true) int sEcho, @RequestParam (required=true) int iDisplayStart, @RequestParam (required=true) int iDisplayLength, @RequestParam (required=true) int iColumns, @RequestParam (required=true) int iSortCol_0, @RequestParam (required=false)String sSortDir_0, @RequestParam (required=true) String sSearch ) { /* ********************************************************************** ** These come from the DataTables.net Jquery plugin on results.jsp ********************************************************************** ** sEcho, - just send it back, used by DataTables for synching ** iDisplayStart - index of the record to start with, ie 3 for the 3rd of 100 records ** iDisplayLength - number of records to send back starting with iDisplayStart ** iColumns - number of columns to be displayed in the table ** iSortCol_0 - the number of thee column to be sorted on ** sSortDir_0 - direction of sorting: asc or desc ** sSearch - from the search box, filter results further on this term ********************************************************************** */ String nextView = "results"; String usertype = (String)session.getAttribute("usertype"); Search search = new Search(usertype); List<LinkedHashMap> records = null; String results = null; int number_of_records = (Integer)session.getAttribute("number_of_records_found"); ResultsView rv = new ResultsView(); ResultsScreenTableHolder rstrh = null; SearchScreenDataHolder ssdh2 = (SearchScreenDataHolder)session.getAttribute("search_screen_data_holder"); ObjectMapper mapper = new ObjectMapper(); logger.debug("started"); logger.debug("sEcho, == " + sEcho ); logger.debug("iDisplayStart == " + iDisplayStart ); logger.debug("iDisplayLength == " + iDisplayLength ); logger.debug("iColumns == " + iColumns ); logger.debug("iSortCol_0 == " + iSortCol_0 ); logger.debug("sSortDir_0 == " + sSortDir_0 ); logger.debug("sSearch == " + sSearch ); try { records = search.searchForAnEmployee(ssdh2,usertype,sSearch,"asc", iSortCol_0,iDisplayStart, iDisplayLength); LinkedHashMap lhm= new java.util.LinkedHashMap(); lhm.put("sEcho", sEcho); lhm.put("iTotalRecords",number_of_records); lhm.put("iTotalDisplayRecords",9); lhm.put("aaData",records); // convert user object to json string, and save to a file mapper.writeValue(new File("c:\\Downloads\\rstrh.json.txt"), lhm); // display to console logger.debug("My JSON: " + mapper.defaultPrettyPrintingWriter().writeValueAsString(lhm)); } catch (Exception e) { logger.debug("\n",e); } return lhm; }// end function
今天早上我遇到了同样的问题。您需要具有aoColumns参数并在其中使用mDataProp As:
aoColumns
mDataProp
https://gist.github.com/1660712
至少它解决了我的问题。