머리나쁘면 평생고생한다더니 그말이 맞습니다!
이거 소스코드 한줄만 고치면 되는 것을 저는 그것도 모르고 계속 샘플분석했어요--;
AIR프로젝트를 만들게 되면 xml이 자동으로 만들어지게 되는데 저는 그건 제가 관리하는게 아니라고 생각했는데 아니더군요. 안에 보면 셋팅할 수 있는게 몇개 있더군요 ^^

우선 기존 윈도우틀을 없애봅시다.

File -> New -> Flex Project를 선택하시고, ProjectName은 NoneWindowApp라고 하고
Application Type은 Desktop application을 선택하시고 Finish를 선택합니다.

프로젝트이름-app.xml파일이 있을 껍니다. 이거를 보게 되면 xml로 되어있는데요.
<initialWindow>
      ...
    <systemChrome>none</systemChrome>
이놈이 주석처리 되어있는데 none을 바꿔주고 주석을 풀어봅시다!

그리고 프로젝트이름.mxml파일을 열어서 vbox에 button을 하나 추가해봅시다.
[code]<mx:VBox>
  <mx:Button label="버튼" />
</mx:VBox>
[/code]
한번 실행해봅시다.

사용자 삽입 이미지
기존의 윈도우는 사라지기는 했습니다만.... 뭔가 또다른 윈도우가 생겼네요--;

저것조차도 없애봅시다--;

<initialWindow>
     ....
    <visible>true</visible>

아까 xml파일의 visible을 true로 바꿔줍니다.
그리고 메인 mxml로 돌아와서 WindowedApplication으로 되어있는 가장 최상위태그를 Application으로 바꿔줍니다.
[code]<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">

 <mx:VBox>
    <mx:Button label="버튼" />
 </mx:VBox>
</mx:Application>
[/code]
실행해봅시다.
사용자 삽입 이미지

아.....사라졌군요. 근데 닫을 수가 없군요-_-; 닫기, 최대화, 최소화 를 구현해봅시다 ^^
이 예제는 AIR개발자문서에서 제공하는 예제입니다.
[code]<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">

 <mx:Script>
  <![CDATA[
   public function minimizeWindow():void
   {
    this.stage.nativeWindow.minimize();
   }

   public function maximizeWindow():void
   {
    this.stage.nativeWindow.maximize();
   }
   
   public function restoreWindow():void
   {
    this.stage.nativeWindow.restore();
   }
   
   public function closeWindow():void
   {
    this.stage.nativeWindow.close();
   }
  ]]>
 </mx:Script>
 <mx:VBox>
  <mx:Button label="Minimize" click="minimizeWindow()"/>
  <mx:Button label="Restore" click="restoreWindow()"/>
  <mx:Button label="Maximize" click="maximizeWindow()"/>
  <mx:Button label="Close" click="closeWindow()"/>
 </mx:VBox>

</mx:Application>
[/code]
stage라는 놈이 최상위에 있느 놈 같은데 거기에서 nativeWindow라 하면 그 자신의 윈도우를 말하는건가요?-_-;
아....잘모르겠네. 어쨌든 저 nativeWindow라는 객체가 그 해당윈도우를 말하는 것 같습니다.
그 객체의 close, maxmize, minimize등의 메소드를 실행하니 해당윈도우가 작동을 하니 ^^

 
Posted by 머드초보
,
 

음 뭔가 해보려고 하는데 잘 안되네요-_-;
원하는 모양은 아니지만 시스템트레이에 아이콘 띄우는 것 까지 성공했습니다--;
우선 저는 윈도우를 없애고 싶은데 이게 은근히 어렵네요-_-;

FLEX3 Beta 3에서 테스트했습니다. Beta2에서는 안됩니다.
방식이 조금 업그레이드되었어요. Beta2에서는 Shall어쩌구를 썼는데 바뀌었네요.
AIR예제니까 프로젝트 만들 때 Desktop Application으로 만들어야겠죠? ^^

