FLEX GRANITEDS İLE JAVA SPRING ENTEGRASYONU

GraniteDS teknolojisi bize MVC bazlı düşünürsek View katmanında RIA (Rich Interface Applications) olarak son kullanıcı hitap eden güzel tasarımlar yapmamıza imkan sunar.
GraniteDS.org adresinden ilgili projenin indirme,dökümantasyon ve örnek projelerine erişebilirsiniz.

Biz tanıtımımıza başlayalım. GraniteDS i Maven projesi içerisinde derleyeceğiz. Granite için ihtiyaç duyacağımız dependency ler aşağıdaki gibi.

<dependency>
<groupId>org.graniteds</groupId>
<artifactId>granite-core</artifactId>
<version>2.3.0.GA</version>
</dependency>
<dependency>
<groupId>org.graniteds</groupId>
<artifactId>granite-swc</artifactId>
<version>2.3.0.GA</version>
<type>swc</type>
</dependency>
<dependency>
<groupId>org.graniteds</groupId>
<artifactId>granite-essentials-swc</artifactId>
<version>2.3.0.GA</version>
<type>swc</type>
<!-- All the content of this lib must be included in the SWF -->
<scope>internal</scope>
</dependency>
<dependency>
<groupId>org.graniteds</groupId>
<artifactId>granite-beanvalidation</artifactId>
<version>2.3.0.GA</version>
</dependency>

<dependency>
<groupId>org.graniteds</groupId>
<artifactId>granite-spring</artifactId>
<version>2.3.0.GA</version>
</dependency>




Projemize dependency lerimizi ekledik. Bu arada spring ile kullanacağımız için spring dependency lerimizi de eklemeyi unutmuyoruz. Maven projemizde web modulumuzu oluşturalım ve web.xml imizi aşağıdaki gibi düzenleyelim.
<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<!-- Spring ile ayağa kalkacak olan context -->
!-- Path to Spring config -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:/application-context.xml
</param-value>
</context-param>

<!-- Spring dinleyicisi-->

<listener>
<listener- class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<filter>

<!-- GraniteDS e ait AMF dinleyicisi -->

<filter-name>AMFMessageFilter</filter-name>

<filter-class>

org.granite.messaging.webapp.AMFMessageFilter

</filter-class>

</filter>

<filter-mapping>

<filter-name>AMFMessageFilter</filter-name>

