martedì 10 aprile 2012

Display Table tornare indietro su lista dati paginata

Utilizzando display tag spesso ci si imbatte in questo scenario.
Abbiamo una lista di dati paginata e linkata, quindi cliccando su un elemento si accede ad un dettaglio su un’altra pagina e da questa pagina si vuole tornare indietro esattamente nella lista paginata di partenza (es si era a pagina 3 di 4 e si vuole tornare esattamente lì e non alla pagina iniziale).
La display table di dispay tag utilizza un identificatore univoco per tabella sia per la paginazione che per l’ordinamento.
Tale identificatore è visibile in querystring quando si naviga da una pagina all’altra.
Sono possibili quindi 2 approcci.

Soluzione 1

Si prende nota dell’identificatore generato dalla display-table.
Quindi nella jsp di partenza (nella griglia di dati), si inserisce un codice di questo tipo:

<% String numPag=request.getParameter("d-49653-p")==null?"1":request.getParameter("d-49653-p");
   session.setAttribute("numPag", numPag);
%>


In modo che ad ogni paginazione il valore del numero di pagina sia salvato in sessione prendendolo dalla request.

Sulla jsp di destinazione avremo invece:

<a href="index.jsp?d-49653-p=${numPag}">Indietro</a>

Soluzione 2

In questo caso si realizza un filtro http che provvede ad analizzare la queryString e quando trova una espressione che identifica l’indicatore di pagina della display table mette in sessione il valore.
Quindi la jsp di partenza non avrà nessun codice particolare, la jsp di destinazione invece sarà uguale a quella vista nella soluzione 1.
Il filtro http invece avrà il seguente codice nel metodo doFilter.


public void doFilter(ServletRequest request, ServletResponse response,
                                   FilterChain chain) throws IOException, ServletException {
                        HttpServletRequest req = (HttpServletRequest) request;

                        String query_string = req.getQueryString();
                        if (null != query_string && query_string.length() > 0) {
                                   Pattern p = Pattern.compile("d-\\d*-p=(\\d*)");
                                   Matcher m = p.matcher(query_string);
                                   if (m.find()) {
                                               String val = m.group(1);

                                               req.getSession().setAttribute("numPag", val);

                                   }

                        }

                        chain.doFilter(request, response);
            }

La regular expression indicata in grassetto intercetta tutti i paramentri costituiti da una struttura del tipo d-[numeri]-p=[numeroPagina] e consentirà di intercettare quindi tutti i flag di paginazione di qualunque display table.
In questo modo quindi si evita di toccare ogni jsp annotando mettendo esplicitamente in sessione il valore della paginazione (anche se di tale valore bisogna comunque prendere nota per mostrarlo sulla jsp di arrivo alla pressione del tasto indietro).

Nessun commento:

Posta un commento