Estrutura

18 respostas
A

Estou fazendo um aplicativo de teste integrando Java e Flex, usando
BlazeDs.
Estou com algumas duvidas:

  • qual o padrao de estrutura de diretorios a ser seguida (ex.: onde
    devem ficar os .mxlm, .as)
  • deve-se ter dois projetos: um com a aplicacao Java Web e outro para
    a aplicacao Flex? Porem, ambos precisam compartilhar os arquivos
    services-config e remoting-config, correto? Qual a melhor pratica para
    esse compartilhamento?
  • No services-config.xml temos o endereco da aplicacao web a ser
    chamada pela aplicacao Flex. Como faco para deixar o endereco dinamico
    (pegar o contexto dinamicamente?). Pergunto isso pq dependendo do
    cliente, o endereco da aplicacao irá mudar

Grata
Alexsandra

18 Respostas

AUser

alexsandra:
Estou fazendo um aplicativo de teste integrando Java e Flex, usando
BlazeDs.
Estou com algumas duvidas:

  • qual o padrao de estrutura de diretorios a ser seguida (ex.: onde
    devem ficar os .mxlm, .as)
  • deve-se ter dois projetos: um com a aplicacao Java Web e outro para
    a aplicacao Flex? Porem, ambos precisam compartilhar os arquivos
    services-config e remoting-config, correto? Qual a melhor pratica para
    esse compartilhamento?
  • No services-config.xml temos o endereco da aplicacao web a ser
    chamada pela aplicacao Flex. Como faco para deixar o endereco dinamico
    (pegar o contexto dinamicamente?). Pergunto isso pq dependendo do
    cliente, o endereco da aplicacao irá mudar

Grata
Alexsandra

Olá Alexsandra,

Sugiro que você baixe projetos de exemplo. Vale inclusive olhar os projetos de exemplo do Blaze que vem junto com o turnkey dele. E estude algum framework MVC (Cairngorm, Swiz, qualquer coisa - prefiro o Swiz que é menos burocrático).

Não, você não deve compartilhar os XML (remoting-config, etc). Estes são apenas de configuração, não tem necessidade alguma de integração Flex/java desses arquivos.

O endereço que você salva, já é dinâmico.

<?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="JBoss">
        	<per-client-authentication>false</per-client-authentication>
        </login-command>
        <!-- Uncomment the correct app server
        <login-command class="flex.messaging.security.TomcatLoginCommand" server="JBoss">
        <login-command class="flex.messaging.security.TomcatLoginCommand" server="Tomcat"/>
		<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"/>
        -->

        
        <security-constraint id="sample-users">
            <auth-method>Basic</auth-method>
            <roles>
                <role>ScrumDeveloper</role>
                <!--<role>accountants</role>
                <role>employees</role>
                <role>managers</role>
            -->
            </roles>
        </security-constraint>
         
    </security>

    <channels>

        <channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
            <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf" class="flex.messaging.endpoints.AMFEndpoint"/>
        </channel-definition>

        <channel-definition id="my-secure-amf" class="mx.messaging.channels.SecureAMFChannel">
            <endpoint url="https://{server.name}:{server.port}/{context.root}/messagebroker/amfsecure" class="flex.messaging.endpoints.SecureAMFEndpoint"/>
            <properties>
                <add-no-cache-headers>false</add-no-cache-headers>
            </properties>
        </channel-definition>

        <channel-definition id="my-polling-amf" class="mx.messaging.channels.AMFChannel">
            <endpoint url="http://{server.name}:{server.port}/{context.root}/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="my-streaming-amf" class="mx.messaging.channels.StreamingAMFChannel">
			<endpoint url="http://{server.name}:{server.port}/{context.root}/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>30000</server-to-client-heartbeat-millis>
				<user-agent-settings>
					<user-agent match-on="MSIE" kickstart-bytes="2048" max-streaming-connections-per-session="3" />
					<user-agent match-on="Firefox" kickstart-bytes="2048" max-streaming-connections-per-session="3" />
				</user-agent-settings>
			</properties>
		</channel-definition>

        <!--
        <channel-definition id="my-http" class="mx.messaging.channels.HTTPChannel">
            <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/http" class="flex.messaging.endpoints.HTTPEndpoint"/>
        </channel-definition>

        <channel-definition id="my-secure-http" class="mx.messaging.channels.SecureHTTPChannel">
            <endpoint url="https://{server.name}:{server.port}/{context.root}/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="Debug">
            <properties>
                <prefix>[BlazeDS] </prefix>
                <includeDate>true</includeDate>
                <includeTime>true</includeTime>
                <includeLevel>true</includeLevel>
                <includeCategory>true</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</watch-file>
            <watch-file>{context.root}/WEB-INF/flex/proxy-config.xml</watch-file>
            <watch-file>{context.root}/WEB-INF/flex/remoting-config.xml</watch-file>
            <watch-file>{context.root}/WEB-INF/flex/messaging-config.xml</watch-file>
            <watch-file>{context.root}/WEB-INF/flex/data-management-config.xml</watch-file>
            <touch-file>{context.root}/WEB-INF/web.xml</touch-file>
             -->
        </redeploy>
    </system>

