J2EE e Adobe BlazeDS Java EE è una piattaforma

1
SAP Netweaver e Adobe BlazeDS
http://desvino.altervista.org
J2EE e Adobe BlazeDS
Java EE è una piattaforma completa per lo sviluppo di applicazioni enterprise; Adobe Flex è leader
nel mondo delle RIA (Rich Internet Application). L’integrazione di Java EE (applicazioni lato
server Java-based) e Adobe Flex permette lo sviluppo di robuste applicazioni enterprise in grado di
fornire interfacce accattivanti per l’utente finale.
Framework Flex
Adobe Flex è un framework open source per la crezione di applicazioni RIA che girano su Adobe
Flash Player;
Caratteristiche principali:



struttura interamente a componenti (Flex SDK – User Interface Components), guidati da
eventi ed integrati attraverso data binding.
programmazione via codice MXML (linguaggio XML-based di tipo dichiarativo) e codice
ActionScript 3 (AS3 – Object Oriented).
la compilazione da origine ad un file SWF da eseguire in un Flash Player, o un file SWC che
può essere utilizzato all’interno di altri file .swf. I file .swf vengono caricati su un
application server e scaricati localmente nel client per essere eseguiti nel flash player del
browser.
Una applicazione RIA può comunicare con la business logic dei sistemi di back-end attraverso
Adobe BlazeDS (applicazione web in tecnologia Java inserita in un application server Java)
2
SAP Netweaver e Adobe BlazeDS
http://desvino.altervista.org
Modello Architetturale con BlazeDS.
Le principali funzionalità di BlazeDS includono i servizi RPC e di messaging.
Caratteristiche principali di BlazeDS
BlazeDS permette:




invocazione di metodi Java remoti da un’applicazione Flex;
conversione di oggetti Java in corrispondenti oggetti AS3 in risposta ad una chiamata di un
metodo remoto;
conversione di oggetti AS3 inviati da un’applicazione Flex in corrispondenti oggetti Java
(argomenti dei metodi chiamati);
scambio di messaggi tra applicazioni Flex e server Java;
3
SAP Netweaver e Adobe BlazeDS


