Tu sei qui

Home » Blog » Blog di gtrev

[Parancoe] Validazione tramite DWR

pubblicato da gtrev il Lun, 02/04/2007 - 23:52

spacer
Continuo la serie dei post che riguardano i miei cotributi allo sviluppo di Parancoe.

Come ho già ricordato, Parancoe è una libreria pensata per lo sviluppo di applicazioni web che permetta allo sviluppatore di concentrarsi sul codice e lasciar stare la configurazione.

Se volete partecipare, andate a visitare il sito.

Quello di cui mi sto occupando in questo periodo è l'integrazione nel meccanismo DWR (Direct web remoting) nel processo di validazione dei dati.

DWR è un framework che rende semplice l'integrazione della tecnologia AJAX all'interno di applicazioni Java. In particolare propone un'ottima integrazione con Spring, sul quale Parancoe si basa.

L'idea che è venuta al team di Parancoe è di usare DWR per richiamare la validazione via javascript.

Supponiamo di avere una form di inserimento dati. Attualmente la validazione di questa form avviene solo lato server.

Utilizzando DWR si potrebbe validare il campo appena questo è stato editato, risparmiando all'utente l'invio di una form sintatticamente non corretta.

Le operazioni da fare per l'integrazione di DWR con la libreria di validazione di Parancoe sono:

  1. Definire un entry point unico richiamabile via Ajax
  2. Integrare la configurazione di DWR all'interno di Parancoe in modo che lo sviluppatore trovi DWR già attivo di default
  3. Definire un custom tag da usare all'interno della JSP che integri la chiamata a DWR senza che lo sviluppatore debba scrivere codice javascript

In questo post mi concentrerò sul primo punto.

DWRValidator

Il meccanismo di validazione di Parancoe si basa sulla libreria springmodules-validator. Per chi fosse interessato ad una descrizione di tale libreria, rimando al post Validazione in Parancoe.

La classe che compie la validazione è la classe BeanValidator. Tale classe eredita da Validator che mette a disposizione un metodo di validazione la cui firma è:

/**
* Applies all validation rules as defined in the
* {@link org.springmodules.validation.bean.conf.
* BeanValidationConfiguration}
* retrieved for the given bean from the configured
* {@link org.springmodules.validation.bean.conf.loader.
* BeanValidationConfigurationLoader}.
*
* @see Validator#validate(Object, org.springframework.validation.Errors)
*/
public void validate(Object obj, Errors errors) { ... }

Questo metodo si aspetta un'istanza dell'oggetto da validare (obj), istanza creata da Spring a partire dai dati inseriti nella form. La firma di questo metodo non lo rende facilmente integrabile con DWR.

Per poter integrare DWR è necessario creare una classe che esponga un metodo la cui firma preveda come attributi degli oggetti di tipo stringa. Una sorta di:

public String validateDWR(String beanId,
String propertyName,
String propertyValue)

L'idea è quindi quella di ricondursi alla validazione di springmodules passando per il metodo validateDWR. A questo scopo, un metodo interessante di BeanValidator è il seguente:

/**
* Applying the given validation rules on the given property of
* the given object.
* The validation stops as soon as one of the validation rules
* produces validation errors.
* This errors are then registered with the given {@link Errors)
* instance.
*/
protected void validateAndShortCircuitRules(ValidationRule[] rules,
String propertyName, Object obj, Errors errors)

Questo metodo si aspetta sempre un'istanza dell'oggetto in esame, ma si limita a validarne una singola property. Si potrebbe quindi creare un'istanza dell'oggetto in esame e settarne la singola property (propertyName) con il valore passato in ingresso (propertyValue).

Il problema adesso si sposta nella inizializzazione dell'oggetto sotto esame. L'obbiettivo è di non dover creare un metodo per ogni oggetto che dovrà essere validato. A questo scopo ci viene in aiuto il terzo parametro del metodo prototipato inizialmente, ovvero beanId.

Il valore che assume beanId, come ci si può aspettare è il nome dell'oggetto come viene definito nel file di configurazione di Parancoe. Tutti i bean registrati in quel file sono consultabili andando ad interrogare l'application context di Spring.

La classe che esporrà il metodo validateDWR dunque estenderà da BeanValidator per avere il metodo validateAndShortCircuitRules e implementerà l'interfaccia ApplicationContextAware che le permette di avere il contesto di Spring da analizzare.

I passi per una possibile implementazione della classe di validazione con dwr saranno dunque:

Recupero del tipo del bean dal contesto di Spring

// recupero la classe del bean da validare
Class clazz = applicationContext.getBean(beanId).getClass();

// carico le regole di validazione per la classe in esame
BeanValidationConfiguration configuration =
configurationLoader.loadConfiguration(clazz);

// recupero le regole di validazione per la property in input
ValidationRule[] rules = configuration.getPropertyRules(propertyName);

Asseganzione del valore in input alla property

// mi creo un'instanza dell'oggetto in esame a cui assegno
// propertyValue
Object obj = clazz.newInstance();
BeanWrapper wrapper = new BeanWrapperImpl(obj);
PropertyValue val = new PropertyValue(propertyName, propertyValue);
wrapper.setPropertyValue(val);

