Struts2.3+S2JDBC+Flex4を使ってORACLEアクセス - 準備編
Struts2.3+S2JDBC+Flex4のセットアップ方法です。
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 プロジェクトタイプを追加」を選択します。
「デフォルトの SDK を使用する」にチェックを入れ、次へボタンを押下します。
特定の SDK を利用する場合は「特定の SDK を使用する」にチェックを入れて SDK を選択してください。
アプリケーションサーバーの種類を選択します。本来は アプリサーバーに Java、リモートオブジェクトアクセスツールに BlazeDS を選択 したいところですが、後で設定するのでここでは「なし/その他」を選択します。開発中のビルド先である出力フォルダーは任意に変更可能です。特に変更がなければこのまま終了ボタンを押下します。
プロジェクトの生成が終わると以下のように、ディレクトリが増えます。
/p>
よく見るとプロジェクトにエラーがあるようですね。「HTML ラッパーを作成できません・・・」と出ています。メッセージの通り右クリックします。
サブメニューに「HTML テンプレートの再作成」が出てきますので押下します。
「html-template」というディレクトリが作成され、エラーがなくなりました。
「html-template」とは、bin-debug やリリースビルド先である bin-release にビルドされる html テンプレートです。bin-debug や bin-release の html を修正しても、ビルドの度に html-template の内容で上書きされます。どうしても変更が必要な場合は、html-template 内の index.template.html などを修正できます。
Flex4プロジェクトのメインソースフォルダー変更
それでは開発用に設定を変更していきます。まず、プロジェクトの「プロパティ」を開き、右メニューから「Flex ビルドパス」を選択します。
「メインソースフォルダー」を src から flexsrc に変更してOKボタンを押下します。
src 内にある「Main.mxml」は削除してしまいましょう。
Flex4+Seasarの環境構築
Flex4+Seasarを利用するため、BlazeDS, S2BlazeDS を追加します。
BlazeDS とは Action Message Format(AMF) 3 ベースのリモーティングやメッセージングを実装する技術です。BlazeDS を導入することでレスポンスのよい RIA(Rich Internet Application) が実現できます。
まずはこちらのページから 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 をダウンロードしてください。
ダウンロードした 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」の中にペーストします。
その他にも以下のライブラリをダウンロードしておきます。
同じように strtus2-s2jdbc 内「src」-「main」-「webapp」-「WEB-INF」-「lib」の中にペーストします。
コピーが終わったら、プロジェクトのプロパティから「Java のビルド・パス」を選択し、Jar の追加をおこないます。
ちょっと画像が長いですが 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」の中にペーストします。
今回 アプリサーバーは 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アクセス - 実装編 で実装する処理をご紹介します。
おつかれさまでした。