<url-pattern>/graniteamf/*</url-pattern>

</filter-mapping>

<!-- AMF Servleti -->

<servlet>

<servlet-name>AMFMessageServlet</servlet-name>

<servlet-class>

org.granite.messaging.webapp.AMFMessageServlet

</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>AMFMessageServlet</servlet-name>

<url-pattern>/graniteamf/*</url-pattern>

</servlet-mapping>

</web-app>









GraniteDS in bağlantıya geçeceği ve servis olarak anlaması sağlayacağı java sınıfını tanımlandığı yer ise services-config.xml i dir. Bu xml ile sınıfımızın spring den geleceğini ayrıca belirteceğiz.



<?xml version="1.0" encoding="UTF-8"?>

<services-config>

<services>

<!-- Burada spring den gelecek olan sınıfımızı granite e tanıtıyoruz ve AMF kanalı ile erişebilir bir hale getiriyoruz. -->
<service
id="granite-service"

class="flex.messaging.services.RemotingService"

messageTypes="flex.messaging.messages.RemotingMessage">

<destination id="helloWorldService">

<channels>

<channel ref="my-graniteamf"/>

</channels>

<properties>

<factory>springFactory</factory>

<!-- Spring deki adıyla servisi çağrım yapıyoruz. -->

<source>helloWorldService</source>

</properties>

</destination>

</service>

</services>


<!-- Granite spring entegrasyon sınıfımız -->

<factories>

<factory id="springFactory" class="org.granite.spring.SpringServiceFactory"/>

</factories>



<channels>

<!-- kanal tanımlaması -->
<channel-definition id="my-graniteamf" class="mx.messaging.channels.AMFChannel">

<endpoint

uri="http://{server.name}:{server.port}/{context.root}/graniteamf/amf"

class="flex.messaging.endpoints.AMFEndpoint"/>

</channel-definition>

</channels>

</services-config>




Spring tarafını düzenliyoruz. Web.xml ile kalkacak olan Application-context.xml tanımlayalım.



<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:graniteds="http://www.graniteds.org/config"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.graniteds.org/config
http://www.graniteds.org/public/dtd/2.1.0/granite-config-2.1.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-2.0.xsd">


<import resource="application-context-java.xml"/>

<!-- Annotasyon ile test package inde bulunan sınıflarımızı kaldırabiliyoruz. -->
<!-- Ayrıca sınıf bazlı olarak tek tek de sınıflarımızı kaldırabiliyoruz -->

<!-- Annotation scan -->
<context:component-scan base-package="test">
</context:component-scan>





<!-- Spring MVC configuration -->
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>


<graniteds:flex-filter url-pattern="/*" />


</beans>


Son olarak ise test package i içerisindeki HelloWorld arayüz ve sınıflarımızı tanımlayalım.

Interface :

package test;

public interface HelloWorldInt {
public String sayHello(String name);
}


Class :


import org.apache.log4j.Logger;
import org.granite.messaging.service.annotations.RemoteDestination;
import org.springframework.stereotype.Service;

// Sınıfı kaldıran anatasyonlar..
@Service("helloWorldService")
@RemoteDestination(id="helloWorldService", source="helloWorldService")
public class HelloWorldService implements HelloWorldInt{

private static final Logger logger = Logger.getLogger(HelloWorldService.class);

public String sayHello(String name) {
return "Hello " + name + "!";
}
}


En son olarak Flex tarafından erişim yapacağımız Remote Object tanımlaması ve örnek mxml dosyası.

<?xml version="1.0" encoding="utf-8"?>

<mx:Application
xmlns:mx="http://www.adobe.com/2006/mxml"
backgroundGradientColors="[#0e2e7d, #6479ab]"
layout="vertical"
verticalAlign="middle" creationComplete="start()" >

<mx:Style>
.Panel {
padding-left: 8px; padding-top: 8px;
padding-right: 8px; padding-bottom: 8px;
}
.Result { font-size: 26px; color: white; }
</mx:Style>
<mx:Script>
<![CDATA[

import mx.controls.Alert;
import mx.rpc.events.FaultEvent;
import mx.messaging.ChannelSet;
import mx.messaging.channels.AMFChannel;
import mx.rpc.events.ResultEvent;






public function start(): void{

var channel:AMFChannel = new AMFChannel("my-graniteamf","http://localhost:8080/graniteamf/amf");
var channelSet:ChannelSet = new ChannelSet();
channelSet.addChannel(channel);
srv.channelSet = channelSet;

}


public function test():void{

srv.sayHello(nameInput.text);

}


public function handleResult(event:ResultEvent):void {

// Display received message

var a :String;
a = event.result as String;
Alert.show(a);

}



public function handleFault(event:FaultEvent):void {

// Show error alert
testArea.text =event.fault.faultDetail.toString();


}
]]>
</mx:Script>

<mx:RemoteObject id="srv" destination="helloWorldService" result="handleResult(event);" fault="handleFault(event);"/>


<mx:TextArea id="testArea">

</mx:TextArea>


<mx:Panel styleName="Panel" title="Hello World Sample">
<mx:Label text="Enter your name:"/>
<mx:TextInput id="nameInput" />
<mx:Button label="Say Hello" click="test()"/>
</mx:Panel>



</mx:Application>




Umarım faydalı olmuştur. İyi Çalışmalar.

Bu yazıdaki büyük katkılarından dolayı Mert Meral'e teşekkürler.

Yorumlar

Bu blogdaki popüler yayınlar

IONIC BAŞLANGIÇ

Cannot resolve the collation conflict between “Turkish_CI_AS” and “SQL_Latin1_General_CP1_CI_AS” in the equal to operation

Golang working with interfaces and functions -3