giovedì 28 febbraio 2013

Javascript formattazione campi importo

Con questo script è possibile facilitare la scrittura degli importi nel formato italiano (il punto come separatore migliaia e virgola come separatore dei decimali).
L'evento va associato all' onkeyup dell'input type="text".

Il metodo è il seguente:


function numberFormat(obj)
   {
var nStr1 = obj.value;
var name  = obj.name;
var p = nStr1.split('.');
var nStr = "";
for(i = 0; i <p.length; i++)
nStr += p[i];
nStr += '';
x = nStr.split(',');
x1 = x[0];
x2 = x.length > 1 ? ',' + x[1] : '';
if (x2.length >3) x2 = x2.substring(0,3);
var rgx = /(\d+)(\d{3})/;
while(rgx.test(x1))
x1 = x1.replace(rgx, '$1' + '.' + '$2');
if (x2 == '' && x1.length >16) x2 = ',';
var a="document.getElementById('";
var b=name;
var c="').value=x1+x2";
eval(a+b+c);
}


Vediamo sotto un esempio concreto (provare a digitare un importo nella casella di testo):

mercoledì 27 febbraio 2013

Jquery disabilitare pressione tasto backspace

Per disabilitarlo in tutte le pagine web basta includere nella pagina padre il seguente script (testato e funzionante su IE8 e Firefox 19).
Il return false fa si che l'evento non sia portato a termine, il metodo preventDefault evita invece che comunque venga eseguita la propagazione all'evento successivo.


$(document).keydown(function(e) {
        
        if (e.keyCode == 8 ) {
                                      e.preventDefault(); 
                                    return false;
        };
        
    });



lunedì 18 febbraio 2013

Windows killare un processo via bat

Per terminare un processo via cmd la sintassi è la seguente:

taskkill /F /im xxxx.exe

venerdì 15 febbraio 2013

Tomcat 7 errore di tipo javax.xml.ws.soap.SOAPFaultException: javax.xml.ws.WebFault.messageName()Ljava/lang

Sono incappato in questo errore tentando di deployare un web service sotto Tomcat.
Il problema è noto e dovuto al fatto che la jdk utilizzata (1.6.029) ha una versione di jax-ws più vecchia rispetto a quella utilizzata dall'applicativo.
Per fare in modo che Tomcat utilizzi le classi corrette bisogna procedere in questo modo:
  • Da qui scaricare l'ultima versione di JAX.WS;
  • Creare sotto Tomcat7 (a livello della directory lib) una directory endorsed e copiarvi dentro tutti i jar scaricati al passo precedente.
A questo punto gli errori scompaiono.

domenica 10 febbraio 2013

Definire un WebFault in un Web Service

Per usare il meccanismo dei WebFault nei Web Service bisogna procedere in questo modo:
  1. Definire un bean con le proprietà che caratterizzino e definiscano al meglio i dettagli dell'eccezione;
  2. Creare una eccezione annotata con @WebFault avente come proprietà la classe definita al punto 1 e una proprietà definita getFaultInfo() che torni direttamente la classe.

Vediamo il codice.

Bean di dettaglio


package it.exception;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Errore", propOrder = {
    "message","data"
})
public class ErroreLogico  {

 @XmlElement(name="timestamp")
 private String data;
 
 public String getData() {
  return data;
 }

 public void setData(String data) {
  this.data = data;
 }

 private String message;

 public String getMessage() {
  return message;
 }

 public void setMessage(String message) {
  this.message = message;
 }
 

}


WebFault 


package it.exception;
import javax.xml.ws.WebFault;
@WebFault(name="FaultProva",targetNamespace="http://www.esempiws.it")
public class FaultWs extends Exception {
 private ErroreLogico error;
 private static final long serialVersionUID = 1L;
 public FaultWs(String message,ErroreLogico bean){
  super(message);
  this.error=bean;
 }
 public FaultWs(String message,ErroreLogico bean,Throwable cause){
  super(message);
  this.error=bean;
 }
 public ErroreLogico getFaultInfo(){
  return this.error;
 }

}


WebService 


