2013-01-14 2 views
6

Sto tentando di implementare l'impaginazione nella mia pagina JSP. Sto usando Spring MVC e Hibernate. La parte del codice Java è ok ma ho difficoltà ad implementarla nella mia pagina JSP. Sto usando twitter bootstrap.Implementare l'impaginazione nella pagina JSP in un'applicazione Spring MVC e Hibernate

Ecco quello che ho fatto fino ad ora:

<div class="container"> 
    <table class="table table-hover"> 
     <th>First Name</th> 
     <th>Last Name</th> 
     <th>Age</th> 
     <c:forEach items="${employees}" var="emp"> 
     <tr> 
      <td>${emp.firstName}</td> 
      <td>${emp.lastName}</td> 
      <td>${emp.Age}</td> 
     </tr> 
     </c:forEach> 
    </table> 

    <div class="pagination"> 
     <ul> 
      <li class="disabled"><a href="#">First</a></li> 
      <li class="disabled"><a href="#">Prev</a></li> 
      <li class="active"><a href="#">1</a></li> 
      <li class="active"><a href="#">2</a></li> 
      <li class="active"><a href="#">3</a></li> 
      <li class="active"><a href="#">4</a></li> 
      <li class="active"><a href="#">5</a></li> 
      <li class="active"><a href="#">Next</a></li> 
      <li class="active"><a href="#">Last</a></li> 
     </ul> 
    </div> 
</div> 

Questo è il codice correlato in mio controller:

@RequestMapping(value = "/list", method = RequestMethod.GET) 
    public String getEmployees(ModelMap model) { 
      **//I believe I should get the page number from the JSP here but how?** 
     model.addAttribute("employees", this.employeeService.getEmployees(page)); 
     return "listing"; 
} 

Questo è il relativo codice della mia classe di servizio:

public List<Employee> getEmployees(int page) { 
     return employeeDao.getEmployeeList(page); 
} 

Questo è il codice correlato nella mia classe DAO:

private static final int limitResultsPerPage = 3; 

public List<Employee> getEmployeeList(int page) { 
     Query q = sessionFactory.getCurrentSession().createQuery(
       "from Employee"); 
     q.setFirstResult(page * limitResultsPerPage); 
     q.setMaxResults(limitResultsPerPage); 
     return (List<Employee>) q.list(); 
} 

La pagina in cui io sono la visualizzazione quel tavolo è list.jsp

Ecco la mia ipotesi su che cosa devo fare, ma non so come (per favore correggetemi se sto prendendo la strada sbagliata):

Modifica il mio link che punta a list.jsp nel mio menu, a list.jsp? Page = 0, quindi ogni volta che l'utente clicca sul link, arriverà nella prima pagina.

Quando l'utente fa clic su uno dei pulsanti, devo passare il numero di pagina al mio controller in modo da poter restituire i "dipendenti" giusti con la mia query.

Come si può vedere, i pulsanti Primo e Precedente sono disattivati ​​come sono attualmente sulla prima pagina. Quindi la mia domanda è: come dovrei gestire l'attivazione/disattivazione di quei pulsanti, così come quelli Successivo e Ultimo?

Inoltre, come "aggiornare" i numeri nell'elenco? Ad esempio, se l'utente è alla pagina 20, non visualizzerò i pulsanti da 1 a 19?

risposta

6

Per rispondere a una delle domande almeno:

È possibile passare il numero di pagina e altri parametri dal JSP per il controller con l'annotazione RequestParam in questo modo:

@RequestMapping(value = "/list", method = RequestMethod.GET) 
    public String getEmployees(@RequestParam(value = "page", required = false) Long page, ModelMap model) { 
     //now page is available. 
    model.addAttribute("employees", this.employeeService.getEmployees(page)); 
    return "listing"; 
    } 

E il vostro collegamento sarà simile a questa:

list/?page=1 

paginazione è abbastanza complicata processo ma qui ci sono alcune idee. È possibile utilizzare JSTL nella pagina JSP per implementare la logica. Per esempio:

<c:if test="${page > 1}"> 
     <li class="active"><a href="#">First</a></li> 
    </c:if> 

io suggerisco di fare alcuni calcoli in azione per il numero di pagine che si desidera visualizzare. Supponiamo ad esempio che tu voglia visualizzare sempre dieci collegamenti. A pagina 1, verranno visualizzate le pagine 1 ... 10, a pagina 7 verranno visualizzate le pagine 2 ... 12 e così via. Nell'azione è possibile determinare la pagina iniziale e la pagina finale da visualizzare.

 int startpage = page - 5 > 0?page - 5:1; 
     int endpage = startpage + 10; 

Nella pagina JSP si può fare un ciclo forse:

<c:forEach begin="${startpage}" end="${endpage}" var="p"> 
     <a href="#">${p}</a> 
    </c:forEach> 

e così via.

+0

Grazie, ho seguito il tuo consiglio, nessun problema :) Do you sapere qual è la migliore pratica per gestire i pulsanti Primo, Precedente, Successivo e Ultimo? – dukable

+0

Grazie per l'aggiunta di ulteriori dettagli Vincent :) Ultima domanda, il nome del mio collegamento, che voglio essere il numero della pagina corrente utilizzando $ {pagina} non è interpretato, probabilmente manchi qualcosa:

  • ${page}">
  • dukable

    0

    La soluzione di Vincent Ramdhanie è corretta: grazie. Dukable: Ho usato questo codice basato sulla soluzione di Vincent Ramdhanie e funziona molto bene: qualcosa del genere dovrebbe funzionare nel tuo codice.

    @RequestMapping(value = "/list", method = RequestMethod.GET) 
    public String getEmployees(@RequestParam(value = "page", required = false) Long page, ModelMap model) { 
        //now page is available. 
    
        int startpage = (int) (page - 5 > 0?page - 5:1); 
        int endpage = startpage + 10; 
    
        model.addAttribute("employees", this.employeeService.getEmployees(page)); 
    
        model.addAttribute("startpage",startpage); 
        model.addAttribute("endpage",endpage); 
    
        return "listing"; 
    } 
    

    E nel tuo jsp:

    <div class="pagination"> 
        <ul> 
         <li><c:forEach begin="${startpage}" end="${endpage}" var="p"><a href="<c:url value="/list" ><c:param name="page" value="${p}"/>${p}</c:url>">${p}</a></c:forEach></li> 
        </ul> 
    </div> 
    

    È possibile accedere al vostro jsp in questo modo:

    http://localhost:8080/Project/list/?page=1