• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Spring Thymelef paginacja i RequestParam

Object Storage Arubacloud
0 głosów
241 wizyt
pytanie zadane 27 lipca 2020 w Java przez newUser Użytkownik (520 p.)

Cześć,

piszę paginacje w Spring controllerze, potrzebuje dwóch parametrów Timestamp zeby wyswietic konkretne rekordy, wygląda na to że część backendowa działa dobrze, natomiast mam problem jak to wyświetlić w pliku html ponieważ teraz pojawia się strona 1 a jak kliknę na kolejną to wychodzi IlegalArgumentException - oczekuje Timestamp, a jeśli usune z th:ref argumenty start i end i zostanie same page, to też nie wyświetla mi sie nic a tylko pobiera pusty dokument.

    @GetMapping(value = "/getRecordsByPeriod")
    public String getRecordsByPeriod(@RequestParam("start") final String start,
                                     @RequestParam("end") final String end,
                                     @PageableDefault(size = 10) final Pageable pageable,
                                     final Model model) {
        final Page<FileRecord> page = dbService.getRecordsByPeriod(Timestamp.valueOf(start), Timestamp.valueOf(end), pageable);
        model.addAttribute("page", page);

        return "recordsByPeriod";
    }
<div class="pagination-div">
    <span th:if="${page.hasPrevious()}">
        <a th:href="@{/getRecordsByPeriod?start=${start}&end=${end}(page=${page.number-1},size=${page.size})}">Previous</a>
    </span>
    <th:block th:each="i: ${#numbers.sequence(0, page.totalPages - 1)}">
        <span th:if="${page.number == i}" class="selected">[[${i}+1]]</span>
        <span th:unless="${page.number == i}">
             <a th:href="@{/getRecordsByPeriod(start=${start},end=${end},page=${i},size=${page.size})}">[[${i}+1]]</a>
        </span>
    </th:block>
    <span th:if="${page.hasNext()}">
        <a th:href="@{/getRecordsByPeriod(start=${start},end=${end},page=${page.number+1},size=${page.size})}">Next</a>
    </span>
</div>

Z góry dziękuje za odpowiedz

 

 

komentarz 27 lipca 2020 przez mbabane Szeryf (79,280 p.)
A co teoretycznie ma robić kod frontendowy, bo jakoś nie mogę go zrozumieć?
komentarz 27 lipca 2020 przez newUser Użytkownik (520 p.)
Poprostu wyświetlać po 10 rekordów i żeby była możliwość przejścia na następna stronę z rekordami np jak jest 50 rekordów to 5 stron po 10. Działa tylko pierwsze 10 a jak klikam w następny to już nie
komentarz 27 lipca 2020 przez mbabane Szeryf (79,280 p.)
edycja 27 lipca 2020 przez mbabane

A co przesyłane jest za drugim (jak rozumiem niedziałającym) razem do zmiennych:

@RequestParam("start") final String start,
@RequestParam("end") final String end

zaloguj sobie, albo debug lub przeczytaj co jest w treści IllegalArgumentException.

komentarz 28 lipca 2020 przez newUser Użytkownik (520 p.)

Użyłem troche innego sposobu który działa ;p osobno filtruje i osobno robie paginacje.

    @GetMapping(value = "/showRecordsByPeriod/page/{page}")
    public ModelAndView getRecordsByPeriod(@PathVariable("page") final int page) {
        ModelAndView modelAndView = new ModelAndView("recordsByPeriod");
        PageRequest pageable = PageRequest.of(page - 1, 10);
        Page<FileRecord> recordPage = dbService.findPage(pageable);
        int totalPages = recordPage.getTotalPages();
        if(totalPages > 0) {
            List<Integer> pageNumbers = IntStream.rangeClosed(1,totalPages).boxed().collect(Collectors.toList());
            modelAndView.addObject("pageNumbers", pageNumbers);
        }
        modelAndView.addObject("activeRecordList", true);
        modelAndView.addObject("recordList", recordPage.getContent());
        return modelAndView;
    }

 

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org">
<body>
<div class="row" th:fragment="record-list" th:if="${recordList != null && !recordList.isEmpty()}">
    <div class="col-md-2"></div>
    <div class="col-md-8">
        <table id="link-list" class="table table-striped table-bordered" style="width:100%">
            <thead>
            <tr>
                <th>PRIMARY KEY</th>
                <th>NAME</th>
                <th>DESCRIPTION</th>
                <th>UPDATED TIMESTAMP</th>
            </tr>
            </thead>
            <tbody>
            <tr th:each="record : ${recordList}">
                <td th:text="${{record.primaryKey}}">1</td>
                <td th:text="${{record.name}}">http://thegame.org</td>
                <td th:text="${{record.description}}">PENDING</td>
                <td th:text="${{record.updatedTimestamp}}">PENDING</td>
            </tr>
            </tbody>
        </table>
    </div>
    <div class="col-md-2"></div>
</div>
<div class="row" th:fragment="pagination">
    <div class="col-md-2"></div>
    <div class="col-md-8">
        <nav aria-label="Pagination">
            <ul class="pagination justify-content-center">
                <li class="page-item" th:each="pageNumber : ${pageNumbers}" >
                    <a class="page-link" th:href="@{|/showRecordsByPeriod/page/${pageNumber}|}" th:text=${pageNumber}>1</a>
                </li>
            </ul>
        </nav>
    </div>
    <div class="col-md-2"></div>
</div>
</body>
</html>

 

komentarz 28 lipca 2020 przez newUser Użytkownik (520 p.)

Mam za to problem z przekierowaniem do tego url 

/showRecordsByPeriod/page/1

kiedy wywołuje metodę kontrolera to mapuje sie tak:

/showRecordsByPeriod?

           <form method="get" th:action="@{/showRecordsByPeriod}">
                    <button type="submit" class="btn btn-primary">Show filtered</button>
                    <br><br>
                </form>

rozumiem ze muszę dodać tutaj "/page/..." tyle ze nie wiem jak odnieść sie do wartości "page" z @PathVariable, lub wpisać tam odrazu wartość 1 (bo pozniej juz moge klikać po następnych stronach bez problemu

1
komentarz 28 lipca 2020 przez newUser Użytkownik (520 p.)

Ok problem solved ;p

    @GetMapping(value = "/showRecordsByPeriod/page/{page}")
    public ModelAndView getRecordsByPeriod(@RequestParam(value = "number", defaultValue = "1") final int number,
                                           @PathVariable("page") final int page) {
        int pageNumber = page > 1 ? page : number;
        ModelAndView modelAndView = new ModelAndView("recordsByPeriod");
        PageRequest pageable = PageRequest.of(pageNumber - 1, 10);
        Page<FileRecord> recordPage = dbService.findPage(pageable);
        int totalPages = recordPage.getTotalPages();
        if(totalPages > 0) {
            List<Integer> pageNumbers = IntStream.rangeClosed(1,totalPages).boxed().collect(Collectors.toList());
            modelAndView.addObject("pageNumbers", pageNumbers);
        }
        modelAndView.addObject("activeRecordList", true);
        modelAndView.addObject("recordList", recordPage.getContent());
        return modelAndView;
    }
        <form method="get" th:action="@{/showRecordsByPeriod/page/1}">
                    <button type="submit" class="btn btn-primary">Show filtered</button>
                    <br><br>
                </form>

 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
0 odpowiedzi 166 wizyt
0 głosów
1 odpowiedź 144 wizyt
pytanie zadane 16 kwietnia 2023 w Java przez mm Użytkownik (890 p.)

92,568 zapytań

141,420 odpowiedzi

319,617 komentarzy

61,954 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...