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)
Il codice del Tag, che eredita da SimpleTagSupport, è il seguente:
Sulla jsp avremo infine l'importazione e definizione della taglib:
Si ricorda che :
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