Как изменить значение параметра функции в JSP, чтобы заменить способ сортировки
У меня есть такой фрагмент кода, я хотел бы изменить способ сортировки (сейчас это sortByTime), но например, я хочу изменить на sortByTitle или sortById, как я могу это сделать?
Класс существует с некоторыми методами сортировки (добавлю лишь метод 1 для краткости)
public final class ListEntitySort {
private static Comparator<Entity> compareByStartTime = Comparator.comparing(Entity::time);
public static List<Event> sortByTime(List<Event> events) {
events.sort(compareByStartTime);
return events;
}
... more
}
Для сортировки в JSP странице я использую function.tld:
<?xml version="1.0" encoding="UTF-8" ?>
<taglib
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<tlib-version>1.0</tlib-version>
<short-name>Entity_Functions</short-name>
<uri>ua.com.example</uri>
<function>
<name>sortByTime</name>
<function-class>ua.com.example.web.command.functions.ListEntitySort</function-class>
<function-signature>java.util.List sortByTime(java.util.List)</function-signature>
</function>
<function>
<name>formatLocalDateTime</name>
<function-class>ua.com.example.web.command.functions.Dates</function-class>
<function-signature>java.lang.String formatLocalDateTime(java.time.LocalDateTime, java.lang.String)
</function-signature>
</function>
</taglib>
Что я делаю в сервлете єто получаю list и потом добавляю в сессию атрибут чтобы вывести на JSP странице
List<Entity> entities = someService.getListEntities();
request.setAttribute("entities", entities);
<c:forEach var="entity" items="${p:sortByTime(entities)}">
<tr>
<td>${entity.id}</td>
<td>${entity.title}</td>
<td>${entity.description}</td>
<td>${entity.location}</td>
<td>${p:formatLocalDateTime(entity.time, 'dd-MM-yyyy HH:mm')}</td>
<td>
</tr>
Мои варианты:
Вероятно, создайте флаг, который отправит метод сортировки сервлету и изменит параметр метода сортировки для каждого.
Или может добавить скриплет в JSP и там как то прописать <%%>,
или в JSP сделать что-нибудь с тегом <c:if> через JSTL.
<c:if test="${check the way of sorting }">
put here for each
</c:if>
Ответы (1 шт):
Вы можете добавить параметр для изменения критерия
<function>
<name>sortBy</name>
<function-class>ua.com.example.web.command.functions.ListEntitySort</function-class>
<function-signature>java.util.List sortBy(java.util.List, java.lang.String)</function-signature>
</function>
Тогда в JSP можно использовать параметр URL
<c:forEach var="entity" items="${p:sortBy(entities, param.sortBy)}">
<tr>
<td>${entity.id}</td>
<td>${entity.title}</td>
<td>${entity.description}</td>
<td>${entity.location}</td>
<td>${p:formatLocalDateTime(entity.time, 'dd-MM-yyyy HH:mm')}</td>
<td>
</tr>
</c:forEach>
Теперь поменять метод сортировки
public final class ListEntitySort {
private static Comparator<Entity> compareByStartTime = Comparator.comparing(Entity::time);
public static List<Event> sortBy(List<Event> events, String sortBy) {
switch (sortBy) {
case "time":
events.sort(compareByStartTime);
break;
case ... more
}
return events;
}
... more
}