//Mi creo un oggetto dove mettere gli eventuali errori
Errors errors = new BeanPropertyBindingResult(obj, beanId);

Validazione

//compio la validazione
validateAndShortCircuitRules(rules, propertyName, obj, errors);

return getValidationMessage(errors, propertyName);

La classe va un po' sgrezzata, però è già funzionante (almeno per i tipi String, per altri tipi di oggetti, come le date non è ancora pronta).

Allegato al post trovate uno zip contenente un progetto maven con il sorgente della classe e un piccolo testcase.

AllegatoDimensione
spacer dwrvalidator-src.zip6.82 KB
Programmazione: 
parancoe
spring
validazione
dwr
  • Blog di gtrev

Commenti

Non ci capisco nulla... Sono

Collegamento permanente Inviato da era77 il Mar, 03/04/2007 - 15:09.
Non ci capisco nulla... Sono un povero programmatore C++ io....
  • rispondi

Eh ciò, devi scrivere

Collegamento permanente Inviato da gtrev il Mar, 03/04/2007 - 16:39.
Eh ciò, devi scrivere qualche articolo sul c++ allora...spacer
  • rispondi

Ma non annoierebbe parlare

Collegamento permanente Inviato da era77 il Mer, 04/04/2007 - 07:39.

Ma non annoierebbe parlare di classi template, puntatori vari, multi thread, real time e affini ????

Penso proprio che le "bueae" siano meglio accette...

 

  • rispondi

No, dai, un post ogni tanto

Collegamento permanente Inviato da gtrev il Mer, 04/04/2007 - 08:47.

No, dai, un post ogni tanto si può anche fare spacer

  • rispondi

Ottimo post, come sempre.