예제입니다.
[code]
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
 applicationComplete="init();">

 <mx:Script>
  <![CDATA[
   public function init():void {
   
    var icon:Loader = new Loader();
    var iconMenu:NativeMenu = new NativeMenu();
    var visibleCommand:NativeMenuItem = iconMenu.addItem(new NativeMenuItem("Visible"));
    var exitCommand:NativeMenuItem = iconMenu.addItem(new NativeMenuItem("Exit"));
   
    visibleCommand.addEventListener(Event.SELECT,
     function(event:Event):void {
      stage.nativeWindow.visible = true;
     }
    );
   
    exitCommand.addEventListener(Event.SELECT,
     function(event:Event):void {
      NativeApplication.nativeApplication.icon.bitmaps = [];
      NativeApplication.nativeApplication.exit();
     }
    );
     
    if (NativeApplication.supportsSystemTrayIcon) {
     NativeApplication.nativeApplication.autoExit = false;
     icon.contentLoaderInfo.addEventListener(Event.COMPLETE, iconLoadComplete);
     icon.load(new URLRequest("icons/AIRApp_16.png"));
     var systray:SystemTrayIcon = NativeApplication.nativeApplication.icon as SystemTrayIcon;
     systray.tooltip = "AIR application";
     systray.menu = iconMenu;
    }
 
    if (NativeApplication.supportsDockIcon){
     icon.contentLoaderInfo.addEventListener(Event.COMPLETE,iconLoadComplete);
     icon.load(new URLRequest("icons/AIRApp_128.png"));
     var dock:DockIcon = NativeApplication.nativeApplication.icon as DockIcon;
     dock.menu = iconMenu;
    }
   }
   
   private function iconLoadComplete(event:Event):void {
    NativeApplication.nativeApplication.icon.bitmaps =
     [event.target.content.bitmapData];
   }
   
   public function hide():void {
    stage.nativeWindow.visible = false;
   }
  ]]>
 </mx:Script>
 <mx:Button label="창숨기기버튼" click="hide();"/>
 
</mx:WindowedApplication>
[/code]
air 개발자문서를 보고 약간 변형에서 작성해봤습니다.
참숨기기버튼을 클릭하면 창이사라지구요. 트레이아이콘에서 오른쪽버튼을 눌러서
visible을 클릭하면 다시 생기게 만들었습니다. exit누르면 종료하게 하구요.

NativeMenuItem 클래스로 메뉴를 추가하구요.
그 객체에 addEventListener해서 Event.SELECT를 해서 함수를 지정해주면 선택된 메뉴에 대해서 지정된 함수를 호출하는 겁니다.

NativeApplication.supportsSystemTrayIcon 이거는 시스템트레이아이콘을 지원하는 놈이냐? 라고 물어보는겁니다. 윈도우는 당연히 지원하겠지요 ^^
만약 운영체제가 맥os라면 NativeApplication.supportsDockIcon라고 물어봤을 때 지원하는 것 같습니다.

크로스플랫폼(맞나-_-)형태로 제작이 되어있네요. 크로스운영체제!! 어디든 가능하게 ^^

샘플실행할 때 icons경로 밑에 AIRApp_128.png파일과 AIRApp_16.png파일이 있어야겠죠?^^

 
Posted by 머드초보
,
 

이 ArrayCollection 참 이상하네요-_-;
참 다루기 힘드네요. ^^









우선 http://localhost:8080/list.jsp 하면 아래와 같은 형태를 출력한다고 칩시다.

[code]<?xml version="1.0" encoding="UTF-8"?>
<result_set>
 <record>
  <id>mudchobo</id>
  <username>성종천</username>
 </record>
 <record>
  <id>idoori</id>
  <username>임두리</username>
 </record>
</result_set>
[/code]
잘 보시면 result_set태그안에 record태그가 2개가 있네요.
요 데이터를 가져와서 ArrayCollection에 저장하고 싶습니다.
그러면 이렇게 하면 됩니다. HTTPService의 result속성이 resultHandler라고 칩시다.
[code]public var recordAC:ArrayCollection;

public function resultHandler(event:ResultEvent):void {
 recordAC = (event.result.result_set.record is ArrayCollection) ?
     event.result.result_set.record as ArrayCollection :
     new ArrayCollection(ArrayUtil.toArray(event.result.result_set.record));
}
[/code]
저렇게 하는 이유는....만약 record가 1개라고 칩시다.
그러면 event.result.result_set.record as ArrayCollection 해버리면 recordAC변수에 null이 들어갑니다.
Array로 인식안하고 하나의 객체로 인정해서 ArrayCollection으로 변환을 못하는 것 같습니다-_-;
사실 왜그런지 정확한 이유는 모르겠군요. 디버그를 해보니까 record가 2개면 record에 [0], [1] 이렇게 나뉘는데 record가 1개면 [0], [1]이런거 없고 바로 id, username 이렇게 나오더군요. 배열로 생각안하고 그냥 객체로 생각해서 저런 것 같습니다-_-;

그래서 저렇게 변환이 가능한지 물어보면 되고, 1개의 record가 있으면 변환이 불가능하기 때문에
ArrayUtil.toArray를 쓰면 됩니다.