http://desvino.altervista.org
gestione dei canali di comunicazione tra Flex e Java;
comunicazione, tramite degli adattatori, con servizi JMS
BlazeDS in definitiva prevede due tipi di interazioni: RPC (Remote Procedure Call) e Messaging
Service.
Le RPC permettono ai client di effettuare chiamate asincrone di servizi remoti che effettuano
determinate operazioni sul server e restituiscono i risultati direttamente al client. I componenti RPC
lato client, messi a disposizione nell’SDK, forniscono servizi HTTP (componente HTTPService),
web service (componenti WebService) e remote object service (componenti RemoteObject).
Il componente RemoteObject (lato client) permette di accedere a oggetti Java remoti senza la
necessità di configurarli come web service.
Uno dei principali vantaggi di BlazeDS è l’uso dell’AMF (Action Message Format) per la
trasmissione dei dati tra Flex e Java. AMF è un protocollo binario supportato nativamente dal flash
player, tale caratteristica rende la trasmissione veloce ed efficiente. A rendere più agevole l’uso del
protocollo è la definizione di livelli di astrazione superiori che permettono di focalizzare
l’attenzione sulla business logic trascurando i dettagli della comunicazione. Infatti le entità server
side vengono invocate usando opportuni nomi logici (destination). Inoltre, quando un client
interagisce con un servizio server-side tramite una destination, usa un canale di comunicazione
(channel) per le comunicazioni da e verso il server. Un channel è l’astrazione di un canale di
comunicazione che incapsula formato dei messaggi, protocollo di rete, gestisce l’ordine di consegna
dei messaggi. Dal lato server un channel termina in un endpoint Java-based che ha il compito di
effettuare l’unmarshalling dei messaggi e consegnarli al servizio opportuno.
Channels ed Endpoints.
In definitiva un channel è un oggetto lato client che rappresenta la connessione tra il componente
Flex e il server BlazeDS. La configurazione di un canale e del relativo endpoint avviene tramite file
di configurazione.
4
SAP Netweaver e Adobe BlazeDS
http://desvino.altervista.org
Sviluppo con NWDS
Sfruttiamo la caratteristica offerta da BlazeDS (ver.3.0.0.544 per la jdk1.4) che permette
l’invocazione di metodi Java remoti da un’applicazione Flex.
Con l’ausilio di NetWeaver Developer Studio creiamo un progetto di tipo J2EE – Web Module
Project (in pratica un WAR – WEB Archive) ed un progetto J2EE – Enterprise Application Project
(in pratica un EAR – Enterprise Archive) che contiene il WAR e che sarà deployato sul nostro
server.
La nostra applicazione non farà altro che restituire al client FLEX una stringa contenente testo.
Utilizziamo la prospettiva J2EE Development Perspective.
J2EE – creazione Web Module Project
J2EE Web Module Project – Project name
5
SAP Netweaver e Adobe BlazeDS
http://desvino.altervista.org
J2EE- creazione Enterprise Application Project
Creiamo la classe MyFunction nella cartella source, package it.videsoft; all’interno deve essere
presente il metodo, nel nostro caso doPing, richiamabile dal client FLEX.
/*
* Created on 28-gen-2011
*/
package it.videsoft;
/**
* @author vdestefano
*/
public class MyFunction {
private String result = " ";
public String doPing(String input) {
return input + " Hello BlazeDS!!!";
}
}
MyFunction class
Per essere raggiungibile dall’esterno la classe MyFunction deve essere definita come destinazione
all’interno del file remoting-config.xml (all’interno della cartella WEB.INF -> flex).
<?xml version="1.0" encoding="UTF-8"?>
<service id="remoting-service" class="flex.messaging.services.RemotingService">
<adapters>
6
SAP Netweaver e Adobe BlazeDS
http://desvino.altervista.org
<adapter-definition id="java-object"
class="flex.messaging.services.remoting.adapters.JavaAdapter" default="true"/>
</adapters>
<destination id="MyFunction">
<properties>
<source>it.videsoft.MyFunction</source>
<scope>application</scope>
</properties>
<adapter ref="java-object"/>
</destination>
<default-channels>
<!--channel ref="streaming-amf"/-->
<channel ref="amf"/>
</default-channels>
</service>
Remoting-config.xml
Nella figura sottostante è possibile vedere la struttura completa dell’applicazione, WAR ed EAR.
In particolare all’interno del file web.xml sono presenti:


HttpFlexSession (listener-class flex.messaging.HttpFlexSession)
MessageBrokerServlet (parametro services.configuration.file)
All’interno della cartella WEB-INF -> flex (dobbiamo crearla noi ed inserirvi i file di
configuarazione per BlazeDS) inseriamo i file (consigliato importarli da un progetto esistente o
template):




