@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>
オマケ - 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 アプリなんですよ、の確認ってことでおしまい。