martedì 24 gennaio 2012

Creare una taglib per caricare una combo

Vediamo un esempio di creazione di una tag library personalizzata per il caricamento delle combo in una web app.

Per prima cosa vediamo la classe che estendiamo da javax.servlet.jsp.tagext.TagSupport.
La classe TagSupport implementa sia l'interfaccia Tag che l'interfaccia IterationTag, che definisce un metodo che consente di valutare se rieseguire il codice del doStartTag(). In questo caso non ci servirà tale metodo infatti il doAfterBody non è ridefinito.
Definiamo nella classe tutte le property necessarie, e in più aggiungiamo dei flag booleani, concatenaDescrizione e primoVuoto, il primo serve per visualizzare a video la concatenazione tra codice e descrizione, il secondo se true immette una option vuota.
I passi necessari per creare la taglib sono quindi:
  1. Scrivere la classe Java;
  2. Definire sotto WEB-INF un file .tld con la descrizione della tag library;
  3. Referenziare nella JSP il nostro tag tramite la direttiva @taglib, si noti che l'uri inserita deve essere la stessa presente nella .tld, e questa a sua volta deve essere univoca all'interno dell'applicazione, questo è l'unico requisito, attenzione l'uri può (come in questo caso) anche non esistere nella realtà, è solo un identificatore univoco della tag library.
Di seguito incollo tutte e 3 le componenti

Codice

package it.taglib;
import java.util.*;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
public class Combo extends TagSupport{
    private Map<String,String> lista=new LinkedHashMap<String,String>();
    private boolean concatenaDescrizione=false;
    private boolean primoVuoto=true;
    private String name;
    private String id;
    private String style;
    private String cssClass;
    private String onblur;
    private String onchange;
    private String onclick;
    private String ondblclick;
    private String onfocus;
    private String onmousedown;
    private String onmousemove;
    private String onmouseout;
    private String onmouseover;
    private String onmouseup;
    private String onkeydown;
    private String onkeypress;
    private String onkeyup;
    public String getCssClass() {
       
        return cssClass;
    }

    public void setCssClass(String cssClass) {
        this.cssClass = cssClass;
    }

    public String getOnblur() {
        return onblur;
    }

    public void setOnblur(String onblur) {
        this.onblur = onblur;
    }

    public String getOnchange() {
        return onchange;
    }

    public void setOnchange(String onchange) {
        this.onchange = onchange;
    }

    public String getOnclick() {
        return onclick;
    }

    public void setOnclick(String onclick) {
        this.onclick = onclick;
    }

    public String getOndblclick() {
        return ondblclick;
    }

    public void setOndblclick(String ondblclick) {
        this.ondblclick = ondblclick;
    }

    public String getOnfocus() {
        return onfocus;
    }

    public void setOnfocus(String onfocus) {
        this.onfocus = onfocus;
    }

    public String getOnmousedown() {
        return onmousedown;
    }

    public void setOnmousedown(String onmousedown) {
        this.onmousedown = onmousedown;
    }

    public String getOnmousemove() {
        return onmousemove;
    }

    public void setOnmousemove(String onmousemove) {
        this.onmousemove = onmousemove;
    }

    public String getOnmouseout() {
        return onmouseout;
    }

    public void setOnmouseout(String onmouseout) {
        this.onmouseout = onmouseout;
    }

    public String getOnmouseover() {
        return onmouseover;
    }

    public void setOnmouseover(String onmouseover) {
        this.onmouseover = onmouseover;
    }

    public String getOnmouseup() {
        return onmouseup;
    }

    public void setOnmouseup(String onmouseup) {
        this.onmouseup = onmouseup;
    }

    public String getOnkeydown() {
        return onkeydown;
    }

    public void setOnkeydown(String onkeydown) {
        this.onkeydown = onkeydown;
    }

    public String getOnkeypress() {
        return onkeypress;
    }

    public void setOnkeypress(String onkeypress) {
        this.onkeypress = onkeypress;
    }

    public String getOnkeyup() {
        return onkeyup;
    }

