Struts2.3+S2JDBC+Flex4を使ってORACLEアクセス - 準備編

Struts2.3+S2JDBC+Flex4のセットアップ方法です。

Struts2.3+S2JDBC+Flex4を使ってORACLEアクセス - 準備編

Flexは強力なRIA(Rich Internet Application)の開発フレームワーク です。Webアプリの構築においては、Javaとの相性がよく、開発言語 ActionScript3 が Java と似ていることから習得も容易です。

ここでは、とにかく動く環境を作ることが目的なので、Strtus2、Seasar、Flex4 の細かな説明は省きます。ORACLEへの接続は次回ご紹介します。

前回までの「Struts2.3+S2JDBCのインストールからDBアクセス(ORACLE)まで」で構築した環境を使って説明します。


Flex4の開発環境を準備する

まずは開発環境を準備しましょう。こちらのページを参考に Flex4 を Eclipse プラグインとしてインストールしてください。

Flex4 を Eclipse プラグインとしてインストールできたら、Eclipse 上でプロジェクトを右クリックします。「プロジェクトタイプを追加または変更」-「Flex プロジェクトタイプを追加」を選択します。

プロジェクトタイプを追加または変更からFlex プロジェクトタイプを追加を選択

「デフォルトの SDK を使用する」にチェックを入れ、次へボタンを押下します。

特定の SDK を利用する場合は「特定の SDK を使用する」にチェックを入れて SDK を選択してください。

Flex SDKのバージョン選択

アプリケーションサーバーの種類を選択します。本来は アプリサーバーに Java、リモートオブジェクトアクセスツールに BlazeDS を選択 したいところですが、後で設定するのでここでは「なし/その他」を選択します。開発中のビルド先である出力フォルダーは任意に変更可能です。特に変更がなければこのまま終了ボタンを押下します。

アプリケーションサーバの種類を選択

プロジェクトの生成が終わると以下のように、ディレクトリが増えます。

Flexプロジェクトの生成完了/p>

よく見るとプロジェクトにエラーがあるようですね。「HTML ラッパーを作成できません・・・」と出ています。メッセージの通り右クリックします。

HTML ラッパーを作成できません

サブメニューに「HTML テンプレートの再作成」が出てきますので押下します。

HTML テンプレートの再作成

「html-template」というディレクトリが作成され、エラーがなくなりました。

HTML ラッパーを作成できませんエラー解除

「html-template」とは、bin-debug やリリースビルド先である bin-release にビルドされる html テンプレートです。bin-debug や bin-release の html を修正しても、ビルドの度に html-template の内容で上書きされます。どうしても変更が必要な場合は、html-template 内の index.template.html などを修正できます。

Flex4プロジェクトのメインソースフォルダー変更

それでは開発用に設定を変更していきます。まず、プロジェクトの「プロパティ」を開き、右メニューから「Flex ビルドパス」を選択します。

Flex ビルドパスを選択

「メインソースフォルダー」を src から flexsrc に変更してOKボタンを押下します。

メインソースフォルダーをflexsrcに変更

src 内にある「Main.mxml」は削除してしまいましょう。

Main.mxmlは削除

Flex4+Seasarの環境構築

Flex4+Seasarを利用するため、BlazeDS, S2BlazeDS を追加します。

BlazeDS とは Action Message Format(AMF) 3 ベースのリモーティングやメッセージングを実装する技術です。BlazeDS を導入することでレスポンスのよい RIA(Rich Internet Application) が実現できます。

まずはこちらのページから BlazeDS をダウンロードしてください。

BlazeDS ダウンロード

ダウンロードした zip ファイル内から以下のライブラリをコピーします。

  • commons-httpclient-3.0.1.jar
  • flex-messaging-common.jar
  • flex-messaging-core.jar
  • flex-messaging-opt.jar
  • flex-messaging-proxy.jar
  • flex-messaging-remoting.jar

これをプロジェクト strtus2-s2jdbc 内「src」-「main」-「webapp」-「WEB-INF」-「lib」の中にペーストします。

次は S2BlazeDS です。

S2BlazeDS とは、BlazeDS というミドルウェアを使って Flex/AIR と Seasar2 を連携させるためのフレームワークです。 Seasar2 と S2BlazeDS を組み合わせることで、余計な設定を省き、スムーズに開発を進めることができます。

こちらのページから S2BlazeDS をダウンロードしてください。

S2BlazeDS - Download

ダウンロードした zip ファイル内から以下のライブラリをコピーします。

  • blazeds-common-3.2.0.3978.jar
  • blazeds-core-3.2.0.3978.jar
  • blazeds-opt-3.2.0.3978.jar
  • blazeds-proxy-3.2.0.3978.jar
  • blazeds-remoting-3.2.0.3978.jar
  • s2blazeds-1.0.2.jar

これをプロジェクト strtus2-s2jdbc 内「src」-「main」-「webapp」-「WEB-INF」-「lib」の中にペーストします。

その他にも以下のライブラリをダウンロードしておきます。

backport-util-concurrent

同じように strtus2-s2jdbc 内「src」-「main」-「webapp」-「WEB-INF」-「lib」の中にペーストします。

コピーが終わったら、プロジェクトのプロパティから「Java のビルド・パス」を選択し、Jar の追加をおこないます。

Java のビルド・パスを選択しJarを追加

ちょっと画像が長いですが lib ディレクトリ内はこうなっています。

libディレクトリ内

Flex の設定をWeb.xmlへ追記

Flex の設定を Web.xml に追記します。追加するタグは listener, servlet, servlet-mapping です。

