이번엔 DataGrid를 이용해봅시다!-_-;
예약 리스트를 받아와야하기 때문에 더 쉽습니다-_-; 이 DataGrid라는 놈이 너무 강력해서-_-; 자바Bean이랑 매우 잘 맞아요!
자바측에서 List형태로 리턴하게 되면 DataGrid의 dataProvider가 알아서 다 해줍니다.
우선 자바측의 예약 취소하기 메소드를 보도록 합시다.
[code]
public int BookCancel(int[] seatnum) {
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
String jdbcDriver = "jdbc:apache:commons:dbcp:/pool";
con = DriverManager.getConnection(jdbcDriver);
// 현재 요청된 변호레코드의 ID와 좌석번호, ID와 맞는 비번을 추출
for (int i=0; i<seatnum.length; i++) {
pstmt = con.prepareStatement("DELETE FROM bs_Book WHERE seatnum = ?");
pstmt.setInt(1, seatnum[i]);
pstmt.executeUpdate();
pstmt = con.prepareStatement(
"UPDATE bs_Seat SET isbooked='X' WHERE seatnum = ?");
pstmt.setInt(1, seatnum[i]);
pstmt.executeUpdate();
}
return 1;
} 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]
아 이거 배열로 처리하려고 했는데 DataGrid에서 다중선택을 할 줄 모르겠어요-_- 아는 사람 좀 가르쳐주세요!
어쨌든-_-; 한개만 넘겼다고 치고 해봅시다. 해당 좌석번호를 찾아서 bs_Book테이블에서 삭제를 하고 bs_Seat테이블에는 예약여부(isbooked)에 X로 바꿔주면 끝납니다.
이제 플렉스로 가봅시다.
[code]
<?xml version="1.0" encoding="utf-8"?>
<mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
width="100%" height="100%" title="예약취소하기">
<mx:Script>
<![CDATA[
import mx.rpc.events.ResultEvent;
import mx.rpc.events.FaultEvent;
import mx.rpc.remoting.RemoteObject;
import mx.controls.Alert;
private function bookCancel():void {
var cancellist:Array = new Array();
var srv:RemoteObject = new RemoteObject();
var i:int;
srv.destination = "booksystem";
if (dg.selectedItem == null){
Alert.show("좌석을 선택하세요!");
return;
}
cancellist.push(int(dg.selectedItem.seatnum));
srv.BookCancel(cancellist);
srv.addEventListener("result", resultHandler);
srv.addEventListener("fault", faultHandler);
}
// Result Handler
private function resultHandler(event:ResultEvent):void {
var result:int = int(event.result);
switch (result) {
case 0 :
Alert.show("DB오류입니다.");
break;
case 1 :
Alert.show("예약취소가 완료되었습니다.");
parentApplication.viewstack.selectedChild = parentApplication.ViewHome;
break;
}
}
private function faultHandler(event:FaultEvent):void {
mx.controls.Alert.show("실패 메세지: " + event.fault.message);
}
public function UpdateBookcancel():void {
var srv:RemoteObject = new RemoteObject();
srv.destination = "booksystem";
srv.addEventListener("result", bookresultHandler);
srv.addEventListener("fault", bookfaultHandler);
srv.getBook(parentApplication.loginid);
}
private function bookresultHandler(event:ResultEvent):void {
dg.dataProvider = event.result;
parentApplication.viewstack.selectedChild=parentApplication.ViewBookCancel;
}
private function bookfaultHandler(event:FaultEvent):void {
mx.controls.Alert.show("실패 메세지: " + event.fault.message);
}
]]>
</mx:Script>
<mx:DataGrid id="dg" width="100%" height="100%" />
<mx:ControlBar horizontalAlign="center">
<mx:Button label="예약취소하기" click="bookCancel()"/>
</mx:ControlBar>
</mx:Panel>
[/code]
우선 UpdateBookcancel을 실행하게 되면 getBook함수를 호출하는데 이 함수는 예약리스트를 List객체에 받아오는 역할을 합니다.
dg.dataProvider = event.result; (dg는 DataGrid의 id)
이 결과를 그냥 dg.dataProvider에 처 넣으면 됩니다-_-; 그러면 알아서 테이블로 표시가 됩니다.
그리고 해당줄을 선택하고, 예약취소버튼을 누르면 bookCancel함수를 호출하는데 여기서 자바클래스에 있는 BookCancel함수를 호출하게 됩니다.
선택된 좌석은 dg.selectedItem.seatnum 이렇게 하면 알 수 있습니다.
'flex'에 해당되는 글 84건
- 2007.09.25 [FLEX] 예매시스템5 - 예약취소하기부분!-_-; DataGrid!
- 2007.09.25 [FLEX] 예매시스템4 - 예약하기부분!-_-; DB구조와 ArrayCollection! 6
- 2007.09.25 [FLEX] 예매시스템3 - 메인부분!-_-; ViewStack!
- 2007.09.25 [FLEX] 예매시스템2 - 회원가입부분!-_-;
- 2007.09.25 [FLEX] 예매시스템1 - 로그인부분(FlexSession사용) 8
예약하기부분... 머리가 딸려서 좀 고생했습니다-_-;
아....mxml에서는 반복문 못 쓰는 건가요? 버튼을 90개 만들고 싶은데 다 적을 수도 없고 해서-_-;
as에서 구현을 했습니다 ^^
우선 예약하기부분의 자바클래스를 보도록 합시다.
아 우선 DB구조를 보도록 합시다.
bs는 Booksystem의 약자고요-_-;
bs_Book은 예약리스트입니다. 3개의 필드로 되어있는데요. booknum, id, seatnum으로 되어있구요.
bs_Seat은 seatnum, grade, isbooked로 되어있어요.
예약을 하게 되면 bs_Seat에서 isbooked를 O로 바꾸고 bs_Book에 그 해당 번호와 예약한 id를 저장합니다. booknum은 오토인크리스먼트입니다.
간단한건데 왜이렇게 복잡하게 설명해놨지-_-; 뭐 어쨌든--; 간단합니다-_-;
[code]
public int BookSeat(String id, int[] seatnum) {
Connection con = null;
PreparedStatement pstmt = null;
try {
String jdbcDriver = "jdbc:apache:commons:dbcp:/pool";
con = DriverManager.getConnection(jdbcDriver);
// 요청한 좌석이 예약된 좌석인지 확인을 위해 IsBooked를 추출
for (int i=0; i<seatnum.length; i++) {
pstmt = con.prepareStatement(
"UPDATE bs_Seat SET isbooked='O' WHERE bs_Seat.seatnum = ?");
pstmt.setInt(1, seatnum[i]);
pstmt.executeUpdate();
pstmt = con.prepareStatement(
"INSERT INTO bs_Book (id, seatnum) " + "VALUES (?, ?)");
pstmt.setString(1, id);
pstmt.setInt(2, seatnum[i]);
pstmt.executeUpdate();
}
return 1;
} catch (SQLException e) {
e.printStackTrace();
return 0;
} finally {
if (pstmt != null) try { pstmt.close(); } catch(SQLException ex) {}
if (con != null) try { con.close(); } catch(SQLException ex) {}
}
}
[/code]
int형배열로 받습니다. 다중선택으로 올 수 있기 때문에-_-; 받아서 for문으로 개수만큼 실행합니다. 우선 bs_Seat테이블에서 예약여부필드에서 예약이 됐다는 의미에서 O로 바꾼 뒤에 bs_Book테이블 예약리스트테이블에 해당 id와 좌석번호(seatnum)을 집어 넣습니다. 예약요청하는 수만큼 반복합니다.
플렉스로 가봅시다-_-;
[code]
<?xml version="1.0" encoding="utf-8"?>
<mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
width="100%" height="100%"
creationComplete="CreateButton()" title="좌석 예약하기">
<mx:Script>
<![CDATA[
import mx.containers.ControlBar;
import mx.controls.Button;
import mx.rpc.events.ResultEvent;
import mx.rpc.events.FaultEvent;
import mx.collections.ArrayCollection;
import mx.controls.Alert;
import mx.rpc.remoting.RemoteObject;
public var seatlistAC:ArrayCollection;
public var bookseatAC:ArrayCollection = new ArrayCollection();
public var count:int = 0;
// 처음 Panel이 생성될 때 실행되는 버튼생성함수
public function CreateButton():void {
var i:int;
var j:int;
var space:int;
for (i = 0; i < 9; i++) {
for (j = 0; j < 10; j++) {
var btn:Button = new Button();
if (i < 3) {
btn.label = "R" + (i*10+j+1);
space = 0;
} else if (i < 6) {
btn.label = "S" + (i*10+j+1);
space = 30;
} else {
btn.label = "A" + (i*10+j+1);
space = 60;
}
btn.id = String(i*10+j+1);
btn.name = "btn" + String(i*10+j+1);
btn.x = j * 50;
btn.y = i * 30 + space + 10;
btn.width = 35;
btn.height = 20;
btn.setStyle("fillColors", ["#000000","#000000"]);
btn.addEventListener(MouseEvent.CLICK, btnclickEvent);
addChild(btn);
}
}
}
// 버튼클릭시 이벤트
private function btnclickEvent(e:Event):void {
var btn:Button = Button(e.currentTarget);
var i:int;
for (i = 0; i < bookseatAC.length; i++){
if (bookseatAC.getItemAt(i) == btn.id){
bookseatAC.removeItemAt(i);
btn.setStyle("fillColors", ["#000000","#000000"]);
count--;
return;
}
}
if (count == 4) {
Alert.show("더이상 선택할 수 없습니다.");
return;
}
count++;
bookseatAC.addItem(btn.id);
btn.setStyle("fillColors", ["#ff0000","#ff0000"]);
}
// 예약하기버튼 클릭시 발생하는 이벤트
private function bookseatEvent():void {
if (count == 0) {
Alert.show("좌석을 선택하세요!");
return;
}
var bookseatlist:Array = [];
var srv:RemoteObject = new RemoteObject();
var i:int;
srv.destination = "booksystem";
for (i=0; i<bookseatAC.length; i++) {
bookseatlist.push(int(bookseatAC.getItemAt(i)));
}
srv.BookSeat(parentApplication.loginid, bookseatlist);
srv.addEventListener("result", resultHandler);
srv.addEventListener("fault", faultHandler);
}
// 예약하기 버튼 클릭시 실행하는 RemoteObject에 대한 이벤트핸들러
private function resultHandler(event:ResultEvent):void {
var result:int = int(event.result);
switch (result) {
case 0 :
Alert.show("DB오류입니다.");
break;
case 1 :
Alert.show("예약에 성공했습니다.");
bookseatAC.removeAll();
parentApplication.viewstack.selectedChild = parentApplication.ViewHome;
count = 0;
break;
}
}
private function faultHandler(event:FaultEvent):void {
mx.controls.Alert.show("실패 메세지: " + event.fault.message);
}
// 예약여부확인 후 버튼업데이트
public function UpdateBookseat():void {
var srv:RemoteObject = new RemoteObject();
srv.destination = "booksystem";
srv.addEventListener("result", seatresultHandler);
srv.addEventListener("fault", seatfaultHandler);
srv.getSeat();
}
private function seatresultHandler(event:ResultEvent):void {
var i:int;
var btn:Button;
seatlistAC = ArrayCollection(event.result);
for (i = 0; i < seatlistAC.length; i++){
btn = Button(this.getChildByName("btn" + String(i+1)));
btn.setStyle("fillColors", ["#000000","#000000"]);
if (seatlistAC[i].isbooked == "O") {
btn.enabled = false;
} else {
btn.enabled = true;
}
}
parentApplication.viewstack.selectedChild=parentApplication.ViewBookSeat;
}
private function seatfaultHandler(event:FaultEvent):void {
mx.controls.Alert.show("실패 메세지: " + event.fault.message);
}
]]>
</mx:Script>
<mx:ControlBar id="ctrbar" horizontalAlign="center">
<mx:Button id="bookbtn" label="예약하기" click="bookseatEvent();"/>
</mx:ControlBar>
</mx:Panel>
[/code]
아 길군요-_-; 우선 컴포넌트가 생성이 되면 CreateButton함수를 호출하게 되어있습니다. 이것이 패널에다가 90개의 버튼을 만들어주는 함수입니다. 각각 구별할 수 있게 id와 name을 주고 각 버튼마다 이벤트를 등록했습니다. 그리고 addChild라는 함수는 Panel에 자식으로 붙이겠다는 얘깁니다.
버튼이 생성되면 이미 예약되어있는 좌석은 비활성화 해야합니다. getSeat을 호출하면 좌석정보를 List객체에 담아오는데 이것을 ArrayCollection으로 받습니다.
seatlistAC = ArrayCollection(event.result); 이런식으로 받아오면 됩니다.
해당 되는 버튼은 enable = false로 해서 비활성화시킵니다.
버튼을 생성하고 그 해당 버튼을 클릭하게 되면 이벤트로 등록한 함수를 호출하게 되는데 btnclickEvent 이 함수를 호출하게 됩니다. 클릭할 때마다 ArrayCollection에다가 집어넣습니다-_-; 아..쓰면서 느낀건데 ArrayCollection할 필요 없을 꺼 같은데-_-; 그냥 Array로 해도 될 듯싶습니다. 아 삽질했습니다.
어쨌든 집어 넣어서 이미 클릭이 된거면 삭제를 시키고, 클릭이 안된거면 추가를 하게 되어있습니다.
그렇게 해서 예약하기 버튼을 클릭하면 bookseatEvent함수를 호출합니다. 이 함수를 호출하게 되면 자바클래스에 있는 BookSeat함수를 호출하게 됩니다-_-; 간단해요!
http://mudchobo.tomeii.com/tt/108
화면 전환을 위해 이게 가장 많이 쓰인다더군요. 써보니 뭐 좋은 거 같습니다.
탭네이게이터나 아코디언?인가?뭔가 하는 것은 펼치고 접고 하는 식인 반면에 이건 메뉴바를 하나 두고 보이고 싶은 View를 클릭해서 열 수 있다는 차이점이 있습니다.
메인부분에 사용된 ViewStack을 보도록 합시다.
[code]
<mx:ViewStack id="viewstack" width="75%" height="100%" creationPolicy="all">
<mx:Panel id="ViewHome" width="100%" height="100%"
showEffect="WipeDown" hideEffect="WipeUp">
<mx:TextArea width="100%" height="100%" borderColor="#ffffff"
wordWrap="true" editable="false" enabled="true" fontSize="12"
color="#666666" cornerRadius="5" x="10" y="10">
<mx:text>예매시스템에 오신 것을 환영합니다.</mx:text>
</mx:TextArea>
</mx:Panel>
<comp:BookSeat id="ViewBookSeat"
showEffect="WipeDown" hideEffect="WipeUp" />
<comp:BookCancel id="ViewBookCancel"
showEffect="WipeDown" hideEffect="WipeUp" />
<comp:BookList id="ViewBookList"
showEffect="WipeDown" hideEffect="WipeUp" />
<comp:SeatList id="ViewSeatList"
showEffect="WipeDown" hideEffect="WipeUp" />
<comp:AgeStatus id="ViewAgeStatus"
showEffect="WipeDown" hideEffect="WipeUp" />
<comp:SexStatus id="ViewSexStatus"
showEffect="WipeDown" hideEffect="WipeUp" />
</mx:ViewStack>
[/code]
아....comp:BookSeat 이거는 커스텀 컴포넌트라고 해서 사용자가 직접 만든 컴포넌트를 말하는 겁니다.
즉 이미 있는 컨트롤들을 상속받아서 새로운 기능을 추가하는 그런것이죠.
앞에 comp는 무조건 저게 아니고 처음에 mx:application 선언시에 보시면 xmlns:comp="*" 라고 적어 놓으면 그 해당 폴더에 있는 모든 컴포넌트를 사용할 수 있다 라는 것이죠. 그리고 이름은 comp!
그다음 BookSeat, BookCancel 등은 이 컴포넌트 이름입니다. 처음 플렉스빌더에서
File -> New -> New MXML Component 라고 해서 이름을 쓰는데 즉 파일 이름이 컴포넌트 이름입니다 ^^
저기 6개들은 다 제가 만든 컴포넌트이며 다 Panel을 상속받았습니다.
Panel이라고 치고 해봅시다.
저렇게 ViewStack을 정해 놓으면 ViewStack에는 총 7개의 Panel이 들어가 있습니다. 우선적으로 처음에 쓴 놈부터 보여져서 ViewHome이 먼저 보여집니다.
그리고 viewstack.selectedChild 라는 변수에 ViewBookSeat이라고 넣어주면 ViewBookSeat에 해당하는 컴포넌트가 보여지게 됩니다.
즉 Button에 <mx:button .... click="viewstack.selectedChild = ViewBookSeat"> 요렇게 해주면 화면 전환이 된다는 것이죠 ^^
이 예매시스템은 성격상 마우스를 클릭했을 때 데이터를 먼저 업데이트 해야하기 때문에 업데이트를 하고나서 ViewStack을 바꾸는 식으로 했습니다 ^^
메인부분은 화면 전환하는 거 밖에 없군요-_-;
http://mudchobo.tomeii.com/tt/108
회원가입은 아이디, 비밀번호, 이름 등의 정보를 받아서
RemoteObject를 통해 Join메소드를 호출하기만 하면 끝입니다 ^^
그냥 값만 넘겨주면 자바클래스에서 처리를 합니다.
[code]
public int Join(String id, String pwd, String name, int age, String sex, String tel)
{
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
String jdbcDriver = "jdbc:apache:commons:dbcp:/pool";
con = DriverManager.getConnection(jdbcDriver);
// 입력한 ID와 같은 ID를 추출(이미있는 id인지 확인위함)
pstmt = con.prepareStatement("SELECT id FROM bs_Member WHERE id = ?");
pstmt.setString(1, id);
rs = pstmt.executeQuery();
if (rs.next()) {
return 2;
} else {
// 신규등록을 위해 INSERT문을 이용해 DB에 삽입
pstmt = con.prepareStatement(
"INSERT INTO bs_Member (id, pwd, name, age, sex, tel) " +
"VALUES (?, ?, ?, ?, ?, ?)");
pstmt.setString(1, id);
pstmt.setString(2, pwd);
pstmt.setString(3, name);
pstmt.setInt(4, age);
pstmt.setString(5, sex);
pstmt.setString(6, tel);
pstmt.executeUpdate();
return 1;
}
} 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]
이미 있는 ID인지 확인을 위해 검사해서 ID가 있으면 2를 리턴, 없으면 DB에 삽입 후에 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 {
joinwindow.x = this.width / 2 - 150;
joinwindow.y = this.height / 2 - 200;
}
private function RequestJoin():void {
var srv:RemoteObject = new RemoteObject();
srv.destination = "booksystem";
/*
아이디 길이등의ㅣ 검사문-_-; 귀찮아서-_-;
*/
if (sextext.text == "남" || sextext.text == "여"){
srv.Join(
idtext.text, pwtext.text,
nametext.text, agetext.text, sextext.text, teltext.text);
} else {
Alert.show("남 또는 여 라고 입력하세요!");
return;
}
srv.addEventListener("result", resultHandler);
srv.addEventListener("fault", faultHandler);
}
private function resultHandler(event:ResultEvent):void {
var result:int = int(event.result);
switch (result) {
case 0 :
Alert.show("DB오류입니다.");
break;
case 1 :
Alert.show("가입에 성공했습니다.");
idtext.text = "";
pwtext.text = "";
nametext.text = "";
agetext.text = "";
sextext.text = "";
teltext.text = "";
visible = false;
break;
case 2 :
Alert.show("ID가 이미있습니다.");
break;
}
}
private function faultHandler(event:FaultEvent):void {
Alert.show("실패 메세지: " + event.fault.message);
}
]]>
</mx:Script>
<mx:TitleWindow id="joinwindow" width="300" height="300"
layout="absolute" title="회원가입하기">
<mx:Label x="72.5" y="35" text="ID "/>
<mx:Label x="72.5" y="61" text="PW"/>
<mx:Label x="70.5" y="87" text="이름"/>
<mx:Label x="70.5" y="113" text="나이"/>
<mx:Label x="70.5" y="139" text="성별"/>
<mx:Label x="70.5" y="167" text="전화"/>
<mx:TextInput id="idtext" x="103.5" y="33" width="112"/>
<mx:TextInput id="pwtext" x="103.5" y="59" width="112"
displayAsPassword="true"/>
<mx:TextInput id="nametext" x="103.5" y="85" width="112"/>
<mx:TextInput id="agetext" x="103.5" y="111" width="112" restrict="0-9"/>
<mx:TextInput id="sextext" x="103.5" y="137" width="112"/>
<mx:TextInput id="teltext" x="103.5" y="165" width="112"/>
<mx:Button x="79.5" y="193" label="가입신청" click="RequestJoin();"/>
<mx:Button x="157.5" y="193" label="취소" click="visible=false"/>
</mx:TitleWindow>
</mx:Canvas>
[/code]
가입신청버튼을 클릭하면 RequestJoin()을 호출합니다. 이것은 RemoteObject를 통해 Join메소드를 호출합니다. 그리고 리턴값에 따라 1이면 성공, 2이면 이미 id가 있다고 알려줍니다. 텍스트박스를 다 초기화하고 visible을 false로 바꿔 창을 다시 로그인창으로 바꿉니다.
아 그리고 agetext를 보면 restrict="0-9"라고 써 놓으면 저 필드에는 숫자밖에 입력이 안됩니다. 좋은 정보입니다 핫핫-_-;
http://mudchobo.tomeii.com/tt/108
플렉스 세션에 대한 예제가 별로 없어서 찾기 힘들었는데 그냥 서블릿세션처럼 쓰면 되는 것이더군요-_-;
우선 플렉스세션을 만들어야하는데 서버측 프로그래밍할 때 그냥 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