    public void setOnkeyup(String onkeyup) {
        this.onkeyup = onkeyup;
    }
   


    public Map<String,String> getLista() {
        return lista;
    }

    public void setLista(Map<String,String> lista) {
        this.lista = lista;
    }

    public boolean isConcatenaDescrizione() {
        return concatenaDescrizione;
    }

    public void setConcatenaDescrizione(boolean concatenaDescrizione) {
        this.concatenaDescrizione = concatenaDescrizione;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getStyle() {
        return style;
    }

    public void setStyle(String style) {
        this.style = style;
    }
    private boolean isNullOrEmty(String s){
       
        boolean retVal=false;
        if(s==null || "".equals(s.trim())){
            retVal=true;
        }
        return retVal;
    }
    /**
     *
     */
    private static final long serialVersionUID = 1L;
    private String getCombo(){
        StringBuffer sb=new StringBuffer();
        sb.append("<select");
        sb.append(" name='");
        sb.append(this.name);
        sb.append("' id='");
        if(isNullOrEmty(id)){
            sb.append(this.name);
            sb.append("'");
        }
        else
        {
            sb.append(this.id);
            sb.append("'");
        }
        addAttributes(sb);
        sb.append(">");
        if(primoVuoto){
            sb.append("<option></option>");
        }
        Iterator<String> it=lista.keySet().iterator();
        while(it.hasNext()){
           
            String chiave=it.next();
            String valore=lista.get(chiave);
            sb.append("<option value='");
            sb.append(chiave);
            sb.append("'");
            sb.append(">");
            if(!concatenaDescrizione){
                sb.append(valore);
            }
            else
            {
                sb.append(chiave);
                sb.append("-");
                sb.append(valore);
            }
            sb.append("");
            sb.append("</option>");
           
        }
        sb.append("</select> ");
       
       
       
        return sb.toString();
    }
    private void addAttributes(StringBuffer sb){
       
        if(!isNullOrEmty(this.style)){
            sb.append("style='");
            sb.append(this.style);
            sb.append("'");
        }
        if(!isNullOrEmty(this.cssClass)){
            sb.append("class='");
            sb.append(this.cssClass);
            sb.append("'");
        }
        // javascript
        if(!isNullOrEmty(this.onblur)){
            sb.append("onblur='");
            sb.append(this.onblur);
            sb.append("'");
        }
        if(!isNullOrEmty(this.onchange)){
            sb.append("onchange='");
            sb.append(this.onchange);
            sb.append("'");
        }
        if(!isNullOrEmty(this.onclick)){
            sb.append("onclick='");
            sb.append(this.onclick);
            sb.append("'");
        }
        if(!isNullOrEmty(this.ondblclick)){
            sb.append("ondblclick='");
            sb.append(this.ondblclick);
            sb.append("'");
        }
        if(!isNullOrEmty(this.onfocus)){
            sb.append("onfocus='");
            sb.append(this.onfocus);
            sb.append("'");
        }
        if(!isNullOrEmty(this.onmousedown)){
            sb.append("onmousedown='");
            sb.append(this.onmousedown);
            sb.append("'");
        }
        if(!isNullOrEmty(this.onmousemove)){
            sb.append("onmousemove='");
            sb.append(this.onmousemove);
            sb.append("'");
        }
        if(!isNullOrEmty(this.onmouseout)){
            sb.append("onmouseout='");
            sb.append(this.onmouseout);
            sb.append("'");
        }
        if(!isNullOrEmty(this.onmouseover)){
            sb.append("onmouseover='");
            sb.append(this.onmouseover);
            sb.append("'");
        }
        if(!isNullOrEmty(this.onmouseup)){
            sb.append("onmouseup='");
            sb.append(this.onmouseup);
            sb.append("'");
        }
        if(!isNullOrEmty(this.onkeydown)){
            sb.append("onkeydown='");
            sb.append(this.onkeydown);
            sb.append("'");
        }
        if(!isNullOrEmty(this.onkeypress)){
            sb.append("onkeypress='");
            sb.append(this.onkeypress);
            sb.append("'");
        }
        if(!isNullOrEmty(this.onkeyup)){
            sb.append("onkeyup='");
            sb.append(this.onkeyup);
            sb.append("'");
        }
       
       
    }
     public int doStartTag() throws JspException {
         
         try
         {
             JspWriter out = pageContext.getOut();  
             out.println(getCombo());
         }
         catch(Exception ex){
             throw new RuntimeException("Errore nel caricamento combo: "+ex.getMessage());
         }
         return SKIP_BODY;
     }

    public boolean isPrimoVuoto() {
        return primoVuoto;
    }

    public void setPrimoVuoto(boolean primoVuoto) {
        this.primoVuoto = primoVuoto;
    }

}


TLD

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
  "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib> 
<tlib-version>1.0</tlib-version> 
<jsp-version>1.2</jsp-version> 
<short-name>genericTlb</short-name> 
<info>Sample taglib for Substr operation</info> 
<uri>http://gbresci.blogspot.com/taglib</uri> 
<display-name>generic tld</display-name>
<tag> 
    <name>combo</name> 
    <tag-class>it.taglib.Combo</tag-class> 
    <info>Schema combo</info> 
  <body-content>empty</body-content>
    <attribute> 
      <name>lista</name> 
      <required>true</required> 
      <rtexprvalue>true</rtexprvalue>
  </attribute> 
    <attribute> 
      <name>name</name> 
      <required>true</required> 
      <rtexprvalue>true</rtexprvalue>
  </attribute> 
    <attribute> 
      <name>id</name> 
      <required>false</required> 
  </attribute> 
      <attribute> 
      <name>concatenaDescrizione</name> 
      <required>false</required> 
      <type>boolean</type>
  </attribute>
      <attribute> 
      <name>primoVuoto</name> 
      <required>false</required> 
      <type>boolean</type>
  </attribute>
   <attribute> 
      <name>style</name> 
      <required>false</required> 
  </attribute>
   <attribute> 
      <name>cssClass</name> 
      <required>false</required> 
  </attribute>
   <attribute> 
      <name>onchange</name> 
      <required>false</required> 
  </attribute>
   <attribute> 
      <name>onclick</name> 
      <required>false</required> 
  </attribute>
   <attribute> 
      <name>ondblclick</name> 
      <required>false</required> 
  </attribute>
   <attribute> 
      <name>onfocus</name> 
      <required>false</required> 
  </attribute>
   <attribute> 
      <name>onmousedown</name> 
      <required>false</required> 
  </attribute>
   <attribute> 
      <name>onmousemove</name> 
      <required>false</required> 
  </attribute>
   <attribute> 
      <name>onmouseout</name> 
      <required>false</required> 
  </attribute>
   <attribute> 
      <name>onmouseover</name> 
      <required>false</required> 
  </attribute>
   <attribute> 
      <name>onmouseup</name> 
      <required>false</required> 
  </attribute>
   <attribute> 
      <name>onkeydown</name> 
      <required>false</required> 
  </attribute>
   <attribute> 
      <name>onkeypress</name> 
      <required>false</required> 
  </attribute>
   <attribute> 
      <name>onkeyup</name> 
      <required>false</required> 
  </attribute>
</tag> 
</taglib>


JSP


<%@page import="java.util.*"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@taglib prefix="com" uri="http://gbresci.blogspot.com/taglib"%>  
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Combo Test</title>
</head>
<body>
<% Map<String,String> m=new LinkedHashMap<String,String>();
    m.put("01", "ROMA");
    m.put("02", "FROSINONE");
    m.put("03", "LATINA");
    m.put("04", "VITERBO");
    m.put("05", "RIETI");
    
    request.setAttribute("COMBOLIST", m);
%>
Lista: <com:combo lista="${COMBOLIST}" name="cmbList" primoVuoto="true"/><br>
<br><br>
Lista 2: <com:combo lista="${COMBOLIST}" name="cmbList" style="color:red;" primoVuoto="false" concatenaDescrizione="true"/>
</body>
</html>


Risultato a video

 
 

Nessun commento:

Posta un commento