Visualizzazione post con etichetta TAGLIB. Mostra tutti i post
Visualizzazione post con etichetta TAGLIB. Mostra tutti i post

giovedì 31 gennaio 2013

Taglib combo date

Ho avuto la necessità di realizzare una combo che date in input 2 date in formato gg/mm/aaaa (data inizio e data fine) mostrasse i dati nel formato MESE-AAAA (es. gennaio-2010...)ordinato dall'inizio alla fine e come valore AAAAMM concatenato.
La taglib è definita così (file tld)

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!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>c</short-name>
  <uri>http://gbresci.com</uri>
  <display-name>combo helper</display-name>
  <description>combo helper core library</description>
  <tag>
  <name>combo</name>
  <tag-class>it.gbresci.taglib.ComboDate</tag-class>
  <body-content>empty</body-content>
  <description>Gestione Combo</description>
  <attribute>
  <name>dataDa</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
   <attribute>
  <name>dataA</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>primoVuoto</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>id</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  </taglib>



Il codice del Tag, che eredita da SimpleTagSupport, è il seguente:

package it.gbresci.taglib;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;

import java.io.IOException;
import java.util.*;

public class ComboDate extends SimpleTagSupport {
	private String id="";
	private String dataDa="";
	private String dataA="";
	private boolean primoVuoto=false;
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public boolean isPrimoVuoto() {
		return primoVuoto;
	}
	public void setPrimoVuoto(boolean primoVuoto) {
		this.primoVuoto = primoVuoto;
	}
	