</services-config>

Qualquer coisa mais, diga.

A

Ola
Obrigada pela resposta
Mas a ideia é ter dois projetos? Um Java Web e outro Flex Project? Ou usa-se os dois num unico projeto web e , sei lah, uma pasta “flex” para conter os arquivos relacionados ao flex - view?

Por isso perguntei sobre o uso do services e remoting-config nos dois lados (client e server).
Aqui nos meus exemplos estou criando 2 projetos separados, e por isso, perguntei sobre o uso do services e remoting-config nos dois projetos…
Grata
Alexsandra

AUser

Exato, dois projetos separados. A pasta flex dentro do web-inf é só pra configurações.

[]'s

vitinho1712

AUser:
Exato, dois projetos separados. A pasta flex dentro do web-inf é só pra configurações.

[]'s

Dá pra fazer em um único projeto, utilizando o Eclipse e o plugin do Flex, segue um tutorial:
http://blog.javacode.com.br/?p=22

É bem melhor fazer em um único projeto, pq ficar jogando as classes na pasta do tomcat é um saco :?

AUser

vitinho1712:
AUser:
Exato, dois projetos separados. A pasta flex dentro do web-inf é só pra configurações.

[]'s

Dá pra fazer em um único projeto, utilizando o Eclipse e o plugin do Flex, segue um tutorial:
http://blog.javacode.com.br/?p=22

É bem melhor fazer em um único projeto, pq ficar jogando as classes na pasta do tomcat é um saco :?

Discordo. É bem melhor fazer em projetos separados que dá pra distribuir o SWF e não obriga o redeploy. E como assim jogar classes no tomcat? Só se não usar um deploy manager como o do eclipse, mas creio que nesse século ninguém mais não usa.

E não é bom, também, por deixar a IDE pesada. O plugin do Flex não é nem um pouco leve. E bem, se for instalar por esse plugin não tem parte visual nem profiler.

AUser

E outra coisa: o servidor não fica sobrecarregado com pessoas baixando SWF o tempo todo. Deixa isso a cargo de uma maquina burra que só tenha o apache, no máximo.

Andre_Brito

O plugin do Flex para o Eclipse tem a parte gráfica.

Como o AUser, também acho melhor separar em dois projetos. Os xmls de configuração do BlazeDS vão no projeto web do Java daí.

AUser

Ih, tem mesmo? Só se for agora, na época que fui usar não tinha. Tinha que ficar botando os comps na mão.

vitinho1712

Não conheço esse deploy manager.

Não vejo diferença alguma na minha IDE. E como o Andre Brito disse, o plugin do Flex para o Eclipse tem a parte gráfica.

AUser

Não vê diferença que o projeto ainda está pequeno. Projeto grande é impossível. Fica pesado demais. Não só pelo plugin, mas pelos outros plugins. (Mojos, etc).

Deploy manager é qualquer mecanismo de hot deploy ou de deployment. O Tomcat tem suporte a hot deploy, e o Eclipse tem como jogar as classes sozinho lá, sem você ter que colocar na mão e sem dar diferença alguma.

A