<listener>
  <listener-class>flex.messaging.HttpFlexSession</listener-class>
</listener>
<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>

flex.messaging.MessageBrokerServlet の load-on-startup は 1 とします。代わりに org.seasar.framework.container.servlet.S2ContainerServlet を 2 とします。

全体の Web.xml はこうなります。

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="sakaen" version="2.5" 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_5.xsd">
  <filter>
    <filter-name>hotdeployfilter</filter-name>
    <filter-class>
      org.seasar.framework.container.hotdeploy.HotdeployFilter
    </filter-class>
  </filter>
  <filter>
    <filter-name>s2filter</filter-name>
    <filter-class>
      org.seasar.framework.container.filter.S2ContainerFilter
    </filter-class>
  </filter>
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>
      org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
    </filter-class>
    <init-param>
      <param-name>actionPackages</param-name>
      <param-value>sakaen.action</param-value>
    </init-param>
  </filter>

  <filter-mapping>
    <filter-name>hotdeployfilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>s2filter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <listener>
    <listener-class>flex.messaging.HttpFlexSession</listener-class>
  </listener>
  <listener>
    <listener-class>
      org.seasar.framework.container.servlet.S2ContainerListener
    </listener-class>
  </listener>

  <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>
    <servlet-name>s2servlet</servlet-name>
    <display-name>Seasar2 Servlet</display-name>
    <servlet-class>
      org.seasar.framework.container.servlet.S2ContainerServlet
    </servlet-class>
    <load-on-startup>2</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>MessageBrokerServlet</servlet-name>
    <url-pattern>/messagebroker/*</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>s2servlet</servlet-name>
    <url-pattern>/s2servlet/*</url-pattern>
  </servlet-mapping>

</web-app>

Flex Configファイルの配備

BlazeDS を利用する場合、いくつかの Config ファイルを設定する必要があります。

ダウンロードした BlazeDS の「WEB-INF」-「flex」の中に、以下のファイルがあるのでコピーしてください。

  • messaging-config.xml
  • proxy-config.xml
  • remoting-config.xml
  • services-config.xml

flex ディレクトリを strtus2-s2jdbc 内「src」-「main」-「webapp」-「WEB-INF」の中にペーストします。

BlazeDSのConfigファイルをコピー

今回 アプリサーバーは Tomcat で、S2BlazeDS を利用するのでそのように書き換えます。

services-config.xml

flex.messaging.endpoints.AMFEndpoint を org.seasar.blazeds.endpoints.S2AMFEndpoint に変更します。

<!--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-amf" class="mx.messaging.channels.AMFChannel">
  <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf" class="org.seasar.blazeds.endpoints.S2AMFEndpoint"/>
</channel-definition>

flex.messaging.endpoints.SecureAMFEndpoint を org.seasar.blazeds.endpoints.S2SecureAMFEndpoint に変更します。

<!--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-secure-amf" class="mx.messaging.channels.SecureAMFChannel">
  <endpoint url="https://{server.name}:{server.port}/{context.root}/messagebroker/amfsecure" class="org.seasar.blazeds.endpoints.S2SecureAMFEndpoint"/>
  <properties>
    <add-no-cache-headers>false</add-no-cache-headers>
  </properties>
</channel-definition>

全体の 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="Tomcat"/>
    <!-- Uncomment the correct app server
    <login-command class="flex.messaging.security.TomcatLoginCommand" server="JBoss">

    <login-command class="flex.messaging.security.WeblogicLoginCommand" server="Weblogic"/>
    <login-command class="flex.messaging.security.WebSphereLoginCommand" server="WebSphere"/>
    -->

    <!--
    <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="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-amf" class="mx.messaging.channels.AMFChannel">
      <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf" class="org.seasar.blazeds.endpoints.S2AMFEndpoint"/>
    </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-secure-amf" class="mx.messaging.channels.SecureAMFChannel">
      <endpoint url="https://{server.name}:{server.port}/{context.root}/messagebroker/amfsecure" class="org.seasar.blazeds.endpoints.S2SecureAMFEndpoint"/>
      <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-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="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</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>

remoting-config.xml

flex.messaging.services.remoting.adapters.JavaAdapter を org.seasar.blazeds.adapters.S2Adapter に変更します。

<adapters>
  <!-- adapter-definition id="java-object" class="flex.messaging.services.remoting.adapters.JavaAdapter" default="true"/ -->
  <adapter-definition id="s2-object" class="org.seasar.blazeds.adapters.S2Adapter" default="true"/>
</adapters>

全体の 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"/ -->
    <adapter-definition id="s2-object" class="org.seasar.blazeds.adapters.S2Adapter" default="true"/>
  </adapters>

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

</service>

struts.xmlの変更

struts.xml にも変更が必要です。以下の記述を追加します。

<constant name="struts.action.excludePattern" value="/messagebroker/amf"/>

excludePattern に定義したパターンにマッチするリクエストは、ActionMapper#getMapping や StaticContentLoader 処理がスキップされます。

全体の struts.xml はこうなります。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
  "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
  <constant name="struts.enable.DynamicMethodInvocation" value="true" />
  <constant name="struts.action.excludePattern" value="/messagebroker/amf"/>
</struts>

これで設定はおしまいです。Tomcat を起動してエラーが出ないことを確認します。

エラーが出たらどこか設定が間違っているので確認してみてください。

次回は Struts2.3+S2JDBC+Flex4を使ってORACLEアクセス - 実装編 で実装する処理をご紹介します。

おつかれさまでした。

この記事がお役に立ちましたら シェア をお願いいたします。