mercoledì 13 giugno 2012

Lista con checkbox paginata (con decorator)

Utilizzando display table 1.2 è possibile utilizzare un apposito decorator, org.displaytag.decorator.CheckboxTableDecorator, per garantire una navigazione mantenendo le checkbox selezionate.
Il link con la documentazione (piuttosto scarna a dire il vero) è presente qui.
Praticamente ad ogni click sulla paginazione, oltre ai parametri necessari alla displaytable per la paginazione stessa, si aggiungono i parametri selezionati, quindi andando avanti e indietro non si perdono tali scelte.
L'oggetto della tabella deve avere poi una proprietà "id" che lo identifichi univocamente, e che sarà il valore poi passato in query string.
Ho avuto solo qualche problema  all'atto del post del form, infatti se quella pagina è l'ultima visitata allora i parametri impostati non sono ancora presenti in query string, e mi sono dovuto fare un metodo javascript che li recuperava dal form.
Di seguito posto il codice.

Per simulare il caricamento dati da db ho utilizzato una servlet che carica una lista di oggetti di tipo Nazione, con la proprietà id e quella checked.
Caricati i dati a mano, per fare in modo che all'ingresso in lista risultino già selezionate quelle nazioni con la proprietà checked=true, bisogna aggiungere in query string i parametri _chk  con le apposite id.

.....

request.getSession().setAttribute("LISTA_DATI", listaNazioni);
String parametersToAdd=getParametriDaAggiungere(listaNazioni);
request.getRequestDispatcher("listaNew.jsp"+parametersToAdd).forward(request, response);

....

Dove il metodo getParametriDaAggiungere fa l'append in queryString dei parametri

private String getParametriDaAggiungere(List<Nazione> lista){
        StringBuffer sb=new StringBuffer();
        sb.append("?");
        for(Nazione n: lista){
            if(n.isCheched()){
                sb.append("_chk=");
                sb.append(n.getId());
                sb.append("&");
            }
        }
        return sb.toString();
    }

 La jsp listaNew.jsp è definita così (in grassetto la definizione del decorator come specificato da fare sul sito di display table):

<%@ taglib uri="http://displaytag.sf.net" prefix="display" %>
<script>

function settaValore(val){
    var input = document.createElement("input");
    input.setAttribute("type", "hidden");
    input.setAttribute("name", "pageSelection");
   
    input.setAttribute("value", val);
    document.getElementById("container").appendChild(input);
}
function sendRequest(){
    var form1=document.getElementById("displ");
    var testo=form1["_chk"];
    var len = testo.length;

     for(var i=0;i<len;i++)
     {
         if(testo[i].checked){
             settaValore(testo[i].value);
         }
     }
     
     document.getElementById("container").submit();
}
</script>
<%
org.displaytag.decorator.CheckboxTableDecorator decorator = new org.displaytag.decorator.CheckboxTableDecorator();
  decorator.setId("id");
  decorator.setFieldName("_chk");
 
  pageContext.setAttribute("checkboxDecorator", decorator);

%>

<form name="displ" id="displ" action="?" method="get">
<display:table name="${LISTA_DATI}" class="dataTable"  decorator="checkboxDecorator" pagesize="5" form="displ" excludedParams="_chk">
<display:column property="checkbox"></display:column>
<display:column property="nome"></display:column>
<display:column property="continente"></display:column>
<display:column property="abitanti"></display:column>
<display:column property="ranking"></display:column>
</display:table>
<%
String[] val=request.getParameterValues("_chk");
request.getSession().setAttribute("selected", val); %>
</form>
<form name="container" id="container" action="<%=request.getContextPath() %>/ListaSelezionate">
<input type="button" name="btnInvio" id="btnInvio" value="Invio" onclick="sendRequest();">
</form>

La servlet di arrivo recupera dunque sia i dati in sessione (attributo selected) sia i dati nella request corrente (attributo pageSelection) e ricostruisce da queste informazioni i dati selezionati:

private void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HashSet<String> hset=new LinkedHashSet<String>();
        String[] parametri=request.getParameterValues("pageSelection");
        String[] parInSessione=(String[])request.getSession().getAttribute("selected");
        PrintWriter pw=response.getWriter();
        pw.println("<html>");
        //pw.println("Parametri in request");
        if(parametri!=null){
        for(String s:parametri){
            //pw.println(s);
            hset.add(s);
        }
        }
       
       
        if(parInSessione!=null){
        for(String s:parInSessione){
            hset.add(s);
        }
        }
       
        List<Nazione> lista=(List<Nazione>)request.getSession().getAttribute("LISTA_DATI");
        List<Nazione> selezionati=new LinkedList<Nazione>();
        for(Nazione n: lista){
            Iterator it=hset.iterator();
            while(it.hasNext()){
                String cc=(String)it.next();
                if(cc.equals(String.valueOf(n.getId()))){
                    selezionati.add(n);
                    continue;
                }
            }
        }
        pw.println("<b>Nazioni selezionate</b>: <br>");
        for(Nazione n:selezionati){
        pw.println(n.getNome());
        pw.println("<br>");
        }
       
        pw.println("</html>");
    }


Nessun commento:

Posta un commento