Bom, seguindo a dica do AUser, estou vendo alguns exemplos em BlazeDs

Neste link por exemplo
http://livedocs.adobe.com/blazeds/1/blazeds_devguide/help.html?content=lcoverview_4.html

Diz o seguinte:
"When you compile your Flex application, specify the services-config.xml configuration file to the compiler. This file defines the destinations and channels that the client application uses to "

Isso significa que o services-config eh usado soh pelo lado client? ou seja, pelo Flex Project? O Java Web Application nao usa esse arquivo? Até acredito que usa pois no web.xml tem-se:

services.configuration.file
/WEB-INF/flex/services-config.xml

Neste caso, entao significa dizer que tanto o Flex Project qto o Java Web Application irao utilizar esse arquivo? Continuo com o problema do compartilhamento desse arquivo em caso de 2 projetos separados

Alexsandra

AUser

Alexsandra,

O flex não tem que ler esse arquivo. Você não vai usa-lo do lado cliente.

Anexo, os meus arquivos. Dá pra se basear um pouco.

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="AlfrescoAdapterService" version="2.5">
	<display-name>AlfrescoAdapterService</display-name>

	<!-- Http Flex Session attribute and binding listener support -->
	<listener>
		<listener-class>flex.messaging.HttpFlexSession</listener-class>
	</listener>

	<!-- Listener for services startup in app -->
	<listener>
		<listener-class>
			br.com.flexdoc.alfrescoadapter.service.utils.ServletContextListenerImpl</listener-class>
	</listener>

	<!-- MessageBroker Servlet -->
	<servlet>
		<servlet-name>MessageBrokerServlet</servlet-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>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
</web-app>

messaging-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" />
	</adapters>



</service>

proxy-config.xml

<?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-per-host>
		</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="my-amf" />
	</default-channels>

	<destination id="DefaultHTTP">
	</destination>

</service>

remoting-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<service id="remoting-service" class="flex.messaging.services.RemotingService">

	<adapters>
		<adapter-definition id="java-object"
			class="flex.messaging.services.remoting.adapters.JavaAdapter"
			default="true" />
	</adapters>

	<default-channels>
		<channel ref="my-secure-amf" />
	</default-channels>

	<default-security-constraint ref="sample-users" />

	<destination id="SeuServicoPeloFlex">
		<properties>
			<source>
				pacote.AclasseDeservico
			</source>
		</properties>
	</destination>
</service>

services-config.xml

<?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="JBoss">
        	<per-client-authentication>false</per-client-authentication>
        </login-command>
        <!-- Uncomment the correct app server
        <login-command class="flex.messaging.security.TomcatLoginCommand" server="JBoss">
        <login-command class="flex.messaging.security.TomcatLoginCommand" server="Tomcat"/>
		<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"/>
        -->

        
        <security-constraint id="sample-users">
            <auth-method>Basic</auth-method>
            <roles>
                <role>ScrumDeveloper</role>
                <!--<role>accountants</role>
                <role>employees</role>
                <role>managers</role>
            -->
            </roles>
        </security-constraint>
         
    </security>

    <channels>

        <channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
            <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf" class="flex.messaging.endpoints.AMFEndpoint"/>
        </channel-definition>

        <channel-definition id="my-secure-amf" class="mx.messaging.channels.SecureAMFChannel">
            <endpoint url="https://{server.name}:{server.port}/{context.root}/messagebroker/amfsecure" class="flex.messaging.endpoints.SecureAMFEndpoint"/>
            <properties>
                <add-no-cache-headers>false</add-no-cache-headers>
            </properties>
        </channel-definition>

        <channel-definition id="my-polling-amf" class="mx.messaging.channels.AMFChannel">
            <endpoint url="http://{server.name}:{server.port}/{context.root}/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="my-streaming-amf" class="mx.messaging.channels.StreamingAMFChannel">
			<endpoint url="http://{server.name}:{server.port}/{context.root}/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>30000</server-to-client-heartbeat-millis>
				<user-agent-settings>
					<user-agent match-on="MSIE" kickstart-bytes="2048" max-streaming-connections-per-session="3" />
					<user-agent match-on="Firefox" kickstart-bytes="2048" max-streaming-connections-per-session="3" />
				</user-agent-settings>
			</properties>
		</channel-definition>

        <!--
        <channel-definition id="my-http" class="mx.messaging.channels.HTTPChannel">
            <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/http" class="flex.messaging.endpoints.HTTPEndpoint"/>
        </channel-definition>

        <channel-definition id="my-secure-http" class="mx.messaging.channels.SecureHTTPChannel">
            <endpoint url="https://{server.name}:{server.port}/{context.root}/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="Debug">
            <properties>
                <prefix>[BlazeDS] </prefix>
                <includeDate>true</includeDate>
                <includeTime>true</includeTime>
                <includeLevel>true</includeLevel>
                <includeCategory>true</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</watch-file>
            <watch-file>{context.root}/WEB-INF/flex/proxy-config.xml</watch-file>
            <watch-file>{context.root}/WEB-INF/flex/remoting-config.xml</watch-file>
            <watch-file>{context.root}/WEB-INF/flex/messaging-config.xml</watch-file>
            <watch-file>{context.root}/WEB-INF/flex/data-management-config.xml</watch-file>
            <touch-file>{context.root}/WEB-INF/web.xml</touch-file>
             -->
        </redeploy>
    </system>

