Flex

Adobe FlexでRIAアプリケーションの展開


手始めにJ2EEコンテナへの展開方法を以下に示します。
XMLを2つ書いて、リモートから呼び出したいJavaのClassを作成します。

[ web.xml ]
----------------
<?xml version="1.0" encoding="UTF-8"?>

<!--
    - START SNIPPET: webxml
-->
<!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>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>
</web-app>
[ EOF ]
----------------

[ WEB-INF\flex\services-config.xml ]
----------------
<?xml version="1.0" encoding="UTF-8"?>
<services-config>

    <services>
        <!-- service要素には何でもいいからIDが要る模様 -->
        <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>
                 <!-- HTTP用 -->
                <channel ref="my-amf" />

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

            <!-- destination要素のIDが mx:RemoteObjectの destination プロパティに対応する -->
            <destination id="flexService">
                <properties>
                    <!-- リモート呼び出ししたいJava Beansのクラス名 -->
                   <!-- リモート呼び出しを可能にしたい Beanの数だけ destination要素を記述する -->
                    <!-- 注:この Beanはステートレスである -->
                    <source>com.chocbanana.ws.FlexService</source>
                </properties>
            </destination>
        </service>

    </services>

    <channels>
        <channel-definition id="my-amf"
            class="mx.messaging.channels.AMFChannel">
            <!--
                ここで構成されたエンドポイントURLを mx:RemoteObjectの
                endpoint プロパティにセットする
                {}内は実行時に自動で置き換えられるのでこの記述のままで良い。
            -->
            <endpoint
                url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf"
                class="flex.messaging.endpoints.AMFEndpoint" />
        </channel-definition>

        <!-- SSL用チャンネルの定義 -->
        <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>
    </channels>
</services-config>
[ EOF ]
----------------

   ...あとは普通にMVCでコーディングしていくだけ。

[ com.chocbanana.ws.FlexService ]
-------------
package com.chocbanana.ws;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class FlexService{
   
    private String dbDriver = null;
    private Db2Interface dao = null;
    private Properties prop = null;
    private static final String contextFile = "com/chocbanana/db/dataSource.xml";
    private static final String contextBean = "db";
   
    public FlexService(){
        prop = new Properties();
        InputStream in = FlexService.class.getResourceAsStream("/com/chocbanana/db/database.properties");
        try{
            prop.load(in);
            dbDriver = prop.getProperty("db.driver");
        }catch(java.io.IOException ioe){
            ioe.printStackTrace();
        }
    }
     ・・・省略・・・
}
[ EOF ]
-------------

 MVCのViewに当たるFlex側で、RemoteObjectを設定すればOK.
MXML内にRemoteObjectを定義して、ActionScriptで呼び出すだけ。

[ App.mxml ]
<mx:Script source="App.as"/>
<mx:RemoteObject id="srv" destination="flexService" endpoint="{'http://{server.name}/messagebroker/amf'}" />

[ App.as ]
--------------
var role:LoginRole = srv.getLoginUser.lastResult as LoginRole;
srv.getLoginUser(uname);
[ EOF ]
--------------

などなど。JavaBeanを戻り値として得ることも可能。

このページの先頭へ