이번엔 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 이렇게 하면 알 수 있습니다.

예매시스템 소스파일입니다.
http://mudchobo.tomeii.com/tt/108

 
Posted by 머드초보

댓글을 달아 주세요

 

예약하기부분... 머리가 딸려서 좀 고생했습니다-_-;

아....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
 
Posted by 머드초보

댓글을 달아 주세요

  1. kedem 2008.11.21 01:52  댓글주소  수정/삭제  댓글쓰기

    잘보고 많이 배워갑니다
    하나 궁금한게 있는데
    다른건 다 잘되는데 예약이 안되네요

    저는 오라클을 써서 시퀀스를 사용했는데
    이부분이 계속 오류가 뜨네요
    어떻게 해야 좋을까요

    pstmt = con.prepareStatement("INSERT INTO bs_Book VALUES (booknum_seq.NEXTVAL,?, ?)";);
    pstmt.setString(2, id);
    pstmt.setInt(3, seatnum[i]);
    pstmt.executeUpdate();

    • 머드초보 2008.11.21 16:28  댓글주소  수정/삭제

      음....
      저도 1년전에 짠거라....-_-;
      게다가 시퀀스를 안써봐서 ㅠ
      문법상은 문제가 없어보이네요.
      어떤 에러가 뜨나요?

  2. kedem 2008.11.21 18:22  댓글주소  수정/삭제  댓글쓰기

    해결했습니다.
    pstmt.setString(2, id);
    pstmt.setInt(3, seatnum[i]);

    이부분 2, 3이 아니라 1, 2네요
    어제는 밤새봐도 모르겠던데
    오늘은 그냥 보니깐 알겠네요ㅜㅜ

    • 머드초보 2008.11.21 23:29  댓글주소  수정/삭제

      헉 그렇군요 ㅠㅠ
      그런문제였군요 ㅠ
      해결하셨다니 다행이네요 ^^

  3. BlogIcon 양파링 2010.02.02 13:10  댓글주소  수정/삭제  댓글쓰기

    오라클이라 윗분처럼 insert문에서 걸리던데...열명이 부적합 하다고...ㅡ_ㅡ;
    예약이 되는데요~ 예약 리스트에는 아무것도 없고 db에는 자료는 잘 인서트 되는데 뭐가 문제인지
    ㅜ_ㅠ; 참 db구조 연관관계 해 놓은게 이해가 안가는데 ~ 자세히 설명좀 해주시면 감사할게요~

    • 머드초보 2010.02.05 10:14  댓글주소  수정/삭제

      아...이거 저도 간만에 보니까 이해가 안되네-_-
      아....bs_Book테이블이 예약정보가 들어간 테이블이네요^^
      Member테이블이 있고, Seat은 자리테이블이고
      자리아이디와 멤버아이디를 함께 book테이블에 저장을 해요^^
      열명이 부적합한 것은 db생성이나 쿼리를 잘 확인해보시면.....ㅠ

 

회원가입은 아이디, 비밀번호, 이름 등의 정보를 받아서
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
 
Posted by 머드초보

댓글을 달아 주세요

 

아....친구한테 RemoteObject를 했다고하니까 욕먹었습니다-_-; 실무에서 쓰이지 않는다고 하더군요. 이 LCDS라는게 좀 비싸서 ^^

그리고 객체지향적인 AS3.0의 특성을 살리지 않고, 멋대로지향적으로 설계를 했습니다-_-; 다시 객체지향적으로 변경해서 해보도록 하겠습니다-_-;

뭐 그래도 삽질했으니까 올립니다. 보고 플렉스를 공부하시는 분들 도움이 되셨으면 좋겠어요(아마 도움이 안될껍니다-_-;)
이따구로도 플렉스를 할 수 있다는 것을 보여준 참 좋은 예인거 같습니다-_-;

프로그램은 간단합니다.
로그인, 회원가입으로 아이디를 생성하고, 예약하고 싶은 좌석을 선택해서 예약하면 예약되고-_-;
예약한 좌석 리스트를 보고 예약취소하고 싶으면 선택해서 취소해버리면 됩니다-_-;

덤으로 차팅도 두개 넣었구요. 로그인 로그아웃 등의 flexSession을 이용해서 제작했습니다.

웹에다가 올리려고 했는데 서버가 다운됐어요-_-; 친구한테 욕먹게 생겼어요-_-;
친구한테 물어보고 되면 올려볼께요-_-; 뭐 보고싶은 사람도 없겠지만-_-;

아 올렸어요-_-; 예제사이트입니다-_-;
http://mudchobo.tomeii.com/flex/Booksystem/Booksystem.swf

소스는 플렉스꺼랑 자바클래스꺼랑 두개가 있습니다!
이게 플렉스꺼 mxml파일들입니다.




이게 자바클래스입니다 ^^




DB구조입니다.



나중에 삽질한 거 설명하면서 차근차근 올려보도록 하겠습니다-_-;
사용자 삽입 이미지
사용자 삽입 이미지

사용자 삽입 이미지
사용자 삽입 이미지

 
Posted by 머드초보

