Таблицы данных JQuery с обработкой на стороне сервера в Spring (с Java и Thymeleaf)Jquery

Программирование на jquery
Ответить
Anonymous
 Таблицы данных JQuery с обработкой на стороне сервера в Spring (с Java и Thymeleaf)

Сообщение Anonymous »

У меня есть приложение Spring Boot, использующее Java и Thymeleaf. В нем у меня есть страница с таблицей данных JQuery. В этой таблице тысячи строк, поэтому, хотя сейчас я просто помещаю все это на страницу и позволяю JQuery полностью обрабатывать ее, я хочу переключиться на использование обработки ServerSide для разбиения по страницам, сортировки и т. д.

Я настроен делать это на серверной стороне, где я могу передавать начальный и конечный номер строки и динамически сортировать информацию для моего 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;
}

}
}
Итак, на моей HTML странице Thymeleaf у меня было следующее: (Версия 1)

Код: Выделить всё



Name
Social Security
Birthdate
Gender




[url=|javascript:openPersonDetail(]name[/url]
socialSecurity
birthdate
gender



Моя страница контроллер была очень простой и просто передавала полный список людей следующим образом: (Версия 1)

Код: Выделить всё

@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";
}
И, наконец, мой Javascript раньше имел следующее: (Версия 1)

Код: Выделить всё

$(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'
});
});
Это сработало, но я хотел переключить DataTable на использование обработки на стороне сервера, поэтому первым шагом было (1) изменить контроллер главной страницы, чтобы он прекратил добавлять список людей в модель, (2) создать новый контроллер, который будет возвращать мой ArrayList в формате JSON для DataTable для самостоятельного вызова, (3) изменить HTML-код главной страницы, чтобы он больше не предоставлял тег tbody DataTable и (4) изменить JavaScript, в котором создается таблица, для помещения данных в нее самостоятельно.

=======================================================

Это привело меня к версии 2 из следующих элементов.

Моя измененная HTML страница Thymeleaf: (Версия 2)

Код: Выделить всё



Name
Social Security
Birthdate
Gender



Моя измененная страница контроллер: (Версия 2)

Код: Выделить всё

@GetMapping("/ApplicationName/MyDataTablePage")
public String myDataTablePage(Model model) {

return "/pages/MyDataTablePage";
}
Мой новый контроллер DataTables:

Код: Выделить всё

@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
}
Мой измененный (гораздо более сложный) Javascript: (Версия 2)

Код: Выделить всё

$(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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Jquery»