English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Basé sur SpringMVC+Bootstrap+Implementation de la pagination serveur et de la recherche floue pour DataTables

Préambule

Basé sur SpringMVC+Bootstrap+DataTables réalise la pagination côté serveur des tableaux de données, la recherche floue (non DataTable Search), et l'actualisation asynchrone de la page.

Remarque : le tag sp:message utilise l'internationalisation de SpringMVC

effet

tableau DataTable

Recherche de mots-clés

Recherche de mots-clés personnalisée, non DataTable Search

code

code HTML

code des conditions de recherche

<!-- recherche, ajout, suppression en lot, exportation, actualisation -->
<div class="row-fluid">
<div class="pull-right">
<div class="btn-group">
<button type="button" class="btn btn-primary btn-sm" id="btn-add">
<i class="fa fa-plus"></i> <sp:message code="sys.add"/>
</button>
<button type="button" class="btn btn-primary btn-sm" id="btn-delAll">
<i class="fa fa-remove"></i> <sp:message code="sys.delAll"/>
</button>
<button type="button" class="btn btn-primary btn-sm" id="btn-export">
<i class="fa fa-sign-in"></i> <sp:message code="sys.export"/>
</button>
<button type="button" class="btn btn-primary btn-sm" id="btn-re">
<i class="fa fa-refresh"></i> <sp:message code="sys.refresh"/>
</button>
</div>
</div>
<div class="row">
<form id="queryForm" action="<%=path%>/goodsType/method="post">
<div class="col"}-xs-2">
<input type="text" id="keyword" name="keyword" class="form-control input-sm"
placeholder="<sp:message code="sys.keyword"/>">
</div>
<button type="button" class="btn btn-primary btn-sm" id="btn-query">
<i class="fa fa-search"></i> <sp:message code="sys.query"/>
</button>
</form>
</div>
</div>

Code du tableau des données

<table id="dataTable" class="table table-striped table-bordered table-hover table-condensed" align="center">
<thead>
<tr class="info">
<td><input type="checkbox" id="checkAll"></td>
<th><sp:message code="sys.no"/></th>
<th><sp:message code="goods.type.name.cn"/></th>
<th><sp:message code="goods.type.name.en"/></th>
<th><sp:message code="sys.create.time"/></th>
<th><sp:message code="sys.update.time"/></th>
<th><sp:message code="sys.oper"/></th>
</tr>
</thead>
</table>

Code JS

Initialisation DataTables, requête de données serveur, encapsulation des conditions de recherche