</services-config>

Não se esqueça de jogar as libs (flex-messaging, etc, tudo o que tiver o nome flex e ser um JAR, voce encontra dentro do blazeds) dentro do seu diretório de libs do servidor de aplicação. Tem que ser lá, não adianta jogar no projeto.

[]'s

A

Tá…mas qdo eu clico num botao tipo GETCLIENTS no flex, de onde ele vai pegar o endereco para conectar no servidor? Nao eh do services-config.xml que jah foi compilado dentro do swf?
E o remoting-config.xml nao eh necessario no flex para que no mxml vc faca por exmeplo:
<mx:RemoteObject id=“usuarioService” …>
e o flex mapeie essa chamada lah no java??
Alexsandra

AUser

A classe remoteObject lê do destination que você especifica a ela.

Bem, você escolhe qual o servidor de acordo com o parâmetro que está no destination do remote Object. Eu pelo menos não faço isso, eu conecto à uma aplicação primeiro e ela me retorna pra qual servidor eu devo encaminhar o cliente (tem um cluster load-balancing aqui).

O services config não é acessível ao cliente. Ele serve apenas para o container startar corretamente a servlet.

Dá uma lida nesse tutorial:

www.guj.com.br/posts/downloadAttach/4207.java

[]'s

A

oi
Soh que o exemplo que vc passou é uma unica aplicacao server e client.
Tanto eh que ali passa para o Flex Compiler o argumento -services “…/WebContent/WEB-INF/flex/services-config.xml”. Ou seja, o Flex precisou saber onde estava o services-config…

Alexsandra

Andre_Brito

Ou nesse tutorial :slight_smile:

A

eh…acho que esse exemplo tem a mesma ideia
o mesmo projeto flex eh tb o server side
veja que na sessao Create Flex Project ele diz pra setar o server como J2EE…

Nao to encontrando um tutorial bem legal que separe os dois projetos…
Alexsandra

Andre_Brito

alexsandra:
eh…acho que esse exemplo tem a mesma ideia
o mesmo projeto flex eh tb o server side
veja que na sessao Create Flex Project ele diz pra setar o server como J2EE…

Nao to encontrando um tutorial bem legal que separe os dois projetos…
Alexsandra


No final das contas da mesma.

Se você quer separar, cria um Flex Project (onde vão suas coisas do Flex) e um Dynamic Web Project. Pra passar as coisas para do Flex Project para o Dynamic, você vai na Flex Perspective, dá um Export Release Build (menu Project) e cria os bins. Aí você copia ele e cola na pasta de WebContent do Dynamic. Vale ressaltar que os arquivos XML devem ficar no Dynamic. Pro compilador usar o services-config.xml correto, clica com o botão direito no Flex Project, Compiler e seta lá onde fica o xml do services-config.

Criado 18 de novembro de 2009
Ultima resposta 18 de nov. de 2009
Respostas 18
Participantes 4