플렉스 세션에 대한 예제가 별로 없어서 찾기 힘들었는데 그냥 서블릿세션처럼 쓰면 되는 것이더군요-_-;
우선 플렉스세션을 만들어야하는데 서버측 프로그래밍할 때 그냥 FlexSession쓸라고하면 에러납니다. LCDS깔 때 있는 flex.war파일에 포함되어있는 jar파일을 서버측 프로그래밍 할 때 즉 컴파일할 때 필요합니다.
저는 작업할 때 Flex Builder2랑 Eclipse랑 두개 띄워놓고 작업합니다-_-;
자바 프로그래밍 하기 위해서 Eclipse에서 세션을 만들어봅시다.
우선 Dynamic Web Project로 프로젝트를 하나 만듭니다.
그리고 필요한 jar파일을 넣어야합니다. flex.war가 디플로이 되면 WEB-INF\LIB폴더에 JAR파일이 있는데 여기서 message관련된거 이클립스에서 만든 프로젝트 lib에다가 복사합니다(사실 잘 몰라서 다 복사했습니다-_-;)
flex-messaging.jar, flex-messaging-common.jar, flex-messaging-opt.jar, flex-messaging-req.jar ^^
[code]
package flex.session;
import flex.messaging.FlexSession;
import flex.messaging.FlexContext;
public class SessionRO {
public void setSession(String id) {
FlexSession session = FlexContext.getFlexSession();
session.setAttribute("id", id);
System.out.println("세션설정성공");
}
public String getSession() {
FlexSession session = FlexContext.getFlexSession();
String id = session.getAttribute("id").toString();
System.out.println("세션가져오기성공");
return id;
}
public void removeSession() {
FlexSession session = FlexContext.getFlexSession();
session.invalidate();
}
}
[/code]
간단합니다. setSession은 세션을 설정(로그인시)하는 것이고, getSession은 세션을 가져오는 것이고(있으면!), removeSession은 세션을 삭제(로그아웃시)하는 것입니다.
근데 문제점은 이놈을 테스트하려면 {was}/webapp/flex/WEB-INF/classes/에 복사해놓고 mxml이나 as에서 밖에 테스트를 못합니다-_-; jsp에서 테스트를 하려니 안되더군요 ^^ 꽤 고생했습니다-_-;
아 그리고 DB구조는 이렇게 되어있습니다.
[code]
CREATE TABLE `bs_Member` (
`id` varchar(20) NOT NULL,
`pwd` varchar(20) default NULL,
`name` varchar(20) default NULL,
`age` int(10) unsigned default NULL,
`sex` varchar(20) default NULL,
`tel` varchar(20) default NULL,
PRIMARY KEY (`id`)
)
[/code]
로그인 메소드를 보도록 합시다.
[code]
public int Login(String id, String pw) {
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
String jdbcDriver = "jdbc:apache:commons:dbcp:/pool";
con = DriverManager.getConnection(jdbcDriver);
pstmt = con.prepareStatement("SELECT pwd FROM bs_Member WHERE id = binary(?)");
pstmt.setString(1, id);
rs = pstmt.executeQuery();
rs.last();
int rowCount = rs.getRow();
rs.beforeFirst();
if(rowCount != 0) {
rs.next();
if(pw.equals(rs.getString("pwd"))) {
return 1;
} else {
return 2;
}
}
else {
return 3;
}
} catch (SQLException e) {
e.printStackTrace();
return 0;
} finally {
if (rs != null) try { rs.close(); } catch(SQLException ex) {}
if (pstmt != null) try { pstmt.close(); } catch(SQLException ex) {}
if (con != null) try { con.close(); } catch(SQLException ex) {}
}
}
[/code]
bs_Member테이블에서 로그인한 id가 있는지 검사를 하고 id가 있으면 3를 리턴하고, 없으면 비밀번호가 같은지 검사하고 같으면 1을 리턴하고, 틀리면 2를 리턴합니다. 플렉스 as에서 1을 받으면 성공이라고 뿌리고 이런식으로 했습니다.
자 그러면 flex에서 보도록 합시다.
[code]
<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="100%"
height="100%" xmlns:comp="*" backgroundColor="#c0c0c0"
backgroundAlpha="0.7" creationComplete="initWindow()">
<mx:Script>
<![CDATA[
import mx.rpc.events.ResultEvent;
import mx.rpc.events.FaultEvent;
import mx.rpc.remoting.RemoteObject;
import mx.controls.Alert;
private function initWindow():void {
loginwindow.x = this.width / 2 - 150;
loginwindow.y = this.height / 2 - 150;
}
private function RequestLogin():void {
var srv:RemoteObject = new RemoteObject();
loginbtn.enabled = false;
joinbtn.enabled = false;
srv.destination = "booksystem";
srv.Login(idtext.text, pwtext.text);
srv.addEventListener("result", resultHandler);
srv.addEventListener("fault", faultHandler);
}
private function resultHandler(event:ResultEvent):void {
var result:int = int(event.result);
var srv:RemoteObject = new RemoteObject();
srv.destination = "session";
switch (result) {
case 0 :
Alert.show("DB오류입니다.");
break;
case 1 :
Alert.show(idtext.text + "님 환영합니다.");
srv.addEventListener("result", sessionresultHandler);
srv.addEventListener("fault", sessionfaultHandler);
srv.setSession(idtext.text);
loginbtn.enabled = true;
joinbtn.enabled = true;
break;
case 2 :
Alert.show("비밀번호가 틀립니다.");
pwtext.text = "";
loginbtn.enabled = true;
joinbtn.enabled = true;
break;
case 3 :
Alert.show("ID가 없습니다.");
pwtext.text = "";
loginbtn.enabled = true;
joinbtn.enabled = true;
break;
}
}
private function faultHandler(event:FaultEvent):void {
Alert.show("실패 메세지: " + event.fault.message);
loginbtn.enabled = true;
joinbtn.enabled = true;
}
private function sessionresultHandler(event:ResultEvent):void {
parentApplication.loginid = idtext.text;
parentApplication.infota.text = idtext.text + "님 방가방가!";
idtext.text = "";
pwtext.text = "";
visible = false;
}
private function sessionfaultHandler(event:FaultEvent):void {
Alert.show("실패 메세지: " + event.fault.message);
}
]]>
</mx:Script>
<mx:TitleWindow id="loginwindow" width="300" height="200" layout="absolute"
title="M.C the MAX공연 예매 시스템에 오신 것을 환영합니다.">
<mx:Label x="64.5" y="35" text="ID : "/>
<mx:Label x="64.5" y="65" text="PW : "/>
<mx:TextInput id="idtext" x="103.5" y="33" width="112"/>
<mx:TextInput id="pwtext" x="103.5" y="63" width="112"
displayAsPassword="true" enter="RequestLogin();"/>
<mx:Button id="loginbtn" x="64.5" y="93" label="로그인"
width="73" click="RequestLogin();"/>
<mx:Button id="joinbtn" x="145.5" y="93" label="회원가입"
click="parentApplication.showJoin();"/>
</mx:TitleWindow>
</mx:Canvas>
[/code]
id, pw를 입력하고 엔터 또는 로그인버튼을 클릭하게 되면 RemoteObject를 통해서 Login메소드를 호출하게 됩니다. 호출을 해서 성공적으로 리턴하면 resultHandler함수에 리턴값을 받아 그 리턴값에 따라 Alert을 해줍니다. 로그인을 성공해버리면 setSession을 통해 세션을 설정합니다.
이게 다군요-_-; 로그인을 성공하게 되면 자기자신은 visible을 false로 바꿔버립니다. 그래서 뒤에 있는 실제 메뉴를 건드릴 수 있게 했죠-_-; 아....진짜 이따구로도 가능하다는 것을 보여주는군요.
http://mudchobo.tomeii.com/tt/108