Introduction
Forms 10g permet lutilisation du JAVA ct client et ct application serveur. Lutilisation
du JAVA au niveau serveur nest pas aise car on doit recourir lutilisation dun bridge natif
PLS/SQL vers JAVA au niveau de Oracle Forms.
& '
Java cot AS
!"#$%
Java cot BD
Dans ce tutoriel, on reprend un exemple dcrit au niveau dOTN et concerne lutilisation dun
web service commercial (StrikeIron.com) pour lenvoi dun SMS. Le tutoriel Oracle peut tre
trouv sur :
http://www.oracle.com/technology/products/forms/htdocs/10gr2/howto/webservicefromforms
/ws_10_1_3_from_forms.html
Serveur dapplications
Dans le cas o il est impossible de dlocaliser les classes JAVA au niveau des clients, comme
par exemple le cas des services web, on sera dans lobligation de fournir ces classes ct
serveur dapplications.
Cette approche ncessite la mise en place de wrappers PL/SQL-JAVA au niveau du module
Forms. Ceci permettra au module daccder aux classes JAVA par lintermdiaire de
packages-procdures PL/SQL.
La dlocalisation cot serveur dapplications implique le lancement de la JVM au niveau de
ce tier. Limpact de cette approche est que le serveur sera trs sollicit et de ce fait un rglage
en termes de pooling JVM est requis.
Dans ce tutoriel, on utilisera des classes JAVA ct serveur dapplications.
Serveur Bases de donnes
Comme pour les procdures stockes, on sera aussi amen crer des classes JAVA ct BD.
Des appels similaires que pour les appels PL/SQL seront utiliss pour accder aux
fonctionnalits des classes stockes.
Nanmoins, cette approche semble ne pas tre trs utilise.
WSDL : web service definition language. Permet de dfinir les mthodes ncessaires mettre en uvre pour
exploiter ce web service. Cette tape est mise en place par le fournisseur de service.
On choisira un nom dapplication adquat. Dans notre cas, on a appel cette application
SMSApp.
Au niveau de cette application et selon la terminologie JDeveloper, on crera un certain
nombre de projets. Pour le moment, le projet qui contiendra les classes denvoi SMS sera
appel SMSGateway
Pour spcifier le type de projet, on changera quelques options au niveau des proprits comme
le montre la figure ci-dessus.
Dans le cas qui nous concerne et spcialement en raison du fait que nous allons importer les
classes cres au niveau de Forms developer, il est important de spcifier la JDK utilise pour
lexcution de nos FMX. tant donn que la version actuelle de Forms est 10.1.2, la JDK
utiliser est 1.4
Nous allons ensuite dfinir le type de projet. Dans notre cas, cest lutilisation dun web
service commercial fourni par www.strikeiron.com. On slectionnera loption Business Tier
et spcialement loption Web servicesLitem qui nous intresse est web services proxy-
Dans lcran qui suit, on renseigne lurl de description du service web. Dans notre cas, celleci est : http://ws.strikeiron.com/SMSAlerts4?WSDL
JDeveloper va se connecter pour lire le document de description du service web et par la suite
construira le modle qui sera disponible au niveau de JDeveloper. Une classe ayant un prfixe
SoapClient sera alors visible. Elle contient les mthodes ncessaires pour lenvoi du SMS.
Noter que lon peut aussi suivre la mme approche pour un autre service commercial
(www.esendex.com dcrit dans OTN).
Pour tester notre setup, on peut lancer lenvoi dun SMS partir de JDeveloper. On apportera
les modifications suivantes :
Au niveau de la mthode main(), ajouter la section suivante.
Note : pour tester votre envoi, il est ncessaire de crer un compte dessai sur
www.strikeiron.com. Vous recevrez un mot de passe pour votre userID.
Une fois que vous avez valid votre envoi et tant donn que lon utilisera seulement la
mthode senMessage(), on effectuera une modification au niveau de la mthode denvoi.
Ceci est ncessaire pour sauthentifier au niveau du service web lorsquon se connectera
partir de Forms.
Le JAR qui a t gnr, soit sms.jar sera mis dans le repertoire de notre installation
fonctionnelle de Forms. Dans notre cas, cest /forms/java.
Afin de permettre la visibilit de nos JAR et des classes ncessaires au moment du runtime,
on devra modifier le classpath au niveau de default.env de Forms (ou de la configuration
nomme sil en existe une).
Exemple de classpath :
10
11
Si lon compare au niveau de JDeveloper, on voit que lon a besoin des objets LicenseInfo et
SubscriptionInfoHolder. On rpte alors la mme procdure dimportation pour ces deux
classes. Pour les localiser plus facilement, on devra au pralable noter les packages de chaque
classe et les slectionner ensuite de larbre dimportation.
Pour finaliser, on devra aussi importer deux autres classes ncessaires au niveau de notre
module, savoir String et Exception.
Lcran suivant montre limportation de la classe Exception.
12
13
Conclusion
On a prsent dans ce tutoriel les tapes ncessaires pour lutilisation dune classe JAVA ct
serveur dapplications.
Cette approche peut tre tendu dautres services web et la mise en place doit tre conue
selon les spcifications du fournisseur de services web.
Il est noter que le fait dutiliser des classes Java cot serveur dapplications implique une
tude de performance selon lutilisation escompte du service. En effet, chaque fois quun
appel de classe est fait, une instance JVM sera lance au niveau du serveur dapplications.
Dans le cas dun trs grand nombre dappel, un engorgement des capacits processeur est
prvoir et ceci peut conduire un touffement du serveur.
Dans ce cas prcis, il est indiqu de faire un pooling JVM selon le nombre de connexions
possibles. Les rglages peuvent tre faits par ladministrateur du serveur dapplications.
14
Annexe
On peut se poser la question de savoir si lon peut viter dutiliser cette classe JAVA et
remplacer cette fonctionnalit par du PL/SQL.
videmment, dans le cas des services web, on peut facilement utiliser une procdure ou
fonction PL/SQL en remplacement de la mthodologie dcrite ci-dessus. Il faut noter
nanmoins que ce tutoriel dcrit les tapes pour la mise en place dune classe JAVA et de ce
fait la mme technique peut tre rutilise dans les cas o il est impossible dutiliser du
PL/SQL.
On montre dans ce qui suit comment on peut envoyer un SMS en utilisant une procdure
stocke PL/SQL (Utilisation protocole HTTP GET sur fournisseur SMS www.wadja.com).
Noter que la mme approche est dcrite dans http://www.inside-oracleapex.com/2007/05/sending-sms-to-mobile-phone.html et que lutilisation du package
UTL_HTTP facilite la mise en place de cette procdure. Le plus important est que la requte
soumise au service soit crite suivant les spcifications du fournisseur de service SMS.
create or replace PROCEDURE sendSMS
( pRecipient IN VARCHAR2
, pBody
IN VARCHAR2
)
IS
sms_key constant varchar2(40) := 'DB09D6XXXXXX';--cl obtenir sur wadja.com
-vRequest
Utl_Http.req;
vGetText
VARCHAR2(500);
vResponse
Utl_Http.resp;
vResponseText VARCHAR2(2000);
vErrorText
VARCHAR2(200);
BEGIN
----------------------------------------------------------------------------- Build text for the get action.
-- For a field description, see
-- http://sms.wadja.com/partners/sms/default.aspx
---------------------------------------------------------------------------vGetText :=
'key=' ||Utl_Url.escape(sms_key, TRUE)||CHR(38)||
'msg='
||Utl_Url.escape(pBody, TRUE) ||CHR(38)||
'to='||Utl_Url.escape(pRecipient, TRUE)||CHR(38)||
'from='||Utl_Url.escape('wadja.com',TRUE)||CHR(38)||
'unicode='||Utl_Url.escape('no', TRUE)||CHR(38)||
'send='||Utl_Url.escape('1', TRUE);
vRequest := Utl_Http.begin_request
( url
=> 'http://sms.wadja.com/partners/sms/default.aspx'
, method => 'GET'
);
Utl_Http.set_header
( r
=> vRequest
, name => 'Content-Type'
, value => 'application/x-www-form-urlencoded'
);
Utl_Http.set_header
( r
=> vRequest
, name => 'Content-Length'
, value => LENGTH(vGetText)
);
Utl_Http.write_text
( r
=> vRequest
, data => vGetText
);
vResponse := Utl_Http.get_response(vRequest);
IF vResponse.status_code = '200'
THEN
15
ELSE
Utl_Http.read_text(vResponse, vResponseText);
-IF vResponseText NOT LIKE '%batchID%'
--A verifier avec specs wadja.com
THEN
vErrorText := vResponseText;
END IF;
16