<!-- page script -->
<script>
$(function () {
//Ajouter, modifier l'adresse de soumission asynchrone
var url = "";
var tables = $("#dataTable").dataTable({
serverSide: true,//Placer la pagination, la récupération des données, etc. sur le serveur
processing: true,//Lors du chargement des données, affiche-t-on "En cours de chargement" ?
pageLength: 10, //nombre de lignes de données à charger pour la première fois
ordering: false, //les opérations de tri sont effectuées sur le serveur, donc vous pouvez les désactiver.
pagingType: "full_numbers",
autoWidth: false,
stateSave: true,//conserver l'état de pagination, utilisez-le avec comTable.fnDraw(false);
searching: false,//désactiver la recherche de datatables
ajax: { 

url: "<%=path%>/goodsType/getData",
dataSrc: "data",
data: function (d) {
var param = {};
param.draw = d.draw;
param.start = d.start;
param.length = d.length;
var formData = $("#queryForm").serializeArray();//sérialiser les données du form en tableau
formData.forEach(function (e) {
param[e.name] = e.value;
});
return param;//paramètres personnalisés à transmettre.
},
},
columns: [//correspondant à la séquence dans thead
{"data": null,"width":"10px"},
{"data": null},
{"data": 'typeNameCn' },
{"data": 'typeNameEn' },
{"data": 'createTime', 
"render":function(data,type,full,callback) {
return data.substr(0,19) 
}
},
{"data": 'updateTime', defaultContent: "", 
"render":function(data,type,full,callback) {
if(data != null && data != ""){
return data.substr(0,19) 
}
return data;
}
}
},
{"data": null,"width":"60px"}
],
//boutons d'opération
columnDefs: [
{
targets: 0,
defaultContent: "<input type='checkbox' name='checkList'>"
},
{
targets: -1,
defaultContent: "<div class='btn"-group'>"+
""+
""+
"
" } ], language: { lengthMenu: "", processing: "", paginate: { previous: "<", next: ">", first: "<<", last: ">>" }, zeroRecords: "", info: "", infoEmpty: "", infoFiltered: "", sSearch: ":", }, //在每次table被draw完后回调函数 fnDrawCallback: function(){ var api = this.api(); //获取到本页开始的条数    var startIndex= api.context[0]._iDisplayStart;    api.column(1).nodes().each(function(cell, i) {      cell.innerHTML = startIndex + i + 1;    }); } }); //查询按钮 $("#btn-query").on("click", function () { tables.fnDraw();//查询后不需要保持分页状态,回首页 }); //添加 $("#btn-add").on("click", function () { url = "<%=path%>/goodsType/add"; $("input[name=typeId]").val(0); $("input[name=typeNameCn]").val(""); $("input[name=typeNameEn]").val(""); $("#editModal").modal("show"); }); //批量删除 $("#btn-delAll").on("click", function () { }); // $("#btn-export\ }); //Rafraîchir $("#btn-re").on("click", function () { tables.fnDraw(false);//rafraîchir_les_etats_des_pages }); //sélectionner_tout_les_cases $("#checkAll").on("click", function () { if ($(this).prop("checked") === true) { $("input[name='checkList']").prop("checked", $(this).prop("checked")); //$("#dataTable tbody tr").addClass('selected'); $(this).hasClass('selected') } else { $("input[name='checkList']").prop("checked", false); $("#dataTable tbody tr").removeClass('selected'); } }); //modifier $("#dataTable tbody").on("click", "#editRow", function () { var data = tables.api().row($(this).parents("tr")).data(); $("input[name=typeId]").val(data.typeIdStr); $("input[name=typeNameCn]").val(data.typeNameCn); url = "<%=path%>/goodsType/mise_a_jour"; $("#editModal").modal("show"); }); $("#btn-submit").on("click", function(){ $.ajax({ cache: false, type: "POST", url: url, data:$("#editForm").serialize(), async: false, error: function(request) { showFail("Erreur de connexion au serveur..."); }, success: function(data) { if(data.status == 1{ $("#editModal").modal("hide"); showSuccess("<sp:message code='sys.oper.success'/"> tables.fnDraw(); } /"> } } }); }); //supprimer $("#dataTable tbody").on("click", "#delRow", function () { var data = tables.api().row($(this).parents("tr")).data(); if(confirm("Est-ce que vous confirmez la suppression de cette information?")){ $.ajax({ url:'<%=path%>/goodsType/del/"+data.typeIdStr, type:'delete', dataType: "json", cache: "false", success:function(data){ if(data.status == 1{ showSuccess("<sp:message code='sys.oper.success'/"> tables.api().row().remove().draw(false); } /"> } }, error:function(err){ showFail("Erreur de connexion au serveur..."); } }); } }); }); </script>

Code Java

Méthode de traitement du contrôleur, responsable de la recherche de données de tableau de page, formatage du Json et retour.

@RequestMapping(value="/goodsType/getData", produces = "text/json;charset=UTF-8")
@ResponseBody
public String getData(HttpServletRequest request, QueryCondition query) {
DatatablesView<GoodsType> dataTable = goodsTypeService.getGoodsTypeByCondition(query);
dataTable.setDraw(query.getDraw());
String data = JSON.toJSONString(dataTable);
return data;
}

Format du Json retourné

{
"data": [{
"createTime": "2016-10-27 09:42:28.0",
"typeId": 96824775296417986,
"typeIdStr": "96824775296417986",
"typeNameCn": "食品",
"typeNameEn": "Foods",
"updateTime": "2016-10-28 13:00:24.0"
},
{
"createTime": "2016-10-27 09:42:27.0",
"typeId": 96824775296417979,
"typeIdStr": "96824775296417979",
"typeNameCn": "汽车"
"typeNameEn": "Cars123",
"updateTime": "2016-10-27 09:51:24.0"
}],
"draw": 1,
"recordsFiltered": 17,
"recordsTotal": 17
}

DatatablesView, définissant le format nécessaire selon DataTables

public class DatatablesView<T> { 
private List<T> data; //data correspond à "dataSrc" chargé par datatales 
private int recordsTotal; 
private int recordsFiltered; 
private int draw;
public DatatablesView() { 
}
public int getDraw() {
return draw;
}
public void setDraw(int draw) {
this.draw = draw;
}
public List<T> getData() {
return data;
}
public void setData(List<T> data) {
this.data = data;
}
public int getRecordsTotal() {
return recordsTotal;
}
public void setRecordsTotal(int recordsTotal) {
this.recordsTotal = recordsTotal;
this.recordsFiltered = recordsTotal;
}
public int getRecordsFiltered() {
return recordsFiltered;
}
public void setRecordsFiltered(int recordsFiltered) {
this.recordsFiltered = recordsFiltered;
} 
}

Classe de service de traitement des affaires, principalement basée sur les conditions de recherche pour estimer le nombre d'enregistrements, rechercher la liste des données de la page actuelle

public DatatablesView<GoodsType> getGoodsTypeByCondition(QueryCondition query) {
DatatablesView<GoodsType> dataView = new DatatablesView<GoodsType>();
//Construire les conditions de recherche
WherePrams where = goodsTypeDao.structureConditon(query);
Long count = goodsTypeDao.count(where);
List<GoodsType> list = goodsTypeDao.list(where);
dataView.setRecordsTotal(count.intValue());
dataView.setData(list);
return dataView;
}

La couche Dao est l'opération de recherche de base de données, voici la suppression...

Fin

Les conditions de recherche utilisent ici uniquement la recherche floue des mots-clés. Selon les besoins du business, d'autres conditions de recherche peuvent être ajoutées dynamiquement. Le backend doit effectuer le traitement correspondant.

Ce que j'ai décrit ici est un tutoriel basé sur SpringMVC+Bootstrap+DataTables réalise la pagination et la recherche floue du serveur des tableaux, j'espère que cela pourrait être utile à tout le monde. Si vous avez des questions, n'hésitez pas à laisser un message, l'éditeur vous répondra rapidement !

Déclaration : le contenu de cet article est hébergé sur Internet et appartient aux auteurs originaux. Le contenu est contribué et téléchargé par les utilisateurs d'Internet. Le site Web ne détient pas de droits de propriété, n'a pas été édité par l'homme et n'assume aucune responsabilité juridique connexe. Si vous trouvez du contenu suspect en matière de droits d'auteur, veuillez envoyer un e-mail à notice#w3Pour signaler une violation, veuillez envoyer un e-mail à codebox.com (remplacez # par @) et fournir des preuves pertinentes. Si les violations sont confirmées, le site supprimera immédiatement le contenu suspect.

Vous pourriez aussi aimer