Mocking static methods (since 3.4.0) When using the inline mock maker, it is possible to mock static method invocations within the current thread and a user-defined scope. This way, Mockito assures that concurrently and sequentially running tests do not interfere. To make sure a static mock remains temporary, it is recommended to define the scope within a try-with-resources construct. In the following example, the Foo type’s static method would return foo unless mocked:
Due to the defined scope of the static mock, it returns to its original behavior once the scope is released. To define mock behavior and to verify static method invocations, use the MockedStatic that is returned.
<script> // // Pipelining function for DataTables. To be used to the `ajax` option of DataTables // $.fn.dataTable.pipeline = function ( opts ) { // Configuration options var conf = $.extend( { pages: 5, // number of pages to cache url: '', // script url data: null, // function or object with parameters to send to the server // matching how `ajax.data` works in DataTables method: 'GET'// Ajax HTTP method }, opts ); // Private variables for storing the cache var cacheLower = -1; var cacheUpper = null; var cacheLastRequest = null; var cacheLastJson = null; returnfunction ( request, drawCallback, settings ) { var ajax = false; var requestStart = request.start; var drawStart = request.start; var requestLength = request.length; var requestEnd = requestStart + requestLength; if ( settings.clearCache ) { // API requested that the cache be cleared ajax = true; settings.clearCache = false; } elseif ( cacheLower < 0 || requestStart < cacheLower || requestEnd > cacheUpper ) { // outside cached data - need to make a request ajax = true; } elseif ( JSON.stringify( request.order ) !== JSON.stringify( cacheLastRequest.order ) || JSON.stringify( request.columns ) !== JSON.stringify( cacheLastRequest.columns ) || JSON.stringify( request.search ) !== JSON.stringify( cacheLastRequest.search ) ) { // properties changed (ordering, columns, searching) ajax = true; } // Store the request for checking next time around cacheLastRequest = $.extend( true, {}, request ); if ( ajax ) { // Need data from the server if ( requestStart < cacheLower ) { requestStart = requestStart - (requestLength*(conf.pages-1)); if ( requestStart < 0 ) { requestStart = 0; } } cacheLower = requestStart; cacheUpper = requestStart + (requestLength * conf.pages); request.start = requestStart; request.length = requestLength*conf.pages; // Provide the same `data` options as DataTables. if ( typeof conf.data === 'function' ) { // As a function it is executed with the data object as an arg // for manipulation. If an object is returned, it is used as the // data object to submit var d = conf.data( request ); if ( d ) { $.extend( request, d ); } } elseif ( $.isPlainObject( conf.data ) ) { // As an object, the data given extends the default $.extend( request, conf.data ); } return $.ajax( { "type": conf.method, "url": conf.url, "data": request, "dataType": "json", "cache": false, "success": function ( json ) { cacheLastJson = $.extend(true, {}, json); if ( cacheLower != drawStart ) { json.data.splice( 0, drawStart-cacheLower ); } if ( requestLength >= -1 ) { json.data.splice( requestLength, json.data.length ); } drawCallback( json ); } } ); } else { json = $.extend( true, {}, cacheLastJson ); json.draw = request.draw; // Update the echo for each response json.data.splice( 0, requestStart-cacheLower ); json.data.splice( requestLength, json.data.length ); drawCallback(json); } } }; // Register an API method that will empty the pipelined data, forcing an Ajax // fetch on the next draw (i.e. `table.clearPipeline().draw()`) $.fn.dataTable.Api.register( 'clearPipeline()', function () { returnthis.iterator( 'table', function ( settings ) { settings.clearCache = true; } ); } ); // // DataTables initialisation // $(document).ready(function() { $('#myTable').DataTable( { processing: true, serverSide: true, columns: [ { title: "#", data: "id" }, { title: "Word", data: "word" }, { title: "Meaning", data: "meaning" }, { title: "Example", data: "example" } ], ajax: $.fn.dataTable.pipeline( { url: '/english/post/list.json', method: 'POST', pages: 3// number of pages to cache } ) } ); } ); </script>
代码解读:
serverSide: true 服务端处理模式
ajax 页面加载后,自动发起 POST 请求,得到 JSON 格式的响应,从 JSON 中获取元素 data 的值作为表格数据
另外需要注意的是,此模式下 API 请求的参数是 Form Data 形式,服务端处理时不是接收 json。例如 Spring Boot 可以通过 @RequestParam 接收参数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/** * 分页获取数据 * * @param draw Draw counter. * @param start Paging first record indicator. This is the start point in the current data set (0 index based - i.e. 0 is the first record). * @param length Number of records that the table can display in the current draw. * @return - */ @PostMapping("/post/list.json") @ResponseBody @ApiOperation(value = "分页获取数据") public DatatablesResult getList(@RequestParamint draw, @RequestParamint start, @RequestParamint length){ int pageNum = start / length; Page<EnglishWord> data = englishService.getList(pageNum, length); return DatatablesResult.success(draw, new PageInfo(data).getTotalElements(), new PageInfo(data).getTotalElements(), data.getContent()); }