Я настроен делать это на серверной стороне, где я могу передавать начальный и конечный номер строки и динамически сортировать информацию для моего SQL-запроса. Однако моя проблема в том, что я просто не могу точно понять, как DataTables пытается уведомить меня через контроллер, когда пользователь нажимает кнопку «Следующая страница» или кнопку сортировки. Где/как мой контроллер может получить эту информацию, чтобы я мог подключить ее к своему SQL-запросу и вернуть то, что необходимо?
Итак, допустим, у меня есть пример объекта, например «Человек».
Код: Выделить всё
public class Person {
private static String PERSON_IMAGE = "";
private static String PERSON_IMAGE_2 = "";
private String name;
private String socialSecurity;
private String birthdate;
private String gender;
private String personImage;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSocialSecurity() {
return socialSecurity;
}
public void setSocialSecurity(String socialSecurity) {
this.socialSecurity = socialSecurity;
}
public String getBirthdate() {
return birthdate;
}
public void setBirthdate(String birthdate) {
this.birthdate = birthdate;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getPersonImage() {
if(null != birthdate) {
return PERSON_IMAGE;
} else {
return PERSON_IMAGE_2;
}
}
}
Код: Выделить всё
Name
Social Security
Birthdate
Gender
[url=|javascript:openPersonDetail(]name[/url]
socialSecurity
birthdate
gender
Код: Выделить всё
@GetMapping("/ApplicationName/MyDataTablePage")
public String myDataTablePage(Model model) {
SearchCriteria searchCriteria = new SearchCriteria();
searchCriteria.setOrderByString("name");
searchCriteria.setUsePaging(false);
searchCriteria.setFIRST_NUMBER(null);
searchCriteria.setLAST_NUMBER(null);
model.addAttribute("peopleList", myMapperService.getPeople(searchCriteria)); //returns an ArrayList
return "/pages/MyDataTablePage";
}
Код: Выделить всё
$(document).ready(function() {
$('#myDataTable').DataTable({
"destroy" : true,
"scrollY" : 300,
"scrollCollapse" : true,
"paging" : true,
"autoWidth" : true,
"ordering" : true,
"searching" : false,
"order" : [ [ 0, 'asc' ] ],
"pageLength" : 20,
"lengthChange" : false,
"pagingType" : "full_numbers",
"dom" : 'rt'
});
});
=======================================================
Это привело меня к версии 2 из следующих элементов.
Моя измененная HTML страница Thymeleaf: (Версия 2)
Код: Выделить всё
Name
Social Security
Birthdate
Gender
Код: Выделить всё
@GetMapping("/ApplicationName/MyDataTablePage")
public String myDataTablePage(Model model) {
return "/pages/MyDataTablePage";
}
Код: Выделить всё
@RequestMapping(path = "/ApplicationName/Data/Person", method = RequestMethod.GET, produces = "application/json")
@ResponseBody
public List
getPersonData() {
System.out.println("I was called!");
SearchCriteria searchCriteria = new SearchCriteria();
searchCriteria.setOrderByString("name");
searchCriteria.setUsePaging(false);
searchCriteria.setFIRST_NUMBER(null);
searchCriteria.setLAST_NUMBER(null);
return myMapperService.getPeople(searchCriteria); //returns an ArrayList
}
Код: Выделить всё
$(document).ready(function () {
$('#myDataTable').DataTable({
'destroy' : true,
'serverSide' : true,
'sAjaxSource': '/ApplicationName/Data/Person',
'sAjaxDataProp': '',
'order': [ [ 0, 'asc' ] ],
'columns':
[
{ 'data': 'name',
'render': function(data, type, row, meta){
if(type === 'display'){
data = '[url=javascript:openPersonDetail(']' + data + '[/url]'
}
return data;
}
} ,
{ 'data': 'socialSecurity'} ,
{ 'data': 'birthdate'} ,
{ 'data': 'gender'}
],
'scrollY' : 300,
'scrollCollapse' : true,
'paging' : true,
'autoWidth' : true,
'ordering' : true,
'searching' : false,
'pageLength' : 20,
'lengthChange' : false,
'pagingType' : 'full_numbers',
'dom' : 'rt'
});
});
И это тоже работает. Особенно, если я удалю конфигурацию «'serverSide': true» - DataTable будет работать точно так же, как и до того, как я внес вышеуказанные изменения, но теперь он вызывает мой новый контроллер Data JSON вместо использования атрибута модели.
Проблема:
Однако, если в DataTable добавлена конфигурация «'serverSide': true», каждый раз, когда я перехожу на новую «страницу» таблицы, он каждый раз просто вызывает мой контроллер «/Clinic/Detail/Data/Patient».
Но мне нужны DataTables, чтобы передавать моему контроллеру информацию о том, какую страницу выбрал пользователь или по какому столбцу пользователь пытался отсортировать. Мне также нужно передать таблице (динамически) общее количество строк (количество), чтобы DataTables мог правильно настроить номера страниц для пользователя.
Отправляет ли DataTables какие-то дополнительные параметры моему контроллеру, которые я могу получить? Что-то вроде @PathVariable("что угодно")?
Я чувствую, что очень близок к тому, чтобы это заработало, но я застрял на этом этапе.
Буду очень признателен за любую помощь!
Подробнее здесь: https://stackoverflow.com/questions/556 ... -thymeleaf
Мобильная версия