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.

Nessun commento:

Posta un commento