martedì 31 gennaio 2012

CSS uppercase textbox

Per garantire che il contenuto di una casella di testo sia sempre scritto in maiuscolo invece di utilizzare eventi javascript è molto comoda la funzione di CSS style="text-transform:uppercase;".
Esistono anche altri due valori possibili: text-transform:capitalize; e text-transform:lowercase;

Qui sotto vediamo gli esempi delle 3 possibilità


Text-transform UPPERCASE:

Text-transform LOWERCASE:

Text-transform CAPITALIZE:

giovedì 26 gennaio 2012

LookUp Ejb iniettati tramite DI

Se non è specificato un name particolare per un Ejb iniettato con l'annotation
@Ejb allora il nome di default sarà:

<package name>.<ClassName>/<variableName>

Es:

@Stateless
@Local(com.enthu.ejbplus.TellerLocal.class)
public class TellerBean implements com.enthu.ejbplus.TellerLocal {

  @EJB
   com.enthu.ejbplus.ManagerLocal manager;
   //...  altro codice valido


}


Per recuperare l'EJB se disponiamo dell' InitialContext faremo quindi:

ManagerLocal manager = (ManagerLocal) ctx.lookup("java:comp/env/com.enthu.ejbplus.TellerBean/manager");

Se invece abbiamo l'EJBContext associato al bean sarà sufficiente fare:

ManagerLocal manager = (ManagerLocal) sessionContext.lookup("com.enthu.ejbplus.TellerBean/manager");

senza quindi anteporre java:comp/env

mercoledì 25 gennaio 2012

File orm.xml

Sebbene con JPA si preferisce utilizzare le annotation a livello di classe è sempre possibile mappare via xml le relazioni oggetti-tabelle, nel file orm.xml.
Tale file ove presente ha la priorità sulle annotation, è consentito quindi modificare al volo alcuni dettagli (es cambio di nome colonna su db) senza per questo ricompilare le classi dopo aver modificato le annotations.
Il file va messo nella directory META-INF del nostro jar, assieme al persistence.xml.
E' possibile inoltre scrivere un proprio file di mapping, denominato ad esempio myMapping.xml ed includerlo nell'elemento mapping-file del persistence.xml, questo non esclude comunque che ove presente sia letto il file orm.xml, il file di mapping è diciamo una aggiunta.
Vediamo un esempio di file persistence.xml modificato per introdurre tale parametro:

...

<persistence-unit name="test">
     <description>Persinstence Unit</description>
     <provider>com.objectdb.jpa.Provider</provider>
     <mapping-file>META-INF/mappingFile.xml</mapping-file>
     <jar-file>packedEntity.jar</jar-file>
     <class>it.MyEntity1</class>
     <class>it.MyEntity2</class>
     <properties>
       <property name="javax.persistence.jdbc.url"
                 value="objectdb://localhost/my.odb"/>
       <property name="javax.persistence.jdbc.user" value="admin"/>
       <property name="javax.persistence.jdbc.password" value="admin"/>
     </properties>
   </persistence-unit>



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

Generare classi java da xsd

Con la jdk 6, che ha integrate le librerie di JAX-B, è molto semplice generare le classi Java a partire dal file xsd, in questo modo, da console:
  1. Entrare nella directory bin della jdk;
  2. Digitare xjc.exe -p it.test C:\temp\20120124\file.xsd
Saranno generate dentro la bin  le classi nel package specificato

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