messaging-config.xml
proxy-config.xml
remoting-config.xml (contenente la nostra classe come destinazione)
services-config.xml (inseriamo i nostri puntamenti al server)
La cartella source contiene il package it.videsoft al cui interno va creata la classe MyFunction.java.
La cartella webContent contiene la welcome page index.html e tutti i file necessari al
funzionamento di FLEX sul client, swf file, html file etc.
7
SAP Netweaver e Adobe BlazeDS
http://desvino.altervista.org
Albero completo dalla prospettiva J2EE – WAR e EAR
<?xml version="1.0" encoding="UTF-8"?>
<services-config>
<services>
<service-include file-path="remoting-config.xml" />
<service-include file-path="proxy-config.xml" />
<service-include file-path="messaging-config.xml" />
</services>
<security>
<login-command class="flex.messaging.security.TomcatLoginCommand"
server="Tomcat"/>
<!-- Uncomment the correct app server
<login-command class="flex.messaging.security.TomcatLoginCommand"
server="JBoss">
<login-command class="flex.messaging.security.JRunLoginCommand"
server="JRun"/>
<login-command class="flex.messaging.security.WeblogicLoginCommand"
server="Weblogic"/>
<login-command class="flex.messaging.security.WebSphereLoginCommand"
server="WebSphere"/>
-->
8
SAP Netweaver e Adobe BlazeDS
http://desvino.altervista.org
<!-<security-constraint id="basic-read-access">
<auth-method>Basic</auth-method>
<roles>
<role>guests</role>
<role>accountants</role>
<role>employees</role>
<role>managers</role>
</roles>
</security-constraint>
-->
</security>
<channels>
<channel-definition id="amf" class="mx.messaging.channels.AMFChannel">
<endpoint url="http://server:port/TestBlaze/messagebroker/amf"
class="flex.messaging.endpoints.AMFEndpoint"/>
</channel-definition>
<channel-definition id="secure-amf"
class="mx.messaging.channels.SecureAMFChannel">
<endpoint url="https://server:port/TestBlaze/messagebroker/amfsecure"
class="flex.messaging.endpoints.SecureAMFEndpoint"/>
<properties>
<add-no-cache-headers>false</add-no-cache-headers>
</properties>
</channel-definition>
<channel-definition id="std-polling-amf"
class="mx.messaging.channels.AMFChannel">
<endpoint url="http://server:port/TestBlaze/messagebroker/amfpolling"
class="flex.messaging.endpoints.AMFEndpoint"/>
<properties>
<polling-enabled>true</polling-enabled>
<polling-interval-seconds>4</polling-interval-seconds>
</properties>
</channel-definition>
<channel-definition id="fast-polling-amf"
class="mx.messaging.channels.AMFChannel">
<endpoint url="http://server:port/TestBlaze/messagebroker/fastamfpolling"
class="flex.messaging.endpoints.AMFEndpoint"/>
<properties>
<polling-enabled>true</polling-enabled>
<polling-interval-seconds>1</polling-interval-seconds>
</properties>
</channel-definition>
<channel-definition id="streaming-amf"
class="mx.messaging.channels.StreamingAMFChannel">
<endpoint url="http://server:port/TestBlaze/messagebroker/streamingamf"
class="flex.messaging.endpoints.StreamingAMFEndpoint"/>
<properties>
<idle-timeout-minutes>0</idle-timeout-minutes>
<max-streaming-clients>10</max-streaming-clients>
<server-to-client-heartbeat-millis>5000</server-to-clientheartbeat-millis>
<user-agent-settings>
<user-agent match-on="MSIE" kickstart-bytes="2048" maxstreaming-connections-per-session="2"/>
9
SAP Netweaver e Adobe BlazeDS
http://desvino.altervista.org
<user-agent match-on="Firefox" kickstart-bytes="2048" maxstreaming-connections-per-session="2"/>
</user-agent-settings>
</properties>
</channel-definition>
<channel-definition id="my-http"
class="mx.messaging.channels.HTTPChannel">
<endpoint url="http://server:port/TestBlaze/messagebroker/http"
class="flex.messaging.endpoints.HTTPEndpoint"/>
</channel-definition>
<channel-definition id="my-secure-http"
class="mx.messaging.channels.SecureHTTPChannel">
<endpoint url="https://server:port/TestBlaze/messagebroker/httpsecure"
class="flex.messaging.endpoints.SecureHTTPEndpoint"/>
<properties>
<add-no-cache-headers>false</add-no-cache-headers>
</properties>
</channel-definition>
</channels>
<logging>
<target class="flex.messaging.log.ConsoleTarget" level="Error">
<properties>
<prefix>[BlazeDS] </prefix>
<includeDate>false</includeDate>
<includeTime>false</includeTime>
<includeLevel>false</includeLevel>
<includeCategory>false</includeCategory>
</properties>
<filters>
<pattern>Endpoint.*</pattern>
<pattern>Service.*</pattern>
<pattern>Configuration</pattern>
</filters>
</target>
</logging>
<system>
<redeploy>
<enabled>false</enabled>
<!-<watch-interval>20</watch-interval>
<watch-file>{context.root}/WEB-INF/flex/services-config.xml</watchfile>
<watch-file>{context.root}/WEB-INF/flex/proxy-config.xml</watchfile>
<watch-file>{context.root}/WEB-INF/flex/remoting-config.xml</watchfile>
<watch-file>{context.root}/WEB-INF/flex/messagingconfig.xml</watch-file>
<watch-file>{context.root}/WEB-INF/flex/data-managementconfig.xml</watch-file>
<touch-file>{context.root}/WEB-INF/web.xml</touch-file>
-->
</redeploy>
</system>
</services-config>
services-config.xml
10
SAP Netweaver e Adobe BlazeDS
http://desvino.altervista.org
<?xml version="1.0" encoding="UTF-8"?>
<service id="proxy-service"
class="flex.messaging.services.HTTPProxyService">
<properties>
<connection-manager>
<max-total-connections>100</max-total-connections>
<default-max-connections-per-host>2</default-max-connections-perhost>
</connection-manager>
<allow-lax-ssl>true</allow-lax-ssl>
</properties>
<adapters>
<adapter-definition id="http-proxy"
class="flex.messaging.services.http.HTTPProxyAdapter" default="true"/>
<adapter-definition id="soap-proxy"
class="flex.messaging.services.http.SOAPProxyAdapter"/>
</adapters>
<default-channels>
<channel ref="amf"/>
</default-channels>
<destination id="DefaultHTTP">
</destination>
</service>
proxy-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<service id="message-service"
class="flex.messaging.services.MessageService">
<adapters>
<adapter-definition id="actionscript"
class="flex.messaging.services.messaging.adapters.ActionScriptAdapter"
default="true" />
<!-- <adapter-definition id="jms"
class="flex.messaging.services.messaging.adapters.JMSAdapter"/> -->
</adapters>
<default-channels>
<channel ref="fast-polling-amf"/>
</default-channels>
</service>
messaging-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-j2ee-engine SYSTEM "web-j2ee-engine.dtd">
<web-j2ee-engine/>
war - web-j2ee-engine.xml
Nella figure due sottostanti è possibile vedere il file web.xml per il WAR, oggetti Web e sorgente.
11
SAP Netweaver e Adobe BlazeDS
http://desvino.altervista.org
web.xml – Web Objects
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>Organigramma BLAZEDS</display-name>
<description>Organigramma BLAZEDS WEB APP</description>
<!-- Http Flex Session attribute and binding listener support -->
<listener>
<listener-class>flex.messaging.HttpFlexSession</listener-class>
</listener>
<!-- MessageBroker Servlet -->
<servlet>
<servlet-name>MessageBrokerServlet</servlet-name>
<display-name>MessageBrokerServlet</display-name>
<servlet-class>flex.messaging.MessageBrokerServlet</servlet-class>
<init-param>
<param-name>services.configuration.file</param-name>
<param-value>/WEB-INF/flex/services-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>MessageBrokerServlet</servlet-name>
<url-pattern>/messagebroker/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
web.xml - sorgente
12
SAP Netweaver e Adobe BlazeDS
http://desvino.altervista.org
Il passo successivo concerne il build dell’applicazione e l’aggiunta del WAR all’EAR creato
precedentemente.
Build WAR e Add to EAR Project
Build EAR
13
SAP Netweaver e Adobe BlazeDS
http://desvino.altervista.org
Deploy sul server J2EE
In relazione all’EAR, all’interno del file application-j2ee-engine.xml devono essere presenti i
riferimenti alle librerie ed ai servizi necessari al funzionamento dell’applicazione.
EAR referenze
14
SAP Netweaver e Adobe BlazeDS
http://desvino.altervista.org
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE application-j2ee-engine SYSTEM 'application-j2ee-engine.dtd'>
<application-j2ee-engine>
<reference reference-type="weak">
<reference-target provider-name="sap.com" targettype="service">jmx</reference-target>
</reference>
<reference reference-type="weak">
<reference-target provider-name="sap.com" targettype="library">tc~jmx</reference-target>
</reference>
<reference reference-type="weak">
<reference-target provider-name="sap.com" targettype="library">com.sap.mw.jco</reference-target>
</reference>
<provider-name>sap.com</provider-name>
<fail-over-enable mode="disable" />
</application-j2ee-engine>
application-j2ee-engine.xml
Il file application.xml deve contenere informazioni della nostra applicazione relativamente a nome,
descrizione, web-uri e context root.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE application PUBLIC "-//Sun Microsystems, Inc.//DTD J2EE Application
1.3//EN"
"http://java.sun.com/dtd/application_1_3.dtd">
<application>
<display-name>OrgBlazeDSear</display-name>
<description>EAR description</description>
<module>
<web>
<web-uri>OrgBlazeDS.war</web-uri>
<context-root>TestBlaze</context-root>
</web>
</module>
</application>
application.xml
Il sorgente FLEX.
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute">
<mx:Script>
<![CDATA[
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
15
SAP Netweaver e Adobe BlazeDS
http://desvino.altervista.org
//Invoke method from J2EE Server
private function doPing():void {
var input:String = input.text;
remoteObject.doPing(input);
}
// Handle the recevied message.
private function resultHandler(event:ResultEvent):void {
result.text = event.result.toString();
}
// Handle a message fault.
private function faultHandler(event:FaultEvent):void {
result.text += "Error: " + event.fault.toString();
}
]]>
</mx:Script>
<mx:RemoteObject id="remoteObject"
destination="MyFunction"
result="resultHandler(event);"
fault="faultHandler(event);"/>
<mx:Label text="Your Name" x="10" y="12"/>
<mx:TextInput id="input" text="" x="95" y="10" width="330"/>
<mx:Button label="Send" click="doPing();" x="371" y="40"/>
<mx:TextArea id="result" x="95" y="70" height="166" width="330"
editable="false"/>
<mx:Label text="Result" x="10" y="70"/>
</mx:Application>
L’applicazione FLEX deve conoscere la destinazione MyFunction, a tale scopo deve “vedere”
service-config.xml. Nelle opzioni relative al compiling viene specificato un argomento addizionale
ad hoc.
Flex Compiler options
16
SAP Netweaver e Adobe BlazeDS
http://desvino.altervista.org
Ci sono diversi modi per eseguire l’applicazione sul portale. Un modo abbastanza semplice
concerne la creazione di un componente portale ad hoc. All’interno del metodo doOnNodeReady
inseriamo l’istruzione request.redirect("/TestBlaze/blaze1.html");.
Sul portale creiamo una iview di tipo componente portale. Seguiamo i passi necessari selezionando
il PAR deployato in precedenza.
Eseguendo l’anteprima dell’IVIEW l’applicazione viene visualizzata nel browser. Il click sul
pulsante Send ottiene come risultato la visualizzazione della stringa di output nella textArea
corrispondente.
anteprima dell’IView
17
SAP Netweaver e Adobe BlazeDS
http://desvino.altervista.org
Jars e librerie
Nella figura sottostante sono visibili i jars contenenti le librerie necessarie al funzionamento
dell’applicazione sia per quanto riguarda BlazeDS sia per quanto riguarda il portale SAP.
Java Buil Path relativa al WAR
Un progetto che utilizza BlazeDS deve contenere almeno i seguenti jars:
BlazeDS jars