Collegamento permanente Inviato da Lucio Benfante il Mer, 04/04/2007 - 12:18.
Ottimo post, come sempre. Sul punto 2 (Integrare la configurazione di DWR all'interno di Parancoe in modo che lo sviluppatore trovi DWR già attivo di default) sto già lavorandoci io...spero di riuscire a committare qualcosa entro la fine della settimana
  • rispondi

Grazie Lucio, troppo buono

Collegamento permanente Inviato da gtrev il Mer, 04/04/2007 - 17:25.

Grazie Lucio, troppo buono spacer

Sul punto 3 (custom tag) non si era discusso, ma mi pare possa essere una comodità in più per lo sviluppatore, cosa ne pensi?

  • rispondi

Sicuramente. Dei custom tag

Collegamento permanente Inviato da Lucio Benfante il Mer, 04/04/2007 - 17:46.
Sicuramente. Dei custom tag ad un certo punto dovranno esserci, per velocizzare il lavoro di scrittura delle pagine...sempre nella filosofia di sviluppo di Parancoe...
  • rispondi

...aggiornamento...l'integraz

Collegamento permanente Inviato da Lucio Benfante il Ven, 06/04/2007 - 09:24.

...aggiornamento...l'integrazione è pronta e già nel CVS. Se volete guardate l'applicazione d'esempio, o rigeneratela usando l'archetype...e poi guardate nella pagina della lista delle persone. Notate che praticamente non si deve scrivere codice JavaScript, ma solo codice Java (e non in pagina).

L'applicazione d'esempio e la demo vengono generate con DWR in modalità debug, quindi potete vedere i bean esportati digitando l'indirizzo:

localhost:8080/<il vosto context>/dwr/index.html

Così già mi piace molto, anche se rimane da scrivere un po' di xml nella configurazione in parancoe-servlet.xml...ma è quasi il posto giusto...prossimamente vedrò se riesco a eliminare anche quella, trasferendola in annotations nelle classi(con rilevamento automatico delle classi da parte di DWR).

  • rispondi

...dimenticavo...per

Collegamento permanente Inviato da Lucio Benfante il Mer, 04/04/2007 - 14:00.
...dimenticavo...per era77...anche a me non dispiacerebbe un post su C++...ogni tanto, a piccole dosi spacer ...giusto per rispolverare il mio vecchio Stroustrup (...fermi lì, non è una parolaccia, nè ci sono doppi sensi... spacer )
  • rispondi

Se non sbaglio il sig.

Collegamento permanente Inviato da era77 il Mer, 04/04/2007 - 17:56.

Se non sbaglio il sig. Stourstrup è uno dei padri della filosofia del C++ ed autore della guida del C++ più famosa, mi pare si chiami il linguaggio C++ o programmare in C++... Insomma un nome originale....

Allora farò un piccolo post prossimamente... Gestione thread mediante stati e non via semafori vi piace ? Bah.. Oppure righe di assembler in codice c++ pevelocizzare alcune routine tipo... Bah..

  • rispondi

ehm..."se non

Collegamento permanente Inviato da Lucio Benfante il Mer, 04/04/2007 - 23:41.
ehm..."se non sbaglio"?!?!?!...un programmatore C++ che può sbagliarsi sul creatore del suo linguaggio? spacer ...con i soldi che avanzeranno dalla colletta per comprare Kitt, chiedi a gtrev di regalarti una copia di "The C++ Programming Language"...è un po' come se a un prete mancasse il Vangelo...spacer
  • rispondi

Il fatto è che il C++ è

Collegamento permanente Inviato da era77 il Ven, 06/04/2007 - 08:21.

Il fatto è che il C++ è figlio stretto del C che è stato creato da Ritchie alla mitica AT&T nel 1970. Il C++ è senza dubbio stato pensato e inizialmente sviluppato da Stoustrup che se non sbaglio l'aveva chiamato "C ad oggetti"... Insomma, secondo voi è il papà o il tutore ? Mah... Il C++ se non sbaglio è dei primi anni 80...Quindi era un C giovincello... O per le ere informatiche un C maturo !

Ecco....

  • rispondi

...pochi dubbi su

Collegamento permanente Inviato da Lucio Benfante il Ven, 06/04/2007 - 09:40.

...pochi dubbi su questo...ne è decisamente il (principale) papà...

Stroustrup (nel senso del libro) alla mano:

"I invented C++, wrote its early definitions, and produced its first implementation. I chose and formulated the design criteria for C++, designed all its major facilities, and was responsible for the processing of extension proposals in the C++ standars committee. Clearly, C++ owes much to C..."

...sulla prima copertina del libro c'è scritto "Bjarne Stroustrup - The Creator of C++"

  • rispondi

Io il libro non ce l'ho!Non

Collegamento permanente Inviato da era77 il Ven, 06/04/2007 - 13:39.

Io il libro non ce l'ho!

Non è che puoi spedirmelo ?

spacer

  • rispondi

...spedirtelo no...però se

Collegamento permanente Inviato da Lucio Benfante il Mar, 10/04/2007 - 15:56.

...spedirtelo no...però se te ne basta la foto...spacer

 

spacer

  • rispondi

Che bello! Anche io voglio i

Collegamento permanente Inviato da gtrev il Mar, 10/04/2007 - 18:22.
Che bello! Anche io voglio i libri di Knuth!!!
  • rispondi

...e hai notato che lì in

Collegamento permanente Inviato da Lucio Benfante il Mar, 10/04/2007 - 19:15.

...e hai notato che lì in mezzo c'è pure un libro di Eckel (in italiano)?

...tornando a Knuth...avrete sicuramente notato che mi mancano gli aggiornamenti...se non sapete cosa regalarmi a Natale...spacer

  • rispondi

Cavoli quanti libri

Collegamento permanente Inviato da era77 il Mer, 11/04/2007 - 07:32.

Cavoli quanti libri interessanti! Non è proprio che puoi farne un pacco e mandarmeli tutti assieme ???

spacer

  • rispondi

mi viEne da dire:MA DDE CHE

Collegamento permanente Inviato da gUIDO il Mer, 04/04/2007 - 13:18.

mi viEne da dire:

MA DDE CHE AO ?!?

  • rispondi

Scusami gUIDO. Prometto un

Collegamento permanente Inviato da gtrev il Mer, 04/04/2007 - 17:27.

Scusami gUIDO.

Prometto un post sull'mbuto al più presto.

  • rispondi

BRAVO!Ehm....Cos'è l'mbuu?

Collegamento permanente Inviato da era77 il Mer, 04/04/2007 - 17:57.

BRAVO!

Ehm....

Cos'è l'mbuu?

spacer

  • rispondi

Qualcuno mi dice cos'è stò

Collegamento permanente Inviato da era77 il Mer, 11/04/2007 - 07:33.

Qualcuno mi dice cos'è stò 'mbutu?

Pèffavore...

  • rispondi

Guarda qua, quarta

Collegamento permanente Inviato da gtrev il Mer, 11/04/2007 - 08:57.
Guarda qua, quarta citazione. La mittttica vulvia!!!!
  • rispondi

Credo di aver capito...

Collegamento permanente Inviato da era77 il Mer, 11/04/2007 - 12:02.
Credo di aver capito... Altrimenti vedrò Rieducational Channellllllll
  • rispondi

Aggiungi un commento

Il contenuto di questo campo è privato e non verrà mostrato pubblicamente.

Altre informazioni sui formati del testo

Plain text

  • Nessun tag HTML consentito.
  • Indirizzi web o e-mail vengono trasformati in link automaticamente
  • Linee e paragrafi vanno a capo automaticamente.
By submitting this form, you accept the Mollom privacy policy.

About This Site

Questo sito pubblica i propri contenuti con licenza Creative Commons.
Per maggiori informazioni andate qua.
Per contattarmi: spacer
Questo sito è gratuito, e non usa alcun tipo di pubblicità.
Se mi vuoi aiutare a tenerlo vivo, se hai trovato qualcosa di utile, oppure se sei Bill Gates e non sai più dove buttare i soldi, prova a pensare ad una donazione:

spacer
gipoco.com is neither affiliated with the authors of this page nor responsible for its contents. This is a safe-cache copy of the original web site.