	public String getDataDa() {
		return dataDa;
	}
	public void setDataDa(String dataDa) {
		this.dataDa = dataDa;
	}
	public String getDataA() {
		return dataA;
	}
	public void setDataA(String dataA) {
		this.dataA = dataA;
	}
	private boolean validate()
	{
		boolean retVal=true;
		if(this.dataDa!= null && this.dataDa.length()==10 
			&& this.dataA!=null && this.dataA.length()==10){
			try
			{
				Date data1=getDateFromString(dataDa);
				Date data2=getDateFromString(dataA);
				if(data2.getTime()<data1.getTime()){
					retVal=false;
				}
				
			}
			catch(Exception ex){
				//log
				retVal=false;
			}
		}
		return retVal;
	}
	public void doTag() throws JspException {

		PageContext pageContext = (PageContext) getJspContext();
		JspWriter out = pageContext.getOut();
		StringBuffer sb = new StringBuffer();
        if(validate()){
		try {
			
			sb.append("<select id=\"");
			sb.append(this.id);
			sb.append("\" name=\"");
			sb.append(this.id);
			sb.append("\"");
			sb.append(">");
			if(primoVuoto){
				sb.append("<option value=\"\"> </option>");
			}
			Map<String,String> myMap=getMappaValori();
			Set<String> chiavi=myMap.keySet();
			for(String s:chiavi){
				sb.append("<option value=\"");
				sb.append(s);
				sb.append("\">");
				sb.append(myMap.get(s));
				sb.append("</option>");
				
			}
			sb.append("</select>");
			out.println(sb.toString());

		} catch (Exception e) {
			e.printStackTrace();
		}
        }
        else
        {
        	try {
				out.println("<h1><b>Attenzione errore nel popolamanto controllo, controllare gli estremi delle date!!</b></h1>");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
        }

	}
	private Map<String,String> getMappaValori(){
		Map<String,String> myMap=new LinkedHashMap<String, String>();
		Date dataDatag=getDateFromString(dataDa);
		Date dataAtag=getDateFromString(dataA);
		Date dataTempTag=dataDatag;
		do
		{
			myMap.put(getChiaveFromDate(dataTempTag), getValoreFromDate(dataTempTag));
			Calendar c=Calendar.getInstance();
			c.setTime(dataTempTag);
			c.add(Calendar.MONTH, 1);
			dataTempTag=c.getTime();
		}
		while(dataTempTag.getTime()<dataAtag.getTime());
		return myMap;
	}
	private Date getDateFromString(String d){
		Calendar c=Calendar.getInstance();
		String giorno=d.substring(0, 2);
		String mese=d.substring(3, 5);
		String anno=d.substring(6);
		c.set(Calendar.DAY_OF_MONTH,Integer.parseInt(giorno));
		c.set(Calendar.MONTH, Integer.parseInt(mese)-1);
		c.set(Calendar.YEAR, Integer.parseInt(anno));
		return c.getTime();
	}
	private String getChiaveFromDate(Date d){
		Calendar c=Calendar.getInstance();
		c.setTime(d);
		int anno=c.get(Calendar.YEAR);
		int mese=c.get(Calendar.MONTH)+1;
		StringBuffer sb=new StringBuffer();
		sb.append(anno);
		String mes=String.valueOf(mese);
		if(mes.length()==1){
			sb.append("0");
		}
		sb.append(mes);
		return sb.toString();
	}
	private String getValoreFromDate(Date d){
		Calendar c=Calendar.getInstance();
		c.setTime(d);
		int anno=c.get(Calendar.YEAR);
		int mese=c.get(Calendar.MONTH);
		StringBuffer sb=new StringBuffer();
		switch(mese){
		case 0:
			sb.append("GENNAIO-");
			break;
		case 1:
			sb.append("FEBBRAIO-");
			break;
		case 2:
			sb.append("MARZO-");
			break;
		case 3:
			sb.append("APRILE-");
			break;
		case 4:
			sb.append("MAGGIO-");
			break;
		case 5:
			sb.append("GIUGNO-");
			break;
		case 6:
			sb.append("LUGLIO-");
			break;
		case 7:
			sb.append("AGOSTO-");
			break;
		case 8:
			sb.append("SETTEMBRE-");
			break;
		case 9:
			sb.append("OTTOBRE-");
			break;
		case 10:
			sb.append("NOVEMBRE-");
			break;
		case 11:
			sb.append("DICEMBRE-");
			break;
		
			
		}
		sb.append(anno);
		return sb.toString();
	}

}



Sulla jsp avremo infine l'importazione e definizione della taglib:

<%@ taglib prefix="x" uri="http://gbresci.com" %>
......
Data Test: <x:combo dataA="31/12/2012" dataDa="01/01/2009" id="qwerty"/> 

Si ricorda che :
  • Il file .tld deve essere salvato dentro la directory WEB-INF;
  • Il campo URI definito nel tld deve essere uguale a quello definito sulla jsp e NON è necessario che punti ad una vera url, si tratta soltanto di un nome logico;
  • Settando nella taglib il valore RTEXPRVALUE a true si rende possibile inserire all'interno del campo sulla jsp anche del codice java che interpeti il valore a runtime.

mercoledì 25 gennaio 2012

Java Web App caricamento combo da Xml

Riprendendo il post di ieri con l'introduzione della taglib personalizzata per caricare le combo aggiungiamo il caricamento delle stesse da file xml invece che direttamente da codice.

Per fare questo nella nostra WebApp inseriamo un file xml dentro una directory conf con questa struttura:

<lista>
<elemento>
<codice>01</codice>
<descrizione>Roma</descrizione>
</elemento>
<elemento>
<codice>02</codice>
<descrizione>Frosinone</descrizione>
</elemento>
<elemento>
<codice>03</codice>
<descrizione>Latina</descrizione>
</elemento>
<elemento>
<codice>04</codice>
<descrizione>Viterbo</descrizione>
</elemento>
<elemento>
<codice>05</codice>
<descrizione>Rieti</descrizione>
</elemento>
</lista>

e denominiamolo province.xml.

La classe per il caricamento è la seguente, si noti in particolare che si utilizza l'approccio DOM, essendo un file di piccole dimensioni, e che per recuperare il percorso del file contenuto nella web app si utilizza il metodo request.getSession().getServletContext().getRealPath("").
Il file xml è interno alla web-app, ma poteva anche essere esternalizzato evidentemente.

package it.xmlLoader;
import java.io.File;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class DomParser {


private String file;

public DomParser(String nomeFile){
    this.file=nomeFile;
}
public  DomParser (HttpServletRequest request,String nomeFile){
   
    file=getPath(request)+File.separator+"conf"+File.separator+nomeFile;
   
   
}
private String getPath(HttpServletRequest request){
   
    return request.getSession().getServletContext().getRealPath("");
}


public Map<String,String> getValoriCombo(){
    Map<String,String> myMap=null;
    try
    {
        myMap=new LinkedHashMap<String, String>();
        DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
        DocumentBuilder db=dbf.newDocumentBuilder();
       
        Document doc = db.parse(new File(file));
        doc.normalize();
        NodeList nd=doc.getElementsByTagName("elemento");
      
        for(int i=0;i<nd.getLength();i++){
            Node nodo=nd.item(i);
             if (nodo.getNodeType() == Node.ELEMENT_NODE) {
                 
                  Element eElement = (Element) nodo;
                  String chiave=getTagValue("codice", eElement);
                  String valore=getTagValue("descrizione", eElement);
                  myMap.put(chiave, valore);
     
               }
        }
    }
    catch(Exception ex){
        ex.printStackTrace();
    }
   
    return myMap;
}
private  String getTagValue(String sTag, Element eElement) {
 NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();
 
  Node nValue = (Node) nlList.item(0);
 
    return nValue.getNodeValue();
  }
}


Nella jsp avremo invece:

<%@page import="it.xmlLoader.DomParser"%>
<%@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>
<% DomParser dm=new DomParser(request,"province.xml");
  
   
    request.setAttribute("COMBOLIST", dm.getValoriCombo());
%>
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>

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