Programación de un lector de huella digital en Java. Parte 1.
Como moyal ohem eme nc i o na doa nt e r i o r me nt e,enl aac t ual i dadl as egur i dadenl ast r ans ac c i ones e l e ct r ó ni c ass eh av ue l t oun ap ar t ei n di s pe ns ab l ep ar al o sp r o gr a ma ma do r e sd es i s t ema s,l a i d en t i fi c ac i ó np ar ae la c ce soal o sr e gi s t r o sydemá sc u es t i on esr e l a ci o na da sd eb end es e r t o ma ma da se nc u en t apa r apo de rv a l i d arq uea l g un ap er s o nae s t áa c c ed i e nd or e al me nt eal oq ue d eb ea c c ed er ,e ses e nc i a lh ac e rq ue( e nme di d ad el op os i b l e )n ad i ep ue dah ac e r s ep as a rp or a l g ui e nq uen oe sa lmo me me nt od ei d en t i fi c a r s ee nu ns i s t e ma ma .Aq uíe sd on del ab i o me me t r í a j uegaunpapels umament ei nt er es ant e( mási nf or mac i óns obr el abi omet r í a enés t ear t í c ul o) as íqued edi c ar éunas er i edear t í c ul o sat r at ardee xp l i c arc ómopr ogr ama ru nl e ct ordehuel l a di gi t alenJ av aut i l i z andoal gunasher r ami ent asyAPI ' squenosper mi t i r ánr eal i z art odosl os pr oc edi mi ent os
s i n
ni ngún
pr obl ema .
Pr i mer ame ment ehabl ar édel oquenecesi t amo mospar apoderempezarapr ogr ama marunsi st ema ma c ompl et oder egi s t r oyv er i fi cac i óndei dent i dadespormedi odel ahuel l adi gi t al : •
El J RE( J a v aRu nt i meEn v i r o nme nt )má sr e ci e nt e,a lmo me me nt odel ap ub l i c ac i ó nd e es t ear t í c ul oesl a1 . 6 . 7 .
•
I DEd ep r o gr a ma ma c i ó nNet nN Beans ensuv er s i ónmá má sr e c i en t e ,al mo me me nt odepu bl i c ar es t ear t í c ul oesl a6. 1.Cabemenc i onarqueel v í nc ul oquei ndi c oc ont i enev ar i as v e r s i o ne s ,s epu ed ed es c a r g arc u al q ui e r aqu ec u en t ec onel Ba s eI DEyJ a v aSE.
•
Unl ec t ordehuel l adi gi t al dec ual qui er ade e s t o smo de l o s .
•
El APId ep r o gr a ma ma c i ó n del ec t or esdehuel l adi gi t al deGr i aul epar aJ av a.
•
Unser vi dordebasesdedat osenMy MySQL.
Un av e zqu et e ne mo mo st o dol oan t e r i o rpr o ce de mo mo sc onl ai n s t a l a ci ó nde lAPId ep r og r ama ci ó n d eGr i a ul e( a s umoqu ee lNe t Be an syel s e r v i do rMy SQLy aes t á ni n s t a l a do syf u nc i o na nd os i n pr ob l emas ) .I Una v ez que hemos nst al aci ón del API de pr ogr ama maci ón de Gr i aul e: : d es c a r g ad oe lAPIt e nd r e mo mo sunar c h i v ol l a ma ma do Fi , nge r p r i nt _ SDK_ Ja va _2 00 7_ I ns t a l l e r . j a r par ac omenz arl ai ns t al ac i óns er eal i z al os i gui ent e: 1. Do bl ecl i cs obr eel ar c hi v o,a par ec er áunav ent anaqu enospi deel egi rel i d i oma, s e l e c ci o nael q uede see s . 2 . Po st e r i o r me nt ea par e cel ap an t a l l adeb i en v en i d ays is ed ac l i cenSi g ui e nt ea pa r e ce n l ost ér mi nosdel al i c enc i a,l oscual essedebeac ept arpar apoderc ont i nuar . 3. Unav ezhe chol oant e r i o rs es el ec c i onal ar ut adondesei ns t a l ar á,aqu ís ed ej anl os v al or espordef ec t o. 4 . De s pu ésdel ar u t ad ei n s t a l a ci ó ns ed eb eel e gi rl o se l eme nt o sq ues ei n s t a l a r á n,d e i g ua lma ne r as ed ej at o doma r c ad oys ed ac l i cenSi g ui e nt e .
5. Pos t e r i o r ment es ei n st al anl o se l ement o ss el ec c i onad os ,dej andoal fi nal l ai ns t al a ci ón del c ont r ol ador .NOTA: Esd es u mai ma mp or t a nc i at o ma ma re nc u e nt aqu ea n t e sd el a i ns t al ac i óndel l ec t ordehuel l adi gi t al ,es t es edebedet enerdes c onec t adoyde pr ef er enc i ades i ns t al arel s of t war eycont r ol ador esquev ení anc onél def ábr i c apar a ev i t arc onfl i c t osdur ant el aac t ual i ns t al ac i ón. 6. Ahor aapar ec eunapant al l apar asel e cc i ona rel i di omadel ai n st al ac i óndel c o nt r o l a do r ,d ei g ua lma ne r asee l i g ee lq uemá má sc on v eng a. 7 . De s pu ésap ar e c el ap an t a l l ad eb i e nv e ni d a. . .
•
El APId ep r o gr a ma ma c i ó n del ec t or esdehuel l adi gi t al deGr i aul epar aJ av a.
•
Unser vi dordebasesdedat osenMy MySQL.
Un av e zqu et e ne mo mo st o dol oan t e r i o rpr o ce de mo mo sc onl ai n s t a l a ci ó nde lAPId ep r og r ama ci ó n d eGr i a ul e( a s umoqu ee lNe t Be an syel s e r v i do rMy SQLy aes t á ni n s t a l a do syf u nc i o na nd os i n pr ob l emas ) .I Una v ez que hemos nst al aci ón del API de pr ogr ama maci ón de Gr i aul e: : d es c a r g ad oe lAPIt e nd r e mo mo sunar c h i v ol l a ma ma do Fi , nge r p r i nt _ SDK_ Ja va _2 00 7_ I ns t a l l e r . j a r par ac omenz arl ai ns t al ac i óns er eal i z al os i gui ent e: 1. Do bl ecl i cs obr eel ar c hi v o,a par ec er áunav ent anaqu enospi deel egi rel i d i oma, s e l e c ci o nael q uede see s . 2 . Po st e r i o r me nt ea par e cel ap an t a l l adeb i en v en i d ays is ed ac l i cenSi g ui e nt ea pa r e ce n l ost ér mi nosdel al i c enc i a,l oscual essedebeac ept arpar apoderc ont i nuar . 3. Unav ezhe chol oant e r i o rs es el ec c i onal ar ut adondesei ns t a l ar á,aqu ís ed ej anl os v al or espordef ec t o. 4 . De s pu ésdel ar u t ad ei n s t a l a ci ó ns ed eb eel e gi rl o se l eme nt o sq ues ei n s t a l a r á n,d e i g ua lma ne r as ed ej at o doma r c ad oys ed ac l i cenSi g ui e nt e .
5. Pos t e r i o r ment es ei n st al anl o se l ement o ss el ec c i onad os ,dej andoal fi nal l ai ns t al a ci ón del c ont r ol ador .NOTA: Esd es u mai ma mp or t a nc i at o ma ma re nc u e nt aqu ea n t e sd el a i ns t al ac i óndel l ec t ordehuel l adi gi t al ,es t es edebedet enerdes c onec t adoyde pr ef er enc i ades i ns t al arel s of t war eycont r ol ador esquev ení anc onél def ábr i c apar a ev i t arc onfl i c t osdur ant el aac t ual i ns t al ac i ón. 6. Ahor aapar ec eunapant al l apar asel e cc i ona rel i di omadel ai n st al ac i óndel c o nt r o l a do r ,d ei g ua lma ne r asee l i g ee lq uemá má sc on v eng a. 7 . De s pu ésap ar e c el ap an t a l l ad eb i e nv e ni d a. . .
. . .aquís edac l i cenSi gui ent eoNex t . 8 . Seac ep t a nl o st é r mi n osdel al i c en ci ays ed ac l i cenSi g ui e nt eu np ard ev e c es . 9. Pos t e r i o r ment ep r e si on amosel bo t óndeI ns t al a roI ns t a l l pa r aqu es er eal i c el a i ns t al ac i óndel oscont r ol ador esdel l ec t or . 10 .Al t er mi nare lpr oc es os edac l i cene lbo t óndeSi gui ent eypos t er i o r ment ee nFi na l i z ar par at er mi narl ai ns t al ac i óndel c ont r ol ador . 11 .Unav ezhe choes t osesi guec onl ap ant al l ade lpr oc es odei n st al ac i óngener a l . . .
. . .ysedac l i cenSi gui ent eoNe xt . 1 2.Al fi n al s ed ac l i cene lb ot ónDo nep ar ac u l mi n ar . Un av e zt e r mi n ad al ai n s t a l a c i ó nd elAPIs ep ue de c o ne c t a rell e c t o rpa r at e r mi n ars u i ns t al ac i ón.Conect or ac on t i n uemo sc o nl os i g ui e nt e : arell ect ordehuel l adi gi t al : :Ah 1. Sec onec t ael l ec t ordehue l l adi gi t al . 2. Apar ec ee A ls i s t ent epar aNuev oHar dwar edeWi Wi ndows. 3. Ses el ecc i onaN aNoporelmome ment oys edac l i cenSi gui ent e. 4. Despué sseel i geI eI n s t a l a rau t o má má t i c amen t ee ls of t wa r er e c ome nd ad oys ed ac l i cen s i gui ent e. 5. Sees per aaq uet e r mi nel ai n st al ac i ón,el a si s t ent edebeder ec onoc er l oei ns t a l arl o s c o nt r o l a do r e sq uep r e v i a me me nt eh emo sa gr e ga doj u nt oc o ne lAPI .
6. Sedac l i cenFi nal i z arpar at er mi narl ai ns t al ac i ón.
Un av e zq ues et i e net o dol oa nt e r i o r Pr e pa r a ci óndel a sl i br e r í a sya r c hi v osne ce sa r i os : : c o r r e c t a me nt ei n s t a l a do y c o nfi g ur a do s ed eb en d ep r e pa r a rl a sl i b r e r í a s yl o sa r c h i v o s c ol oc ándol osenl osdi r ec t or i osquedebendees t ar ,par ael l os er eal i z al os i gui ent e: 1. Seab r el ac ar pe t adel asl i br er í asdel API ,s i s ehad ej adop orde f ec t oapar ec er á enC: \ Ar c hi v osdepr og r ama\ Gr i aul e\ Fi ng er pr i ntSDKJ a v a2007\ bi n 2 . Sec o pi ael a r c h i v ogr finger j av a. j ar hac i al asc ar pet asC: \ Ar c hi v o sdepr og r ama\ J av a \ j dk * \ j r e\ l i b\ ex t ( dondej dk *e sl av er s i ónquet i enesi ns t al ada,s it i enesvar i assepuede c ol oc are nt odas )yenl ac ar pe t aC: \ Ar c hi v osdepr ogr ama\ J av a\j r e* \ l i b\ ex t ( dondej r e* esl aver s i ónmásr ec i ent e) . 3 . Ses el e c ci o na nys ec o pi a nt od osl o sar c hi v o s. dl l q ues ee nc ue nt r a ne nl aca r p et ade l a sl i br er í a sd el APIys epeg ane nC: \ Wi ndows\ Syst em32 Y ar e al i z ado sl o sp as osant er i or esúni c ament eno sf al t a Pr epar aci óndel abasededat os: : c r e aru nab as ed ed at o sq ueal ma c en el o sr e gi s t r o sd el a sh ue l l a s,e ne s t eca sopr e pa r ar emo s d en t r odedi c haba seun at a bl as en ci l l aqu ec on t e ng aú ni c ame nt e3d at o s,u nI D,e ln omb r ede l ap er s o nayl ah ue l l ar e gi s t r a da .Pa r ae f e ct o sd ee s t ee j e mp l ou s ar e mo su nab as ed ed at o s denombr ehue l l a syunat abl adent r odedi chabasedenombr esomhueq uec o nt e nd r ál o s dat osdes cr i t osac ont i nuac i ón: 1. Nombr edec ampo :I i po:I D,t NT( a ut oi nc r e me nt ) 2. Nombr edec ampo :huenombr i po:VARCHAR( e,t 10 0) 3. Nombr edec ampo :hue i po:BLOB hue l l a,t Yat e ne mo st o dop ar ac o me nz a rapr o gr a ma rn u es t r aa pl i c a c i ó nd er e c on oc i mi e nt od eh ue l l a di gi t alper oe sol odej ar emo sp ar al as i gui ent epa r t e.¿Al gu nadu daoal goqu éde ci r ?Dej at u c omen t a r i o.
Programación de un lector de huella digital en Java. Parte 2. Co nt i n ua nd oc o nl ap r o gr a ma ci ó nd eunl e ct o rd ehu el l ad i gi t a le nJ a v ap r o c ed er e mo se ne s t e c as oy adi r e ct amen t ec one lc ódi go,l aen t r eg aant er i ors er efi r i ómer ament eal ap r epa r ac i ó n delent or no pa r ae ld es ar r ol l o,s ino l a ha sl eí do t er ec omi endo v e r i fi c ar l a,ent ender l ay r e al i z a r l ap r i me r oa nt e sd ep r o c ed erc o ne s t oy aq ue d el oc o nt r a r i on of u nc i o na r ál a apl i c ac i ón.
Comenz ando
c on
1. Cr eamos
un
l as
pr oy ec t o
i ndi c ac i ones ,
enNet Beansc on
har emos
l o
s i gui ent e:
el nombr eEj e mpl oLe ct or Hue l l a s.
2 .De nt r od el p r o y e c t oc r e aru np aq ue t ed en omb r e pr t r odeno mb r ei . ocedi mi ent osyo nt er f az
3. Den t r o
de
pr oc ed i mi ent os c r ea r un a
c l as e J ( av a
Cl as s ) l l amadaUt . i l
4. En l a defi ni ci ón de l a cl as e ut i l agr egari mp l eme nt s I St a t u sEv e nt L i s t en er , I I ma ge Ev e nt L i s t en er ,
I Fi n ger Ev e nt L i s t e ne r y
s us
c or r es pon di ent es
i mpor t s . . .
import
com.griaule.grfingerjava.FingerprintImage;
import
com.griaule.grfingerjava.IFingerEventListener;
import
com.griaule.grfingerjava.IImageEventListener;
import
com.griaule.grfingerjava.IStatusEventListener;
public
class
IImageEventListener,
Util
implements
IStatusEventListener, IFingerEventListener{
. .
5.Ali mpl eme nt ard i c hasi n t er f a cesno sped i r áni mpl ement a r t odo ss usmé t odosabs t r a ct os ,l o
h ac emo sda nd ou nc l i ce ne lf o coqu ea pa r e cede ll a doi z qu i e r d oys e l e c ci on an do " I mpl ement al labs t r ac tmet hods " l oc ua lg en er a r ál ai mp l e me nt a c i ó nd e5mé t o do s( mo di fi c ael n omb r ed e l os
ar gument os
par a
mej or
r ef er enc i a)
:
public void onSensorPlugString idSensor! "" evento #ue se genera al conectar
el
lector
de
$uella
public void onSensorUnplugString idSensor! "" evento #ue se genera al desconectar
public
void
el
lector
onImage%c#uiredString
de
idSensor,
$uella
FingerprintImage
$uella&igital! "" evento #ue se genera al obtener una imagen de la $uella
public void onFinger&o'nString idSensor! "" evento #ue se genera al colocar
un
dedo
en
public void onFingerUpString idSensor! levantar
el
el
lector
"" evento #ue se genera al
dedo
del
lector
Ca beme nc i o na rq u en ou t i l i z a r e mo st o do sl o se v e n t o se ne s t ee j e mp l op e r os ed eb end e i mp l e me n t a rp ar aq uee lc o mp i l a do rn oma r q uee r r o r e sy aq uep r o v i e n end eu n ai nt er f ac e.
6. Modi fic amos l os mét odosonSensor a que que den de l a Pl ugyonSensor Unpl ugpar s i gui ent e
maner a:
public
void
onSensorPlugString
idSensor!
{
tr(
{
)rFinger*ava.start+aptureidSensor,
catc$
t$is,
)rFinger*avaE-ception
t$is!; e!
{
e.printStac/race!;
public
void
onSensorUnplugString
idSensor!
tr(
{ {
)rFinger*ava.stop+aptureidSensor!;
catc$
)rFinger*avaE-ception
e!
{
e.printStac/race!;
L oa nt e r i o re sp ar ae v i t a rp r o bl e ma se nl ac a pt u r aa lmo me nt od ec o ne c t a ryde s c on ec t a re l l ec t or , par a que el c ompi l ado r no mar que er r or es deb emos i mpor t ar l as c l as esGr . . Fi nger JavayGr Fi nger JavaExcept i on.
import
com.griaule.grfingerjava.)rFinger*ava;
import
com.griaule.grfingerjava.)rFinger*avaE-ception;
Los demás mét odos que se i mpl ement ar on deben de quedarv ací os ( porelmoment o) .
7.Ahor ac r eamo sunmé t odoe st át i c oqueno sper mi t ae st abl ec ereldi r e ct or i odel asl i br er í as del SDK
"00 0 Establece el directorio donde se ubican las librer1as nativas del
S&2 0" public
directorio!
static
void
setFingerprintS&23ative&irector(String {
File
director(
4
ne'
Filedirectorio!;
tr(
{
)rFinger*ava.set3ativeLibraries&irector(director(!;
)rFinger*ava.setLicense&irector(director(!;
catc$
)rFinger*avaE-ception
e!
{
e.printStac/race!;
y
el
i mpor t
del a
c l as e
Fi l e c or r e spondi ent e :
import
java.io.File;
8.Pos t er i or ment eag r e gamosl o ssi g ui e nt e sobj e t o syv ar i abl e si nmed i at ame nt edes puésd el a defi ni c i ón
de
l a
c l as e:
"00+onte-to utili5ado para la captura, e-tracci6n ( coincidencia de $uellas
digitales
private
0"
7atc$ing+onte-t
fingerprintS&2;
"00Interfa5 de usuario donde se muestra la imagen de la $uella0" private
"00
Indica
PantallaPrincipal
si
la
plantilla
o
ui;
template
debe
ser
e-tra1da
autom8ticamente0" private
"00
+ontiene
boolean
localmente
private
"00+ontiene private
autoE-tract
los
datos
de
la
4
$uella
9(te%rra(InputStream
la
longitud int
del
true;
capturada
0"
fingerprint&ata;
dato
de
la
$uella0"
fingerprint&ataLengt$;
"00
La
imagen
de
private
"00
:ltima
$uella
digital
capturada.
FingerprintImage
La
plantilla
de
public
. . .
la
la
:ltima
fingerprint;
imagen
de
$uella
capturada
/emplate
c on
s us
0"
0"
template;
c or r es pondi ent es
i mpor t s
. . .
import
com.griaule.grfingerjava.7atc$ing+onte-t;
import
interfa5.PantallaPrincipal;
import
java.io.9(te%rra(InputStream;
ed eb ea gr e ga r' i mpor ti nt er f az . Pant al l aPr i nc i pal ; ' a únc ua nd on oe x i s t ea c t u al me nt ey a Not a:s que
s e
c r ear á
en
l os
pas os
s i gui ent es .
9 .Ah or ac r e ar e mo sl ai nt er f azdeus uar i o,p ar ael l odamosc l i cder e choene lpaque t ei nt er f az y sel ecci onamosNew > J Fr ame For m, l e da mos por no mbr e ' ' . Pa nt a l l a Pr i nc i pa l
1 0.Ag r e ga mo sd osp an e l e s( Hu el l aDi g i t a lyAc c i o ne s ,c o mos emu es t r ae nl ai ma ge n)y4 bo t ones( Ver i fi c ar ,I dent i fi c ar ,Gua r darySal i r )demaner aquequ ed enpa r ec i doal os i gu i ent e:
1 1.No mb r a mo sl o sb o t o ne st a lc u a ls ue t i q ue t ap er oa nt e po ni e nd ol a sl e t r a sb t n ,e s dec i r ,bt vament e, el panel de Huel l a Di gi t al l o bt nVe r i fic ar nI de nt i fic ary así sucesi nombr amos
' ' . panel Cont enedor
1 2.Es t a bl e c emo se lpanel l i cder ec hos obr eé l Cont enedorconunBor der Layoutdandounc >
Set
Lay out
>
Bor der
Lay out
1 2.Yaq uet e ne mo sl oa nt e r i o rn o sv a mo sal av i s t ad ec ó di g oyag r e ga mo sl o ss i g ui e nt e s obj et os . . .
""objeto usado para reali5ar todas las operaciones relacionadas al FingerprintS&2 private
""Panel private
""Imagen private
para
Util
mostrar
*Panel
de 9ufferedImage
procedimientosS&2;
la
$uella
fingerprint
la
digital 4
$uella fingerprintImage
null;
actual 4
null;
. . .
c on
s us
c or r es pondi ent es
i mpor t s
. . .
import
java.a't.image.9ufferedImage;
import
java-.s'ing.*Panel;
import
procedimientos.Util;
. . .l os obj et os deben i r dent r o de l a cl ase per o f uer a de cual qui er mét odo.
13.Nuevament emodi ficamosl acl aseUt gr e ga nd ou nc o ns t r u ct o rs ob r e c ar g ad oqu er e ci b a i la un
obj et o
de
public
t i poPa nt al l aPr i nc i palde
l a
s i gui ent e
UtilPantallaPrincipal t$is.ui
maner a:
ui!
{
4
ui;
1 4.Po rúl t i mo e nl ac l a s eUt porelmoment o)agr egamos un mét odo que nos per mi t a i l( i ni c i al i z ar
l a
c apt ur a
de
l as
hue l l as ,
deb er á
de
qu ed ar
as í :
"00 0 Iniciali5a el Fingerprint S&2 ( $abilita la captura de $uellas. 0" public
void
iniciali5ar+aptura! tr(
fingerprintS&2 ""Iniciali5a
la
4
{ {
ne'
7atc$ing+onte-t!;
captura
de
$uella
digital.
)rFinger*ava.initiali5e+apturet$is!; ""Si
catc$ ocurre
un
E-ception error
se
e!
cierra
la
{
aplicaci6n.
e.printStac/race!;
S(stem.e-it=!;
1 5.Ah or at r ab aj a r e mo sc o nl ac l a sePa ,l oquehar emosescr earunmét odo nt a l l a Pr i nc i pa l par ai ni c i al i z arl af or ma,es t abl ec i endoeles t i l ov i s ualy c r ean dounai ns t anc i adel ac l as eUt . i l Deber á
quedar
de
l a
s i gui ent e
maner a:
"00 0 Se establece el estilo visual de la aplicaci6n ( se reali5a la iniciali5aci6n 0
de #ue
la
contiene
los
clase
procedimientos
principales.
00" public
void
iniciali5ar!
{
tr(
{
UI7anager.setLoo%ndFeelUI7anager.getS(stemLoo%ndFeel+lass3ame!!;
catc$
E-ception
e!
{
S(stem.err.println>3o se pudo aplicar el estilo visual>!;
""+rea
una
instancia
t$is.procedimientosS&2
4
ne'
de
Util
Utilt$is!;
. . .
y
s u
i mpor t
import
c or r es pondi ent e:
java-.s'ing.UI7anager;
16.Agr egamosunal l amadaalmét odoi r odelc ons t r uc t ord el ac l as eyan t e s ni ci al i z ar ( )dent del
"0
mét odoi ni t Component s( )de
+rea
una
nueva
public
t al
forma
maner a
de
que
quede
PantallaPrincipal
PantallaPrincipal!
as í :
0" {
iniciali5ar!;
init+omponents!;
1 7.Ah or ah ac e mo su nmé t o dop ar ac r e are lc o nt e ne do rd el ai ma ge nd el ah ue l l ad i g i t a l ,e n l os
c omen t ar i os
s e
v a
ex pl i c an do
l as
f un c i on es
de
c ad a
l í ne a. . .
"00 0 +rea el panel #ue contendr8 la imagen de la $uella digital 0" private ""+rea
*+omponent
un
panel
crearPanel?uella!
nuevo
para
fingerprint
""Se
sobreescribe
mostrar
4
el
la
ne'
m@todo
void
paint+omponent la $uella
paint+omponent)rap$ics
$uella *Panel!{
""para $abilitar la muestra de la imagen de public
{
g!
{
super.paint+omponentg!;
""Si
$a(
una
if
imagen
para
ser
mostrada
fingerprintImageA4null!
{
""+alcula el tamaBo ( posici6n de la imagen para ser
pintada ""el tamaBo es ajustado para #ue ocupe todo el
tamaBo
del Insets int int int 'idt$
panel insets
transC transD 4 getidt$!
4 4 4
getInsets!; insets.left; insets.top;
getInsets!.rig$t
getInsets!.left; int $eig$t 4 get?eig$t! getInsets!.bottom getInsets!.top;
""Se
dibuja
la
g.dra'ImagefingerprintImage, 'idt$,
imagen
transC,
transD,
$eig$t,
null!;
;
""Se
agrega
un
borde
alrededor
fingerprint
del
panel
+ompound9order
Empt(9order
,,,!,
9evel9order9evel9order.LGEHE&!!!;
""si no $a( e-iste el panel de la $uella no devuelve nada...
iffingerprint
else{ ""
de
lo
contrario
null; devuelve
return
el
panel
mismo
fingerprint
. . . y
se
agr egan
l os
i mpor t s
co r r es pondi ent es
par a
ev i t ar er r or es
. . .
import
java.a't.)rap$ics;
import
java.a't.Insets;
import
java-.s'ing.*+omponent;
import
java-.s'ing.border.9evel9order;
import
java-.s'ing.border.+ompound9order;
import
java-.s'ing.border.Empt(9order;
18.Unavezhechoest onosvamosal avi st adedi señodel acl ase Pa ,s i n nt a l l a Pr i nc i pa l sel ecc i onar ni ngún el ement o damos cl i c der echo sobr e elJFr amey p os t e r i o r me nt e s e l e c c i o na mo sEv ent s
>
Wi ndow
>
Wi ndowAc t i v at ed. . .
. . . l o c ual nos l l ev ar á a l a v i s t a de c ódi go de l a c l as e, den t r o del mét odof egamos elcó di go de maner a que quede de l a or mWi ndowAct i vat ed,ahíagr s i gui ent e
private
f or ma:
void
formindo'%ctivatedjava.a't.event.indo'Event
evt!
{
t$is.panel+ontenedor.addcrearPanel?uella!!;
19.Ahor acr eamoselmét odo showI ueno sp er mi t i r ámo s t r a rl ai ma ge nc ap t ur a dapo r mageq e ll e c t o ren e lp a n elc o r r e s p on d i e nt e .Elmé t o do d eb eq ue da rde l as i g ui e nt e ma ne r a :
"00
0
7@todo
utili5ado
0
en
para
mostrar
el
la
imagen
de
panel
la
$uella
correspondiente. 0"
public
void
s$o'Image9ufferedImage
image!
{
""Utili5a el imageProducer para crear una imagen de la $uella digital fingerprintImage ""Se
dibuja
la
4
image;
nueva
imagen
repaint!;
20.Una vezhecho est o vamosa l a cl aseUt gr e g amo se lc ó d i g oc o r r e s p on d i e nt ea l i lya mét odoonI eadoali mpl ement arl asi nt er f ac es, elmét ododebe mageAcqui r edque sehacr quedar
as í :
"00 0 Este m@todo es llamado cada ve5 #ue la imagen de una $uella $a sido
capturada. 0" public
void
onImage%c#uiredString
idSensor,
FingerprintImage
$uella&igital! ""%lmacena
{ la
imagen
de
la
$uella
t$is.fingerprint4$uella&igital;
""7uestra
la
imagen
obtenida
ui.s$o'Image$uella&igital!;
21.Ahor aenelc ons t r uc t ordel ac l as e Pant ag r e ga mo sl a ss i g ui e nt e s3l í ne as : al l aPr i nc i pal
"0Iniciali5a
la
captura
de
$uellas0"
procedimientosS&2.iniciali5ar+aptura!;
"0centra
la
ventana
en
la
pantalla0"
setLocationHelative/onull!;
"0$ace
visible
la
ventana0"
set
22.Agr egamoselevent oAct lb ot ón' Sal i r 'd an doc l i cd er e c hos ob r eé le n i onPer f or medde v i s t ad ed i s e ño ys e l e c c i o na nd oEv e n t s> Ac t i o n> Ac t i o nPe r f o r me dyd en t r od elc ó di go gener ado
agr egamos
el
mét ododi s pos e( ) ;
2 3.Pa r aq uen ue s t r op r o gr a map ue dae j e c ut a r s en ec e s i t a mo sma nd ar l ol l a ma rd es d el ac l a s e ma i n ,e ne s t ec a soad emá sd el l a ma ral av e nt a nas en ec es i t ae s t ab l e ce re ld i r e ct o r i od el a s l i br er í as , en co nj unt o, el mét odo mai n de l a cl as e mai n debe quedar as í :
public
static
void
String
mainStringJ
grFinger3ative&irector(
args! 4
{ ne'
File>.>!.get%bsolutePat$!;
Util.setFingerprintS&23ative&irector(grFinger3ative&irector(!;
PantallaPrincipal
p
4
ne'
PantallaPrincipal!;
Un av e zhe ch oe st op od emo sc o r r e rl aap l i c ac i ó nc onF6yv e r i fi c arqu er e al men t ef u nc i on e,s i hasr eal i z adol osp as ost alc ualpodr ás ,ha st aes t emoment o,a ct i v arell e ct ordehuel l asy obt en erl al ec t ur adel ahue l l aques ehac ol oc adoenell e ct or ,a únno sf al t aes pec i fi c arc ómo v er i fi car ,i dent i fi caryguar darl ashuel l asper oes ol odej ar emospar al apr óx i maent r ega.
Programación de un lector de huella digital en Java. Parte 3.
Siguiendo con el tutorial para la programación de un lector de huellas en Java (si no has leído la parte 1 y parte 2 te recomiendo hacerlo antes de proceder) en este caso explicaré cómo almacenar los registros de las huellas en una base de datos en MyS!" anteriormente en la parte 1 hemos creado la base de datos con # columnas (el id" los datos de la huella y el nombre de la persona $ue la registró) ahora pasemos al código% Recapitulando...
•
•
Se tienen &nicamente # clases en el proyecto' la clase ejemplolectorhuellas.Main " interfaz.PantallaPrincipal y procedimientos. Util" donde Main es a través de la cual se arranca el programa" antallarincipal es la intera* y +til es la clase $ue contiene los procedimientos% ,l reali*ar todos los procedimientos de la parte 2 del tutorial y e-ecutar el programa se debe de enceder el lector de huellas" al colocar el dedo sobre el lector debe de aparecer la imagen de la huella capturada%
./asta a$uí todo bien0 Si tu respuesta es airmativa contin&a con los siguientes pasos" de lo contrario regresa a las partes anteriores y veriíca $ue no tengas errores en la codiicación% Agregar
los
objetos
para
las
consultas
en
procedimientos.Util::
,brimos la clase procedimientos%+til y agregamos al inicio de la misma los siguientes ob-etos'
"00+one-i6n a la base de datos0" private +onnection db+onnection; "00+onsultas preparadas00" private PreparedStatement guardarStmt; private PreparedStatement identificarStmt; private PreparedStatement verificarStmt;
!os ob-etos anteriores se utili*arn para crear la conexión a la base de datos y reali*ar consultas en la misma" para poder reali*ar lo anterior debemos de crear un par de métodos como se muestran a continuación'
"00 0 Iniciali5a la cone-i6n a la base de datos ( prepara las operaciones para insertar, 0 eliminar ( modificar los datos 0" private void init&9! { tr( {
""+arga el driver G&9+ +lass.for3ame>com.m(s#l.jdbc.&river>!; ""Se conecta a la bd db+onnection 4 &river7anager.get+onnection>jdbcKm(s#lK"" servidor KMN"$uell as>,>usuario>, >contrasena >!; Statement stm 4 db+onnection.createStatement!; ""Prepara
las
consultas"sentencias
#ue
se
utili5ar8n guardarStmt 4 db+onnection.prepareStatement>I3SEH/ I3/G som$ueid, $uenombre, $ue$uella! valuesO,O,O!>!; identificarStmt 4 db+onnection.prepareStatement>SELE+/ $ue$uella FHG7 som$ue>!; verificarStmt 4 db+onnection.prepareStatement>SELE+/ $ue$uella FHG7 som$ue ?EHE $uenombre4O>!; catc$ E-ception e! { e.printStac/race!;
"00 0 +ierra la cone-i6n a la base de datos ( libera los recursos empleados. 0" private void destro(&9! { tr( { ""Se cierran todas las sentencias guardarStmt.close!; identificarStmt.close!; ""+ierra la cone-i6n a la base db+onnection.close!; catc$ E-ception e! { e.printStac/race!;
!as partes en rojo deben ser rempla*adas por a$uellas $ue correspondan a tu coniguración del servidor MyS!% +na ve* $ue tenemos la conexión a la base de datos debemos hacer $ue el programa se conecte al iniciali*ar la clase procedimientos.Util " para ello debemos de agregar una llamada al método initDB() dentro del constructor de la misma para $ue al inal $uede de la siguiente manera'
public UtilPantallaPrincipal ui! { t$is.ui 4 ui; ""Iniciali5a la cone-i6n a la 9&. init&9!;
,ntes de poder guardar la huella (o la inormación de la huella) en la base de datos debemos de extraer el llamado Template o plantilla de la huella $ue es una representación matemtica de un mapa de la huella" es importante aclarar $ue no vamos a guardar la imagen de la huella sino este mapa a partir del cual se pueden comparar varias huellas o veriicar a $uién pertenece" existe la manera de guardar la imagen pero no se reali*ar dicho proceso en este tutorial debido a las siguiente ra*ones'
1. o es seguro tener la imagen de una huella capturada% 2. +na imagen ocupa muchísimo ms espacio en la base de datos" si se plantea utili*ar
para corroborar una considerable cantidad de huellas el proceso se vuelve inoperable% #% o es necesario tener la imagen de la huella para compararla con otra" basta con la plantilla $ue se extraer%
+na ve* aclarado el punto anterior procedamos a extraer la plantilla de la huella capturada agregando el método extract() a la clase procedimientos.Util de la manera siguiente'
"00 0 E-trae la plantilla de la imagen de la $uella actual. 0" public void e-tract! { tr( { ""E-trae la plantilla de la imagen. template 4 fingerprintS&2.e-tractfingerprint!; ""7uestra la plantilla en la imagen
ui.s$o'Image)rFinger*ava.get9iometricImagetemplate,fingerpr int!!; catc$ )rFinger*avaE-ception e! { e.printStac/race!;
3a $ue hemos creado el método extract() basta con mandarlo llamar desde el método onImageAcquired() para $ue este <imo $uede de la siguiente manera'
public void onImage%c#uiredString idSensor, FingerprintImage $uella&igital! { ""%lmacena la imagen de la $uella t$is.fingerprint4$uella&igital;
""7uestra la imagen obtenida ui.s$o'Image$uella&igital!; ""7uestra la plantilla en la imagen actual e-tract!;
+na ve* hecho lo anterior podemos correr el programa y capturar una huella" notaremos $ue se dibu-an algunas líneas verdes sobre la misma" dichas líneas son la representación de la plantilla $ue hemos extraído%
,hora viene la parte donde guardamos la plantilla de la huella en la base de datos% !o primero $ue hacemos es agregar el método guardarHuella() a procedimientos.Util de tal orma $ue $uede de la siguiente manera'
"0 0 )uarda los datos de la $uella digital actual en la base de datos 0" public void guardar?uella!{
""Gbtiene los datos del template de la $uella actual
fingerprint&ata 4 ne' 9(te%rra(InputStreamtemplate.get&ata!!; fingerprint&ataLengt$ 4 template.get&ata!.lengt$; ""Pregunta el nombre de la persona a la cual corresponde dic$a $uella String nombre 4 *GptionPane.s$o'Input&ialog>3ombreK>!; tr( { ""Establece los valores para la sentencia SL guardarStmt.setString=,>default>!; guardarStmt.setString,nombre!; guardarStmt.set9inar(Stream, fingerprint&ata, fingerprint&ataLengt$!; ""Ejecuta la sentencia guardarStmt.e-ecute!; catc$ SLE-ception e-! { ""Si ocurre un error lo indica en la consola S(stem.err.println>Error al guardar los datos de la $uella.>!; e-.printStac/race!;
4ras reali*ar lo anterior debemos de reali*ar import correspondiente a la clase J5ptionane' import javax.swing.Jption!ane
!o &nico $ue resta por hacer es mandar llamar el método guardarHuella() por medio del botón "uardar $ue aparece en la pantalla principal" para ello nos situamos en la pantalla principal y damos doble clic sobre el botón "uardar lo cual automticamente nos crea el método $ue se eect&a al presionar el botón" ahora solo basta mandar llamar el método de la siguiente manera'
private void btn)uardar%ctionPerformedjava.a't.event.%ctionEvent evt! { procedimientosS&2.guardar?uella!;
4ras reali*ar lo anterior" al e-ecutar el programa" capturar una huella y presionar el botón 6uardar podremos almacenar los datos de la huella digital en la base de datos y" posteriormente" podremos reali*ar operaciones de comparación y veriicación de identidades" pero esto lo de-aremos para la siguiente entrega%
Programación de un lector de huella digital en Java. Parte 4. Anteriormente hemos visto cómo capturar y guardar huellas digitales en una base de datos en MySQL (si no sabes a lo que me reiero lee las partes !no" #os y $res de este tutorial% ahora toca el turno a la veriicación de una identidad por medio de la huella e identiicación de una persona. Antes de continuar cabe aclarar(y con verificación e identificación& •
•
dierenciar%
a
lo
que
me
reiero
Verificación& 's el corroborar la identidad de una persona por medio de un dato previamente dado (como el nombre" una credencial" !)*" etc% y su huella digital" por e+emplo& yo digo que soy ,uan *-re y lo conirmo con mi huella digital. Identificación& 's el corroborar la identidad de una persona utiliando solamente su huella digital" por e+emplo& coloco mi huella digital y el sistema autom/ticamente sabe que soy ,uan *-re.
!na ve aclarado lo anterior" procedamos pues a analiarlo en base al código que hemos agregado para las consultas en la parte 0 del tutorial. Anteriormente agregamos un m-todo de nombre initDB() que es por medio del cual se inicialia la coneión y se preparan las consultas a la base de datos" dicho m-todo tiene" entre otras cosas" las siguientes lneas& identificarStmt 4 db+onnection.prepareStatement>SELE+/ 0 FHG7 som$ue>!; verificarStmt 4 db+onnection.prepareStatement>SELE+/ $ue$uella FHG7 som$ue ?EHE $uenombre4O>!;
Nota: anteriormente en la sentencia identiicarStmt se tena huehuella en lugar de 3" para ines de esta aplicación debemos de cambiarlo para que quede tal cual se muestra en las lneas anteriores. Aqu dierenciamos claramente que al momento de identiicar una huella seleccionamos todas las huellas de la base de datos (que posteriormente compararemos una por una con la que tenemos actualmente para identiicar a qui-n pertenece dicha huella%" pero al momento de veriicar solamente tomamos un registro de huella iltrando con el nombre de la persona a quien pertenece. 4$odo perectamente claro5 67. Sigamos con el código que va a realiar la primer unción& Verificar. "00 0
0" public void verif(String nom! { tr( { ""Gbtiene la plantilla correspondiente a la persona indicada verificarStmt.setString=,nom!; HesultSet rs 4 verificarStmt.e-ecuteuer(!; ""Si se encuentra el nombre en la base de datos if rs.ne-t!!{ ""Lee la plantilla de la base de datos b(te template9ufferJ 4 rs.get9(tes>$ue$uella>!; ""+rea una nueva plantilla /emplate reference/emplate 4 ne' /emplatetemplate9uffer!;
""compara las plantilas actual vs bd! boolean fingerprintS&2.verif(template,reference/emplate!;
coinciden
4
""Si corresponden, dibuja el mapa de correspondencia ( lo indica con un mensaje if coinciden!{ ui.s$o'Image)rFinger*ava.get9iometricImagetemplate, fingerprint, fingerprintS&2!!; *GptionPane.s$o'7essage&ialogui, >Las $uellas s1 coinciden>!; else { ""&e no ser as1 lo indica con un mensaje *GptionPane.s$o'7essage&ialogui, >3o corresponde la $uella con >Qnom, >Error>, *GptionPane.EHHGHR7ESS%)E!; ""Si no encuentra alguna $uella correspondiente 88al nombre lo indica con un mensaje else { *GptionPane.s$o'7essage&ialogui, >3o e-iste el registro de >Qnom, >Error>, *GptionPane.EHHGHR7ESS%)E!; catc$ SLE-ception e! { e.printStac/race!; catc$ )rFinger*avaE-ception e! { e.printStac/race!;
Al realiar lo anterior es posible que necesites importar como java.sql.ResultSet para que todo uncione correctamente.
algunas
clases
Ahora solo se debe de agregar una llamada al m-todo verificar() desde el botón de Verificar en la clase interfaz.PantallaPrincipal" para realiarlo correctamente se debe dar doble clic sobre el botón y posteriormente agregar el código dentro del m-todo creado de tal manera que quede as... private void btn
3ombre a verificarK>!;
procedimientosS&2.verif(nombre!;
Si corremos la aplicación tras realiar lo anterior podremos veriicar la huella capturada actualmente contra otra en la base de datos y el sistema nos indicar/ si la huella coincide o no... 9asta aqu le de+amos en esta parte" si le has entendido correctamente a la lógica del código no te ser/ dicil crear el m-todo de identificar(), si lo deseas" puedes esperar a la próima entrega en la cual lo eplicar- paso a paso.
Programación de un lector de huella digital en Java. Parte 5. De sp ué sd eu nal a r g ae s pe r as eg ui mo sc one lt ut o r i a le ns uq ui n t ap ar t e( s in oh asl e í d ol a s p ar t e su no ,d os ,t r e syc ua t r ot er e c omi e nd oq uel oh ag asa nt e sd ec on t i n ua r ) .Ene s t ec a so t oc aelt u r n oal ai den t i fi c ac i óndepe r s onaspormedi od es uhuel l adi gi t al .Has t aelmomen t o y at e ne mo sr e s uel t a sl a sf u nc i o ne sp ar ag ua r d aryv e r i fi c ara s íq uef a l t ap oc op ar ac u l mi n ar c on
l as
f unc i ones
bás i c as .
Recor demos que t odos l os pr ocedi mi ent os l os est amos r eal i zando en l a cl ase pr ocedi mi ent os. Ut i lasíque va yamos a di cha cl ase y cr eamos un mét odo de nombr e i d en t i fi c ar Pe r s on a( )q uen or e ci b ea r g ume nt o sd en i n gú nt i p o,e nu np r i n ci p oq ue da r ád el a s i gui ent e
maner a:
"00 0 Identifica a una persona registrada por medio de su $uella digital 0" public void identificarPersona!{
Y aq uet e ne mo sl ad e fi ni c i ó nd elmé t o dod e be mo sd eb r i n da r l eu nc o mp or t a mi e nt op er op ar a d ec i r l eq uéha ce rp r i mer od eb emo se nt e nd er l o.Pa r ai d en t i fi c arun ap er s on as en ec e si t at o ma r u namue s t r ad el ah ue l l ad i g i t a lyp os t e r i o r me nt ec ompa r a r l ac ont o da sa qu el l a se nt r el a s c u al e ss ee nc u en t r al ap er s o na ,en e s t ec a s o,e nt r et o da sl a sh ue l l a sr e gi s t r a da s ,s i encont r amos un r egi st r o que coi nci da ent onces t enemos a l a per sona que buscamos.
En
c ódi go
Pr i mer o
s e
obt enemos
t odas
t r aduc e l as
a
huel l as
de
l o l a
bas e
s i gui ent e: de
dat os . . .
HesultSet rsIdentificar 4 identificarStmt.e-ecuteuer(!;
. . . pos t er i or men t e
i t er amos
a
t r av és
de
t od os
l os
r es ul t ad os . . .
huel l a
al macenada. . .
'$ilersIdentificar.ne-t!!{
. . . en
cada
i t er aci ón
obt enemos
l a
pl ant i l l a
de
l a
b(te template9ufferJ 4 rsIdentificar.get9(tes>$ue$uella>!;
. . . y
l a
c r eamos
par a
pos t er i or ment e
ut i l i z ar l a. . .
/emplate reference/emplate 4 ne' /emplatetemplate9uffer!;
. . . y aq uet e ne mo sl ap l an t i l l ad el ab as ed ed at o sl aco mp ar amo sc onl aa c t u al a l ma ce na nd oe l r es ul t ado
de
l a
c ompar ac i ón
en
una
v ar i abl e. . .
boolean coinciden 4 fingerprintS&2.verif(template,reference/emplate!;
. . . s ic o i n ci d en h ac emo sl op er t i n en t e yr omp emo se lc i c l o de i t er a ci ó n yl oc er r amo s. . .
if coinciden!{ ui.s$o'Image)rFinger*ava.get9iometricImagetemplate,
fingerprint,
fingerprintS&2!!; *GptionPane.s$o'7essage&ialogui,
>La
$uella
es
de
>QrsIdentificar.getString>$uenombre>!!; return;
. . . s ih emo sb us c a do e nt o da sl a sh ue l l a s yn os ee nc u en t r as el oi n di c a mo sa lu s ua r i o . . .
*GptionPane.s$o'7essage&ialogui,
>3o
e-iste
ning:n
registro
#ue
coincida con la $uella.>!;
. . . y
l i s t o!
Alfi n al i z ard ebe mo sd ee nc er r a relc ód i g oe nt r ea l g un os t r y c at c hp ar ae v i t a rer r or e sa l moment o
de
c ompi l ar ,
el
mét odo
c ompl et o
queda
as í :
"00 0 verifica la $uella digital actual contra otra en la base de datos 0" public void identificarPersona! { tr( { ""Gbtiene todas las $uellas de la bd HesultSet rsIdentificar 4 identificarStmt.e-ecuteuer(!;
""Si se encuentra el nombre en la base de datos
'$ilersIdentificar.ne-t!!{ ""Lee la plantilla de la base de datos b(te
template9ufferJ
4
rsIdentificar.get9(tes>$ue$uella>!; ""+rea una nueva plantilla /emplate reference/emplate 4 ne' /emplatetemplate9uffer!;
""compara las plantilas actual vs bd! boolean
coinciden
4
fingerprintS&2.verif(template,reference/emplate!;
""Si encuentra correspondencia dibuja el mapa ""e indica el nombre de la persona #ue coincidi6. if coinciden!{ ui.s$o'Image)rFinger*ava.get9iometricImagetemplate, fingerprint, fingerprintS&2!!; *GptionPane.s$o'7essage&ialogui, >La $uella es de >QrsIdentificar.getString>$uenombre>!!;
return;
""Si no encuentra alguna $uella #ue coincida lo indica con un mensaje *GptionPane.s$o'7essage&ialogui, >3o e-iste ning:n registro #ue coincida con la $uella.>!;
catc$ SLE-ception e! {
e.printStac/race!; catc$ )rFinger*avaE-ception e! {
e.printStac/race!;
Po s t e r i o r me nt el oú ni c oq ued eb emo sh ac ere sma nd ar l ol l a ma rd es dee lb ot ó nd e' I d ent i fi c ar ' yl i s t o !h emo st e r mi n ad oc onl a s3f u nc i on esp r i n ci p al e sdeu ns i s t e mad ei d ent i fi c ac i ó nd e huel l asdi gi t al es ,s ol onec es i t asadapt ares t osmét odosat uapl i c ac i ónyt endr ásf unc i onal i dad t ot al . Elp l a nn oe st e r mi n arc o ne s t as e r i ed et u t o r i a l e sc o ne s t ea r t í c u l os i n oa ho nd are n p r o ce di mi e nt o sunt a nt omá ses pe c i al i z a do sc omoc omp ar a c i on esr ea l i z ad asd i r e ct a me nt epo r els er v i do r( en apl i c ac i o nesc l i ent es er v i do r )p ar a qui t art r áfi c o al ar ed pormedi o de un s er v i d ord ea pl i c ac i o ne s ,s i nemb ar g o,e sp er os u sc o me nt a r i o syop i n i o ne sa lr e sp ec t o ,ysi t i ene na l gunac on sul t adej ens uc or r eopar ahac er l e sl l e garmir e spu es t al oant e spo si bl ey a qu e
no
he
po di do
c on t es t ar
l os
c omen t ar i os
aq uí
di r ec t amen t e. . .
: : : Act ual i z aci ón: : : Ape t i c i ónd eal gu nosdeus t ed es ,aq uíl e sdej ou nal i gapa r ad es c ar ga re lpr o y ec t oenf or mat o c o mp r i mi d o:
ngl et onJDBC. j ava gaso/Si Cr eat edon29Apr2013
•
•
Code
Re vi s i ons1
Embe dURL
<script src=
HTTPS cl oneURL
https://gist.gith
Y ouc anc l o newi t hHTTPSor SSH.
Downl oadGi st
Si ngl et onJDBC. j ava
Raw 123456789101112131415161718192021222324252627282930313 233343536373839404142434445464748495051525354555657585 960616263646566676869707172737475767778798081828384858 68788899091929394
import java.sql.Connection; import java.sql.DriverManaer; import java.sql.!repare"#tatem ent; import java.sql.#$%&'ception; import java'.namin.Conte't; import java'.namin.(nitialCont e't; import java'.sql.Data#o)rce; import java'.s*in.+,ption!ane ; -
/a)tor !C#, p)lic class " --(nstancia estatica "e la cone'ion sino )no llea a e'istir private static Connection connection n)ll; - /ret)rn Dev)elve la instancia )nica "e Cone'ion p)lic static Connection etCone'ion --#i la instancia no a si"o crea"o a)n se crea i ".connection n)ll contr):en"oCone'ion; ret)rn ".connection; --,tener las instancias "e Cone'ion +Dor.post resql.Driver>; #trin )rl >j"c?postresql?--local ost?5432-"@ allo*&nco"inCanes tr)e>; #trin )s)ario >postres>; #trin clave >i"sot>; ".connection DriverManaer.etConn ection)rl )s)ario clave; catc Class=otAo)n"&'ceptio n e
#:stem.o)t.println>Clas s=otAo)n"&'ceptionco ntr):en"oCone'ion ? > B e.etMessae; #:stem.c; catc #$%&'ception e #:stem.o)t.println>#$% &'ceptioncontr):en"oC one'ion ? > B e.etMessae; #:stem.c; +,ption!ane.so*Messa eDialon)ll e.etMessae >=o )e !osile Conectar con la +,ption!ane.&,M& ##&; #:stem.e'it0; catc &'ception e #:stem.o)t.println> &'ception eneral contr):en"oCone'ion ? > B e.etMessae; #:stem.c; p)lic static voi" lierarCone'ion# Conne ction cone' tr: cone'.close; catc #$%&'ception e' #:stem.o)t.printlnesta "os#$%.etMe'.et#$% #tate e'.etMessae; - Cierra la cone'ion. l provenir "e