그리고 저렇게 해줘야하는 이유가 그냥 ArrayUtil.toArray로 받아오면 나중에 해당 객체를 가져올 때 이상해지더라구요-_-; recordAC.getItemAt(0); 해서 0번째 Object를 가져오면 Object를 열어보면 [0][1] 이 있어서 배열이 들어가 있어요. 그래서 배열로 된 건 ArrayUtil.toArray로 가져오면 안되더라구요 ^^

저렇게 as ArrayCollection으로 가져오면 var obj:Object = recordAC.getItemAt(0); 한다음에
obj.name 하면 name속성에 접근할 수 있어요^^

 
Posted by 머드초보
,
 
faultCode:Client.CouldNotDecode faultString:'Error #1090: XML 파서 실패: 요소가 잘못되었습니다.' faultDetail:'null' 요런 에러를 냅니다.



물론 http://localhost:8080/모모모.jsp 을 실행했을 때 xml형태도 제대로 안나오겠죠.
그니까 <content></content>  요 태그안에 <>& 등 기존에 html등에서 쓰지 못했던 것 있죠?

이 값이 만약 db에 들어있어서 이값을 가지고 와서 저 태그안에다가 넣는 문법이 있으면
<content><>&</content> 하면 에러가 나겠죠!

[code]<content>${list.content}</content>
[/code]
이런식으로 코딩되어 있다면 위험하더군요-_-;
저도 얼마전에 어떤분이 제가 샘플로 올린 게시판을 보고 알았는데요.
누가 글쓸 때 <html>등의 코드를 content부분에 써놨더라구요-_-;
이게 그냥 db에 저장이 되긴 됐는데 나중에 불러오려고 할 때 xml형태를 리턴하기 때문에 문제가 생기더라구요^^
그래서 저부분을.....
[code]<content><![CDATA[${list.content}]]></content>
[/code]
요렇게 바꿔주면 됩니다.
<![CDATA[]]> 요 태그 안에 있는 놈들은 xml파서가 파싱하지 않습니다.
 
Posted by 머드초보
,
 

아...계속 게시판만 만드네요-_-; 그래도 데이터연동의 가장 기본이 되는것을 해야하니깐-_-;

테스트환경은 TOMCAT6.0 + JDK 6.0 + Struts 1.3.8 + iBATIS 2.3.0 + Flex3 Beta 2 에서 했습니다.

저번엔 RemoteObject로 삽질했는데 이제 HTTPService로 삽질하네요.
우선 RemoteObject는 해당클래스를 직접 호출해서 가져다가 쓰는 것이구요.
HTTPService는 말그대로 http를 통해 주소값을 넣으면 그것을 실행하게 되는 것인데요.
그 실행해서 나오는 값이 xml형태이면 xml태그에 있는 값을 가져올 수 있습니다.

그렇다는 얘기는 서버단에서는 Struts와 iBATIS를 통해서 DB와 연동해서 데이터를 xml형태로 리턴해주면 그것을 FLEX에서 값을 가져다가 DataGrid에 넣든 쇼를 하든 할 수 있다는 얘기죠.

그리 대단한 건 아니지만, HTTPService로 삽질하시는 분들께 도움이 되고자-_-;

invalid-file

Struts + iBATIS를 이용한 xml을 리턴하는 게시판입니다.

즉 http://localhost:8080/FlexBoard/list.do 을 실행하게 되면 결과값이 xml코드를 리턴한다는 얘기죠.
그런식으로 나타낸 xml코드를 flex에서 가져다가 DataGrid에 넣도록 되어있습니다.

invalid-file

Flex Project Archive로 export한 프로젝트입니다.

이거는 저 위에 있는 FlexBoard.war에 포함되어있는 swf를 만들어주는 프로젝트입니다.
즉, 그냥 서버단에서 리턴하는 xml을 가져와서 DataGrid에 넣기도하고, http서비스를 이용하여 파라메터를 던져서 해당 DB를 컨트롤하기도 하고 그런거하는 겁니다.


DB구조는.....
CREATE TABLE `Board` (
  `b_id` int(11) NOT NULL auto_increment,
  `b_name` varchar(10) NOT NULL,
  `b_pwd` varchar(10) NOT NULL,
  `b_title` varchar(30) NOT NULL,
  `b_content` mediumtext NOT NULL,
  PRIMARY KEY  (`b_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=euckr AUTO_INCREMENT=115 ;
입니다-_-;

설명은 나중에-_-; 아.....졸려-_-;
 
Posted by 머드초보
,