댓글을 달아 주세요

  1. BlogIcon 불꽃남자 2008.06.25 16:46  댓글주소  수정/삭제  댓글쓰기

    좋은 예제네요.
    지나가다 한마디 남기고 갑니다.
    어떤 친구가 실무에서 RemoteObject가 쓰이지 않는다고 하셨는지요?
    실제 업무형 Flex 프로젝트할때 RemoteObject를 사용하지 않을 경우 아무도 퍼포먼스에 대한 책임을 질 수 없게 됩니다. LCDS가 비싸면 Open Source라도 사용하는 것이 바람직하고, 특히 예매 시스템과 같은 순간 트랜잭션이 많이 일어날 상황일 경우 무조건 RemoteObject를 사용하는게 좋습니다.
    참고로 저는 대한민국의 대부분 Flex 프로젝트에 관여해왔기 때문에,
    친구분의 얘기보다 제 말이 더 정확하다고 확신합니다.

    • 머드초보 2008.06.26 18:14  댓글주소  수정/삭제

      오....대한민국 Flex의 산 증인이시군요 ㅠㅠ
      반갑습니다 ^^ 좋은 의견 감사해요~ ^^
      저도 RemoteObject를 써야한다고 생각해요 ^^
      엄청 빠르다고 하더군요 ^^
      저 예제는 플렉스를 한참 인문할 때 작성한거라-_-;
      손볼곳이 100만개가 되보이는군요-_-;
      암튼 방문해주셔서 감사해요~ ^^

  2. 콩다방사장 2008.09.02 17:41  댓글주소  수정/삭제  댓글쓰기

    소스 다운받아서 햇는데여~자바 파일 먼가 하나 빠진건가요?
    sessionRO파일 messaging 에러가....

    • 머드초보 2008.09.02 23:26  댓글주소  수정/삭제

      혹시 Flex Builder3을 사용하시나요?
      그럼 하는 방식이 좀 틀린데요.
      Builder3에서 타입설정하는거에 J2EE로 해놓고
      프로젝트를 만드시면 JAR파일들이 있을겁니다.
      아마 그걸로 안만들어서 에러가 나는듯하네요.
      jar파일을 복사해서 할 수도 있구요.
      더 좋은 방법은 처음부터 J2EE로 프로젝트를 만들어서
      거기서 코딩을 하면 돼요.
      Flex Builder를 Standalone으로 설치하지마시고,
      Eclipse + Flex Builder3 Plugin을 추천합니다 ^^

  3. 남양알로에아가씨 2008.10.07 18:29  댓글주소  수정/삭제  댓글쓰기

    와~안그래도 php로 된 로그인 예제가 많아 java를 이용한 예제를 찾고 있었는데
    이렇게 저에게 딱 맞는 글을 찾게 되어, 진행중인 학습에 더욱 열의가 불타 오릅니다 ㅎㅎ
    감사합니다 ㅎ

    • 머드초보 2008.10.07 21:31  댓글주소  수정/삭제

      아넵 도움이 되셨으면 좋겠네요 ^^
      학구열은 언제나 타올라야 합니다!

  4. 천재성 2008.12.22 07:01  댓글주소  수정/삭제  댓글쓰기

    저기여~~ 제가 플렉스 이제 독학으로 배우는데요
    이 예제 실행하려고 하는데...
    자 윈도우 깔린 본체에서
    mysql를 설치 했는데

    님께서 올려주신 디비 자료하고~~ 어케 연동 시켜야 하는지 잘 모르곘어요 ㅜㅜ
    얼려주세요

    • 머드초보 2008.12.26 22:38  댓글주소  수정/삭제

      디비연동부분은 JAVA를 따로 공부하셔야합니다.
      이곳에서는 DB연동을 다루지 않았습니다.
      JDBC에 대해서 공부하시면 돼요 ^^

  5. 우아ㅠ 2009.01.12 11:08  댓글주소  수정/삭제  댓글쓰기

    난언제이렇게 만들죠??ㅠ

    공부열심히해야겟네요..ㅠ

    • 머드초보 2009.01.14 17:27  댓글주소  수정/삭제

      헉....이건 무려 오래전에 제작한..-_-;
      사실 보면 좋지 않은 코드가 많습니다-_-;(저도 공부하면서 알게된..ㅠ)
      방문해주셔서 감사해요~ ^^

  6. 왕초보 2009.02.06 19:31  댓글주소  수정/삭제  댓글쓰기

    flex를 공부중인 대학생입니다.
    DBCP설정하려고 webapps\blazeds\WEB-INF에 있는 web.xml을 봤는데
    아뿔사!
    <servlet>
    <servlet-name>MessageBrokerServlet</servlet-name>
    <display-name>MessageBrokerServlet</display-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>

    요런 내용이 있어서 이를 어찌 설정해야 되나 난감해 하고 있는 중입니다.
    JSP처럼 그냥
    <servlet>
    <servlet-name>DBCPInit</servlet-name>
    <servlet-class>flex.jdbcdriver.DBCPInit</servlet-class>
    <load-on-startup>1</load-on-startup>
    <init-param>
    <param-name>jdbcdriver</param-name>
    <param-value>com.mysql.jdbc.Driver</param-value>
    </init-param>
    </servlet>
    이런식으로 설정하면 되는 걸까요??
    답변 해주세요

    • 머드초보 2009.02.07 14:25  댓글주소  수정/삭제

      그건 MessageBrokerServlet이라고 해서 DBCP설정하는게 아닙니다.
      RemoteObject를 사용하기위한 서블릿이라고 보면 됩니다.
      위에 예제에서는 DB연동부분은 빠져있습니다.
      RemoteObject부터 공부하시면 될 듯 합니다^^
      BlazeDS나 LCDS로 할 수 있습니다^^

  7. 입문자 2009.04.09 17:26  댓글주소  수정/삭제  댓글쓰기

    이제 FLEX 입문한 JAVA 개발자 입니다.
    언제나 좋은 예제 감사합니다.
    간결한 설명과 좋은 예제 초보인 제가 보기에 정말 좋은것 같습니다.

    앞으로도 좋은 글 부탁드리며, 위 예제 돌렸는데 버튼의 label이 "R.","A.","S." 이런식으로 나오는데..
    소스는 건들지 않았습니다..;;;;
    Alert으로 찍어봐도 제대로 나오는데...뭐가 문제인지는 모르겠습니다..
    혹시 의심되는 부분이 있으면 답변 부탁 드립니다.

    • 머드초보 2009.04.09 23:31  댓글주소  수정/삭제

      안녕하세요~
      이거 정말 추억의 소스군요-_- 부끄럽습니다-_-
      우선 label의 글자가 짤리는 것 같은데요.
      브라우저 크기를 늘려보시면 나올 듯 합니다.
      아님 button에 마우스오버를 해도 글이 다 나올 듯 합니다....
      width를 고정으로 하지 않았기에, 퍼센트에 따라 버튼 크기가 지정되어 그런 듯 합니다^^

  8. 아직도초보 2009.11.08 20:12  댓글주소  수정/삭제  댓글쓰기

    좋은예제내요~ 저도 열심히 해보겠습니다 ㅎ

    • 머드초보 2009.11.09 16:19  댓글주소  수정/삭제

      헉...2년이 넘은 예제임 ㅠㅠ
      문제가 좀 많은 코드입니다 ㅠㅠ 주의해서 참조하세요 ^^

  9. Flex초급 2010.01.28 13:22  댓글주소  수정/삭제  댓글쓰기

    좋은 정보.. 너무 잘보고 갑니다~~

  10. Flex 쌩초보 2010.05.04 09:46  댓글주소  수정/삭제  댓글쓰기

    좋은 정보 감사합니다. 초급 프로그래머 인데 아직 기초도 없는 상태에서 프로젝트를 맡아서
    하다보니까 이것저것 헤매는 것들이 너무 많네요.
    ^^ 소스 분석해 보면서 실력을 늘려야 겠네요
    늘 행복하시고 환절기 감기 조심하세요 ^^

  11. Flex 쌩초보 2010.05.04 14:09  댓글주소  수정/삭제  댓글쓰기

    질문좀 할게요.

    지금 sesseion 부분에서 오류가 발생하는데

    실패 메세지: faultCode:InvokeFailed faultString:'[MessagingError message='Destination 'session' either does not exist or the destination has no channels defined (and the application does not define any default channels.)']' faultDetail:'Couldn't establish a connection to 'session''

    이런메세지가 뜨네요. remoting 쪽에다가
    <destination id="session">
    <properties>
    <source>flex.session.SessionRO</source>
    </properties>
    </destination>

    이렇게 처리 해줬는데 이게 제대로 인식이 안되는거 같습니다.
    혹시 추가 *.java가 필요한건가요?

    • 머드초보 2010.05.06 00:04  댓글주소  수정/삭제

      아뇨 추가 java는 필요없는데....
      아...게다가 너무 오래되어서(조만간 3년을 찍게 될 제 부끄러운 글이....-_-)
      저 메세지는 백방 설정이나 뭔가 빠진 게 있는 것 같습니다.
      저런 메세지를 저도 많이 봐왔는데, 결론은 destination이 존재하지 않는 것인데, 컴파일 옵션이 혹시 제대로 되어있는지?-_-

  12. 렉스초보 2011.12.01 17:16  댓글주소  수정/삭제  댓글쓰기

    flex + spring + ibaits + jsp + oracle + blazeds 이렇게 연동해서

    소스수정해서 해보고 있는데 어렵네요..ㅠ_ㅠ

    다른부분은 거진 다되는데 destination 설정해주는데에서 자꾸 헤매고 있네요 ㅎㅎ

    소스감사합니다^^ 열심히 더 수정해봐야겠네요 ㅠ

    • BlogIcon 머드초보 2011.12.01 21:38 신고  댓글주소  수정/삭제

      아....저도 참 오래전에 만든거라...-_- destination부분은 저도 예전에 삽질하면서 많이 헤맸던 부분이였던 것 같네요~ 원리만 이해하면 아마 잘 되실거에요~ 화이팅!