Разработка
Встала передо мной интересная задачка, написать маленькое Air приложение, которое получала бы данные с Java сервера. Использовать XML для таких задач - это против моей сущности. Не люблю я это дело. По этому сразу был взят курс на технологии LiveCycleDs и BlazeDs. Первая технология хороша, но очень уж дорога. BlazeDS бесплатна и свободо распрострянается. Её возможностей более чем за глаза хватает для решения поставленной передо мной задачи. Т.к. задача предполагает обращение к БД, то в дальнейшем планируется использовать Hibernate. И чтоб не завязываться на ручное инициализирование сессий и разруливание всяких проблемм с пулом соединений было принято решение использовать Spring для связи всё в единое пространство на стороне сервера.
Итак встала первая задача увязать конфигурацию BlazeDS со Spring-контекстом. Для этого в первую очередь конфигуируем Spring.
файл WEB-INF\applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<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"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.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">
<!-- FLEX -->
<!-- Перенаправляет запросы на путь /* на BlazeDS MessageBroker -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<value>
/*=mySpringManagedMessageBroker
</value>
</property>
</bean>
<!-- Обрабатывает запросы переадресованные на MessageBroker -->
<bean class="org.springframework.flex.messaging.servlet.MessageBrokerHandlerAdapter"/>
<!-- Запускает и делает доступным BlazeDS MessageBroker -->
<bean id="mySpringManagedMessageBroker" class="org.springframework.flex.messaging.MessageBrokerFactoryBean"/>
<!-- Регистрация bean, который будет доступен для доступа через BlazeDS-->
<bean id="teacherServiceBusiness" class="ru.gubber.elearning.flex.UserListService" >
</bean>
<!-- Объявление сервиса доступного для BlazeDS и связывание его с заегистрированным ранее Bean -->
<bean id="teacherService" class="org.springframework.flex.messaging.remoting.FlexRemotingServiceExporter">
<property name="messageBroker" ref="mySpringManagedMessageBroker"/>
<property name="service" ref="teacherServiceBusiness"/>
</bean>
</beans>
После того, как мы сконфигурировали Spring-контекст надо зарегистрировать этот контекст в web.xml нашего приложения.
<?xml version="1.0" encoding="ISO-8859-1"?>
<!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>
<servlet>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Перенаправляет все *.spring запросы на DispatcherServlet для дальнейшей обработки -->
<servlet-mapping>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<url-pattern>/spring/*</url-pattern>
</servlet-mapping>
</web-app>
Так как мы указали, что BlazeDS(через Spring) будет слушать запросы вида http://{server.name}:{server.port}/{context.root}/spring, то именно это надо указать в настройках каналов в файле WEB-INF\flex\services-config.xml
<channels>
<channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
<endpoint url="http://{server.name}:{server.port}/{context.root}/spring/messagebroker/amf" class="flex.messaging.endpoints.AMFEndpoint"/>
</channel-definition>
.....
</channels>
На этом настройка связи завершается. Осталось только определить нужный нам метод в ru.gubber.elearning.flex.UserListService и вызвать его из нашего Flex (Air) - приложения.
Для начала определим в нашем Java-классе простую функцию, которая возвращает известную всем программистам строку "Hello world!!!"
package ru.gubber.elearning.flex;
public class UserListService {
public String getHelloWorldStr(){
return "HELLO WORLD!!!";
}
}
Теперь настал черёд создать наше Flex-приложение, которое будет показывать во всплывающем окне нашу строку
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute" width="200" height="150"
creationComplete="init()">
<mx:Script>
<![CDATA[
import mx.rpc.events.ResultEvent;
import mx.rpc.events.FaultEvent;
import mx.controls.Alert;
// вызов серверной функции
public function init():void{
testDAO.getHelloWorldStr();
}
// обработчик ошибочного завершения вызова функции
public function handleError(ev:FaultEvent):void{
Alert.show("Ошибка соединения")
}
// обработчик удачного вызова функции
public function handleResult(ev:ResultEvent):void{
Alert.show(ev.result as String)
}
]]>
</mx:Script>
<!-- Обявление серверного сервиса и его функций-->
<mx:RemoteObject id="testDAO" destination="teacherService" endpoint="http://localhost:8080/spring/messagebroker/amf">
<!--Добавляем метод, который будем вызывать и указываем
метод, который будет обрабатывать удачный вызов серверной функции
метод, который будет обрабатывать неудачный вызов серверной функции-->
<mx:method name="getHelloWorldStr"
result="handleResult(event)"
fault="handleError(event)" />
</mx:RemoteObject>
</mx:WindowedApplication>
После запуска приложения, при запущенном вёб-сервере, должно появиться следующее окно с сообщением

Некоторые моменты, на которых я не акцентировал внимание в данном тексте. Веб сервер работает под управлением Tomcat
6.
Добавить комментарий