package it.wstest;
import java.text.SimpleDateFormat;
import java.util.Date;
import it.exception.ErroreLogico;
import it.exception.FaultWs;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.ParameterStyle;
import javax.jws.soap.SOAPBinding.Style;
import javax.jws.soap.SOAPBinding.Use;
@WebService(name="MyTest")
@SOAPBinding( style=Style.DOCUMENT,parameterStyle=ParameterStyle.WRAPPED,use=Use.LITERAL)
public class WsProva {
public double dividi(String numeratore,String denominatore) throws FaultWs{
 try
 {
  double num=Double.parseDouble(numeratore);
  double den=Double.parseDouble(denominatore);
  double res=num/den;
  return res;
 }
 catch(Throwable t){
  ErroreLogico e=new ErroreLogico();
  e.setMessage(t.getMessage());
  SimpleDateFormat sdf=new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
  e.setData(sdf.format(new Date()));
  throw new FaultWs("Errore nella divisione.", e);
 }
}
}


A livello di WSDL troveremo la seguente deinizione:

<types>
<xsd:schema>
<xsd:import namespace="http://www.esempiws.it" schemaLocation="http://localhost:9999/Divisione?xsd=1"/>
</xsd:schema>
<xsd:schema>
<xsd:import namespace="http://wstest.it/" schemaLocation="http://localhost:9999/Divisione?xsd=2"/>
</xsd:schema>
</types>
<message name="dividi">
<part name="parameters" element="tns:dividi"/>
</message>
<message name="dividiResponse">
<part name="parameters" element="tns:dividiResponse"/>
</message>
<message name="FaultWs">
<part xmlns:ns1="http://www.esempiws.it" name="fault" element="ns1:FaultProva"/>
</message>
<portType name="MyTest">
<operation name="dividi">
<input wsam:Action="http://wstest.it/MyTest/dividiRequest" message="tns:dividi"/>
<output wsam:Action="http://wstest.it/MyTest/dividiResponse" message="tns:dividiResponse"/>
<fault message="tns:FaultWs" name="FaultWs" wsam:Action="http://wstest.it/MyTest/dividi/Fault/FaultWs"/>
</operation>
</portType>
<binding name="MyTestPortBinding" type="tns:MyTest">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<operation name="dividi">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
<fault name="FaultWs">
<soap:fault name="FaultWs" use="literal"/>
</fault>
</operation>
</binding>
<service name="WsProvaService">
<port name="MyTestPort" binding="tns:MyTestPortBinding">
<soap:address location="http://localhost:9999/Divisione"/>
</port>
</service>
</definitions>


Testando il Ws con soap UI abbiamo la seguente situazione.
 Chiamata:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wst="http://wstest.it/">
   <soapenv:Header/>
   <soapenv:Body>
      <wst:dividi>
         <!--Optional:-->
         <arg0>qwe</arg0>
         <!--Optional:-->
         <arg1>12</arg1>
      </wst:dividi>
   </soapenv:Body>
</soapenv:Envelope>


Risposta:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope">
         <faultcode>S:Server</faultcode>
         <faultstring>Errore nella divisione.</faultstring>
         <detail>
            <ns3:FaultProva xmlns:ns3="http://www.esempiws.it" xmlns:ns2="http://wstest.it/">
               <message>For input string: "qwe"</message>
               <timestamp>10/02/2013 11:36:13</timestamp>
            </ns3:FaultProva>
         </detail>
      </S:Fault>
   </S:Body>
</S:Envelope>


giovedì 7 febbraio 2013

p:fileUpload non rimuove messaggi errore

Il componente p:fileUpload su prime faces presenta un piccolo bug, almeno fino alla versione che utilizzo io, ossia la 3.4.1.
Il problema è che i messaggi di errore rimangono sempre visibili nella pagina, anche dopo che si ritenta l'upload.
Il problema è segnalato anche nel forum del sito.
Un modo veloce per risolverlo è quello di associare al click sul componente un evento javascript che si occupi di rimuovere manualmente il o i record di errore presenti.
Non sono riuscito però a farlo funzionare associando l'evento direttamente al componente p:fileUpload e quindi lo ho wrappato da un div esterno.
Di seguito il codice :

  <div onclick="clearInvalidFileMsg()">
   <p:fileUpload   
   mode="advanced" update=":documentiForm:documentiTable" 
