kagamihogeの日記

kagamihogeの日記です。

Flex 勉強に S2BlazeDS から HttpSession さわる

	@Binding
	protected HttpSession session;

S2BlazeDS から HttpSession とか見るのってどうやるのかな? と思っての実験……するまでもなかったといいますか。Teeda 使ってるときみたいなノリでやればいいのね。S2 コンテナ上で動いてるんだから、こんなの当たり前なことにやってみるまで気付かなかった俺。

それだけじゃナンなので「HttpSession にログイン状態を示すオブジェクトのっける」的な何か(実用的かどうかはともかく)を書いてみた。

public class HttpSessionTestService {
	@Binding
	protected HttpSession session;
	
	public String login() {
		LoginDto dto = new LoginDto();
		session.setAttribute("hoge", dto);
		return "login しますた:" + session.toString();
	}
	
	public String logouts() {
		Object o = session.getAttribute("hoge");
		if (o == null) {
			return "logout しようとしたけどヌルでした";
		}
		session.removeAttribute("hoge");
		return "logout しますた:" + session.toString();
	}
	
	public String methodAfterLogin() {
		Object o = session.getAttribute("hoge");
		if (o == null) {
			return "login してませんよ";
		}
		return "login して methodAfterLogin よびますた";
	}
}

ログアウトのメソッド名が logout でなく logouts なのは AbstractService.html#logout() とかぶるからw

LoginDto は中身からっちょなので省略。

あまり意味のない実行画面の様子。

Flex 側はこんな感じ。まぁこっちも Java 側同様テキトーな代物。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:dto="flex.s2blazedstest.dto.*">
	<mx:Script>
		<![CDATA[
			import mx.rpc.events.FaultEvent;
			import mx.rpc.events.ResultEvent;
			
			private function loginResultHandler(event:ResultEvent):void {
				t.text = t.text + event.result.toString() +"\n";
			}
			
			private function logoutsResultHandler(event:ResultEvent):void {
				t.text = t.text + event.result.toString() +"\n";
			}
			
			private function methodAfterLoginResultHandler(event:ResultEvent):void {
				t.text = t.text + event.result.toString() +"\n";
			}
						
			private function f(event:FaultEvent):void {
				trace("falut");
				t.text = t.text + "fault";
			}
		]]>
	</mx:Script>
	
    <mx:RemoteObject id="loginSrv" destination="httpSessionTestService" fault="f(event)" >
        <mx:method name="login" result="loginResultHandler(event)"/>
        <mx:method name="logouts" result="logoutsResultHandler(event)"/>
        <mx:method name="methodAfterLogin" result="methodAfterLoginResultHandler(event)"/>
    </mx:RemoteObject>
	
	<mx:Button x="10" y="40" id="login" label="login" click="loginSrv.login()"/>
	<mx:Button x="74" y="40" id="methodAfterLogin" label="methodAfterLogin" click="loginSrv.methodAfterLogin()"/>
	<mx:Button x="213" y="40" id="logouts" label="logouts" click="loginSrv.logouts()"/>
	<mx:TextArea id="t" x="10" y="70" width="476" height="277"/>
</mx:Application>

RPC っぽく Flex + Java が書けるけど根は web アプリ

ってことを認識しとくことが大事だな、と。HttpSession うんぬんよりもこの事実を心に留めとくのが大事な気がする。

オマケ - S2BlazeDS アプリの初期化

↑で書いたように Flex + Java といってもフツーの Servlet アプリなことには変わらないので教科書通りやればよい。

package testhoge.servlet;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

public class InitServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	@Override
	public void init(ServletConfig config) throws ServletException {
		super.init(config);
		
		System.out.println("Init servlet stand by ready");
		
		System.out.println("Init servlet end");
	}
}

みたいなのを作って web.xml に登録。

    <servlet>
        <servlet-name>initializer</servlet-name>
        <servlet-class>testhoge.servlet.InitServlet</servlet-class>
        <load-on-startup>3</load-on-startup>
    </servlet>

とか。他にもやり方あるよなーてか S2 コンテナ上でアプリ初期化処理したい場合ってどうすんのかなーと思ってフラフラしてたら という情報があったのでメモ。


まぁ S2BlazeDS いうても web アプリなんですよ、の確認ってことでおしまい。