disabled="#{soggetto.stato=='X'}"
   fileUploadListener="#{fileUploadController.handleFileUpload}"
   invalidFileMessage="Formato del file non previsto. Formati consentiti [rtf, pdf, txt, doc, docx, xls, xlsx]. "
   invalidSizeMessage="Dimensione massima del file ecceduta. Massima dimensione contensentita 3Mb. "
   auto="true" label="Sfoglia"  sizeLimit="1000000" widgetVar="fileuplaod_wgt"
   allowTypes="/(\.|\/)(rtf|pdf|txt|doc|docx|xls|xlsx)$/" />
 </div>
.......
<script> function clearInvalidFileMsg(){ fileuplaod_wgt.uploadContent.find("tr.ui-state-error").remove(); } </script> 

martedì 5 febbraio 2013

Sql Server 2005 verificare i lock presenti

Per verificare i lock su Sql Server 2005 occorre eseguire la seguente query:


select cmd,* from sys.sysprocesses
where blocked > 0


domenica 3 febbraio 2013

SoapBinding style Wrapped oppure Bare

La differenza tra lo style Wrapped oppure Bare si ripercuote sulla generazione del body soap di risposta, non nel WSDL che rimane lo stesso sia se inseriamo l'annotazione Bare piuttosto che Wrapped.
Dato il seguente Web Service:


import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.ParameterStyle;
import javax.jws.soap.SOAPBinding.Style;
import javax.jws.soap.SOAPBinding.Use;

@WebService
@SOAPBinding(style=Style.DOCUMENT,parameterStyle=ParameterStyle.BARE,use=Use.LITERAL)
public class WsTest {
@WebMethod(operationName="test")
public String reverse(){
 return "qaswed";
}
@WebMethod
public String reverse(String s){
 StringBuffer sb=new StringBuffer();
 sb.append(s);
 return sb.reverse().toString();
}
}




In questo caso abbiamo 2 metodi java con lo stesso nome e parametri diversi in input, il classico caso di overloading.
Se non fosse stato specificato un o
Tale Web Service non si riesce a deployare se mettiamo il ParameterStyle a WRAPPED. Questo perchè JAXB scegliendo Wrapped crea dei Wrapper sulla base del nome del metodo e quindi va in conflitto.
Nel caso di annotazione del tipo BARE i wrapper non sono creati.

venerdì 1 febbraio 2013

JQuery Date Picker range date e default

Utilizzando il calendario di jquery ho avuto la necessità di:
  • Rendere selezionabili le date dal 1970 al 2024;
  • Presentare all'apparire del calendario di default mese e anno odierno.
  • Poter selezionare da combo mese e anno per velocizzare lo spostamento tra date.
Con Jquery è tutto molto semplice (vedi anche questo precedente post ),l'unica piccola complicazione è data dal fatto che il formato delle date in jquery è diverso da quello utilizzato da Java.
In questo caso si noti come il formato jquery "dd/mm/yy" sia equivalente a quello Java "dd/MM/yyyy"
La lista dei formati usati da jquery si trova qui.

Di seguito la jsp :


<%@page import="java.util.Date"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@ 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">
<html lang="en">
<head>
<meta charset="utf-8" />
<title>jQuery UI Datepicker - Display month &amp; year menus</title>
<link rel="stylesheet" href="http://code.jquery.com/ui/1.10.0/themes/base/jquery-ui.css" />
<script src="http://code.jquery.com/jquery-1.8.3.js"></script>
<script src="http://code.jquery.com/ui/1.10.0/jquery-ui.js"></script>
<link rel="stylesheet" href="/resources/demos/style.css" />
<script>
$(function() {
$( "#datepicker" ).datepicker({
changeMonth: true,
dateFormat: "dd/mm/yy",
changeYear: true,
yearRange: "1970:2024",
defaultDate: "<%=new SimpleDateFormat("dd/MM/yyyy").format(new Date())%>"
});
});
</script>
</head>
<body>
<p>Date: <input type="text" id="datepicker" /></p>
</body>
</html>