저번에 Beta2예제가 새로운 버전에서 안돌아가는 바람에 다시 만들었습니다-_-;
많은 분들이 안돌아간다고 하셔서 다시 만들었습니다 ㅠ
형식이 조금 바뀌었는데, 별 차이는 없었습니다.
더 편해진 것 같아요. 토큰이라는 것을 이용하네요.

http://code.google.com/p/assql/
다양한 예제와 lib파일은 이곳에서 받을 수 있습니다.

간단하게 insert와 select를 하는 예제를 만들어봤습니다.
테스트 해본 환경은 Eclpse3.4 + Flex Builder 3.0.1 + asSQL Beta 2.7에서 해봤습니다.

DB구조는 다음과 같습니다.
[code]
CREATE TABLE `products` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `description` varchar(45) default NULL,
  `price` decimal(15,2) NOT NULL default '0.00',
  PRIMARY KEY  USING BTREE (`id`,`price`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;

INSERT INTO `products` (`id`,`description`,`price`) VALUES
 (1,'Lamp','469.80'),
 (2,'Table','3502.62'),
 (3,'Chair','1061.12');
[/code]

아래는 소스코드입니다.
[code]
<?xml version="1.0" encoding="utf-8"?>
<mx:Application
    xmlns:mx="http://www.adobe.com/2006/mxml"
    creationComplete="onCreationComplete()"
    layout="horizontal">
    <mx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
            import com.maclema.mysql.ResultSet;
            import com.maclema.mysql.MySqlToken;
            import com.maclema.mysql.Statement;
            import com.maclema.mysql.Connection;
            import com.maclema.mysql.events.MySqlErrorEvent;
            import mx.rpc.AsyncResponder;
            import mx.controls.Alert;
           
            private var con:Connection;
            private var st:Statement;
            private var token:MySqlToken;
            [Bindable]
            private var dataAC:ArrayCollection;
           
            private function onCreationComplete():void
            {
                con = new Connection("DB주소", 3306, "DB아이디", "DB비밀번호", "DB명");
                con.addEventListener(Event.CONNECT, handleConnected);
                con.connect("euckr");
            }
           
            private function handleConnected(e:Event):void
            {
                if (con != null)
                {
                    st = con.createStatement();
                }
            }
           
            private function selectResult(data:Object, token:Object):void
            {
                var rs:ResultSet = ResultSet(data);
                dataAC = rs.getRows();                               
            }
           
            private function insertResult(data:Object, token:Object):void
            {
                Alert.show(token.description + " 삽입성공!");
                selectProcess();
                insertBox.visible = false;
            }
           
            private function fault(info:Object, token:Object):void
            {
                Alert.show("Error: " + info);   
            }
           
            private function selectProcess():void
            {
                var token:MySqlToken = st.executeQuery(
                    "SELECT id, description, price FROM products");
                token.addResponder(new AsyncResponder(selectResult, fault));   
            }
           
            private function insertProcess():void
            {
                st.sql = "INSERT INTO products (description, price) VALUES (?, ?)";
                st.setString(1, inputDescription.text);
                st.setNumber(2, Number(inputPrice.text));
                var token:MySqlToken = st.executeQuery();
                token.description = inputDescription.text;
                token.addResponder(new AsyncResponder(insertResult, fault, token));
            }
        ]]>
    </mx:Script>
   
    <mx:VBox horizontalAlign="center">
        <mx:DataGrid id="productDG" dataProvider="{dataAC}">
            <mx:columns>
                <mx:DataGridColumn headerText="ID" dataField="id"/>
                <mx:DataGridColumn headerText="제품명" dataField="description"/>
                <mx:DataGridColumn headerText="가격" dataField="price"/>
            </mx:columns>
        </mx:DataGrid>
       
        <mx:HBox width="100%" horizontalAlign="center">
            <mx:Button label="SELECT" id="btnSelect"
                click="insertBox.visible = false; selectProcess()"/>
            <mx:Button label="INSERT" id="btnInsert"
                click="insertBox.visible = true"/>
        </mx:HBox>
       
        <mx:VBox id="insertBox" height="100%" horizontalAlign="center" visible="false">
            <mx:Form>
                <mx:FormHeading label="정보 입력" />
                <mx:FormItem label="제품명">
                    <mx:TextInput id="inputDescription" />
                </mx:FormItem>
                <mx:FormItem label="가격">
                    <mx:TextInput id="inputPrice" restrict="0-9,."/>
                </mx:FormItem>
            </mx:Form>
            <mx:Button id="btnInsertProcess" label="추가" click="insertProcess()" />
        </mx:VBox>
       
    </mx:VBox>
       
</mx:Application>
[/code]
좀 이상한 점이 con.connect("euckr")로 해야지 한글이 나오더군요. mysql에서 utf8에는 한글이 없는건가.
어쨌든 인코딩은 어려워요 ㅠ

Connection이라는 클래스를 통해 mysql정보를 이용해 con객체를 생성한다음에 Statement를 생성합니다.
그 뒤에 selectProcess메소드에서 보시면, MySqlToken이라는 클래스를 이용합니다. Statement객체의 executeQuery메소드에 쿼리문을 넣어서 실행하면 token이 발행됩니다.
이 token에 addResponder라는 메소드를 통해 AsyncResponder를 이용해 해당 function넣은 객체를 생성해서 addResponder에 집어넣습니다. 그러면 데이터를 가져오는 시점에서 넣은 function이 호출이 됩니다.

여기서 데이터를 파싱하는 부분에서 엄청 편해진 부분이있는데요.
[code]rs.getRows();
[/code]
getRows라는 메소드가 있는데, 이건 해당 데이터셋을 자동으로 ArrayCollection형으로 변환해서 리턴해줍니다.
그러면 바로 바인딩된 datagrid에 데이터가 뿌려지겠죠. 멋집니다.

insert부분도 똑같습니다.
그냥 자바문법과 비슷하다고 보면 되겠네요.
틀린 점이 있다면 이건 이벤트기반이라는 것이죠 ^^ 비동기적으로 일어납니다.
사용자 삽입 이미지

셀렉트도 잘되네요. 구글크롬에서 해봤어요. 잘 되네요.

사용자 삽입 이미지

머드초보를 2.00로 해서 입력해봅시다.

사용자 삽입 이미지

잘 들어갔네요.

PS. 실무db연동은....서버단언어와 함께하시길 바랍니다 ^^ (JAVA, C# 등등~)
 
Posted by 머드초보
,
 
버전을 올렸군요. 오늘 플렉스로 삽질을 하는데, Adobe Reader가 업데이트하는 것처럼 시스템트레이 오른쪽아래에 뜨더라구요. 망할 놈의 Adobe Reader가 또 업데이트하나 봤더니 Flex Builder더군요-_-;
이 놈도 업데이트를 심어놨구놔! 라는 생각에 왠지 이번에는 Eclipse3.4를 지원할 것 같았어요.

그래서 찾아보니 역시나군요.
http://www.adobe.com/devnet/flex/articles/sdk3_fb301.html

여기에 가보니 잘 작성이 되어있군요.
덕분에 이제 Eclipse3.3 + Flex Builder를 버리고-_-; Eclipse3.4로 통일을.....

http://www.adobe.com/cfusion/entitlement/index.cfm?e=flex3email
여기서 그냥 받으시면 3.0.1로 받아집니다.

깔끔하게 다시 설치하기 위해 Flex Builder를 지우고 다시 받아서 설치를 해보니, 경고창도 안뜨고 잘 되네요.

Flex SDK 3.1

  • Numerous bug fixes including fixes provided by the community. A complete list of bug fixes can be found here.
  • Introductory support for Flash Player 10 (currently in beta); note that final support is expected in a future release. Despite our support, we do not include Flash Player 10 Beta in the actual SDK as we try not to ship beta software in official releases. You can however retrieve the matching 3.1 SDK with Flash Player 10 included from our Flex 3 open source downloads page.
  • Final support for AIR 1.1

Flex Builder 3.0.1 (including the data visualization components)

  • Numerous bug fixes. A complete list of bug fixes for the IDE can be found here and the data visualization components here.
  • Support for AIR 1.1
  • Support for Eclipse 3.4

대충 영어를 보니............................
조.....좋아진거겠죠?-_-;
Flash Player 10어쩌구 하는 거보니...그걸 지원하는건가-_-; AIR 1.1도 지원하고, Eclipse 3.4도 지원하네요 ^^


 
Posted by 머드초보
,
 
http://mudchobo.tomeii.com/tt/303
Javascript로 만든 위젯이 여러분의 매우 관심없음의 힘입어....Flex용으로 만들어봤습니다.
우선 HTTPService가 안돼서......Javascript를 이용하여 만들어봤습니다.
조합은 아래와 같습니다.

Flex 3 + Javascript(Prototype 1.6.0.2) + swfobject2.1 + FABridge입니다.

블로그에 넣으려고 하니 FF에서만 안보이네요-_-;
IE에서도 보이는데... 뭐하고 충돌하는거지-_-;
링크입니다.
http://mudchobo.tomeii.com/swf/GoogleWeatherWidget.html

야후에서는 API를 제공해서 다른 방법으로 해보려다가 이렇게 까지 해버렸네요-_-;
완전 삽질-_-;
아래는 저의 삽질의 결정체 소스파일입니다.

이런식으로 할바에는 안쓰겠다라고 말하고 싶군요.
하지만, FABridge의 엄청난 능력에 대해서 감탄하고 말았군요.
Flex객체에 대한 addEventListener가 완벽하게 지원하는 듯합니다. Timer이벤트도 한번 걸어봤는데 잘 되더라구요.
 
Posted by 머드초보
,
 
자바스크립트와 Flex와 통신을 해주는 FABridge라는 놈은.....
우선 처음에 접하게 되면 혈압을 약 50%를 상승시켜주는 효과를 가져다 줍니다.

그 이유는 로컬에서는 테스트를 할 수 없습니다-_-;
즉, file:///D:/workspace/flex/~~~ 요런 경로에서는 실행할 수 없습니다.
처음에 그냥 flex builder에서 실행할 때에는 아무런 경고가 뜨지 않습니다. 하지만, export해서 build release를 한다음에 bin-release에 있는 html파일을 실행하면 요런 에러가 뜹니다-_-; 이걸로 혈압이 10%상승했죠.
SecurityError: Error #2060: 보안 샌드박스 문제가 발생했습니다. ExternalInterface 호출자 file:///D:/workspace/flex/FABridgeTest111/bin-release/FABridgeTest.swf은(는) file:///D:/workspace/flex/FABridgeTest111/bin-release/FABridgeTest.html에 액세스할 수 없습니다.
    at flash.external::ExternalInterface$/_initJS()
    at flash.external::ExternalInterface$/addCallback()
    at bridge::FABridge/initializeCallbacks()
    at bridge::FABridge()
    at FABridgeTest/_FABridgeTest_FABridge1_i()
    at FABridgeTest()
    at _FABridgeTest_mx_managers_SystemManager/create()
    at mx.managers::SystemManager/initializeTopLevelWindow()
    at mx.managers::SystemManager/http://www.adobe.com/2006/flex/mx/internal::docFrameHandler()
아놔...그렇구나....-_-; 그래서 꼼수로....톰캣과 blazeds를 이용합니다-_-;
프로젝트를 생성할 때 ProjectName에 FABridgeTest로 하고, Web application으로 하고, Application ServerType을 J2EE로합니다. 톰캣을 사용하는 겁니다. 이렇게 생성한 놈은 실행할 때 http://localhost:8080/프로젝트명/프로젝트명.html로 실행해주기 때문에 테스트를 할 수 있습니다.
Next를 하고, Target runtime에 tomcat을 설정해주고, Flex War파일에는 blazeds.war파일을 선택합니다. Finish를 선택하여 프로젝트를 만듭니다.

기존에 있던 index.templete.html은 FABridge사용에 문제가 좀 있어서 다시 생성만들어야합니다.
http://olegflex.blogspot.com/2008/06/swfobject-2-flex-template.html
여기에 가면 templete을 만들어 놓은 것이 있는데 다운받고 압축을 풀면, html-template폴더가 있는데, 기존의 html-template폴더 날려버리고, 이걸로 대체합니다.

이제 필요한 것은 FABridge.js파일인데, 이 파일은 기존의 것을 사용하면 swfobject 2.1에서는 사용할 수 없습니다. 그래서 수정한 버전이 필요합니다. 기존것으로 하려다 혈압이 약 20%상승한 듯 합니다.
http://www.swffix.org/swfobject/swfobject_flex3/
이곳에 가면 예제와 FABridge.js와 history.js파일이 있는데 이걸 html-templete폴더와 ./history폴더에 각각 복사합니다.
예제를 만들어봅시다.
index.templete.html파일을 열어서 bridgeName을 지정해줍니다.
[code]
var flashvars = {
    bridgeName: "mudchobo"
};
[/code]
지정해주지 않으면 flash가 디폴트가 됩니다.
html-templete폴더에 test.js파일을 만들어서 테스트를 만들어봅시다.
test.js
[code]

var flexApp;

FABridge.addInitializationCallback( "mudchobo", function() {
    flexApp = FABridge.mudchobo.root();
    var callback = function() {
        alert('flex로 호출한 javascript메소드');
    }
    flexApp.getMyButton().addEventListener("click", callback);
});

function callFlexFunction() {
    flexApp.flexFunction('javascript로 호출한 flex메소드');
}
[/code]
FABridge.addInitializationCallback함수는 birdge이름이 mudchobo인 flash가 초기화가 다 되면 호출이 되는 듯합니다. 로드가 다 된 상태면 저 뒤에 함수를 호출하게 되는 듯합니다.
window.onload에다가 때려박으면 FABridge.mudchobo가 undefined가 되더라구요. 이걸로 혈압이 약 10%상승했습니다.
javascript에서 flex버튼 이벤트가 발생했을 때 이벤트를 걸 수 있습니다. getMyButton()네이밍 룰은 flex에서 버튼 id가 myButton이면 getMyButton으로 해당 컴포넌트를 가져올 수 있습니다. id가 mudchobo면 getMudchobo()가 되겠죠. addEventListener에 click시 callback함수를 호출하도록 이벤트를 추가합니다.

그리고, callFlexFunction이라는 메소드를 추가해서 이것은 flex메소드를 호출하는 겁니다.
flexApp객체를 통해 그냥 함수명을 호출하면 호출이 됩니다.

index.templete.html에다가는 head부분에다가
[code]
<script type="text/javascript" src="FABridge.js"></script>
<script type="text/javascript" src="test.js"></script>
[/code]
body부분에다가 button을 추가
[code]
<div>
    <input type="button" id="javascriptButton" value="callFlex" onclick="callFlexFunction();"/>
</div>
[/code]
이제 flex코드로 가봅시다. 우선 FABridge.as파일이 필요합니다. 이 파일은 C:\Program Files\Adobe\Flex Builder 3 Plug-in\sdks\3.0.0\frameworks\javascript\fabridge\src에 있습니다. 아주 꼭꼭 숨겨두셨어요-_-;
[code]
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
    xmlns:bridge="bridge.*" width="300" height="150">
   
    <mx:Script>
        <![CDATA[
            import mx.controls.Alert;
            public function flexFunction(data:String):void
            {
                Alert.show(data);
            }
        ]]>
    </mx:Script>
   
    <mx:Button id="myButton" label="callJavaScript" />
   
    <bridge:FABridge />
</mx:Application>
[/code]
중요한 점은 xmlns:bridge="bridge.*"랑 <bridge:FABridge /> 입니다.
이제 실행을 해봅시다.
아...여기서 이제 html-templete내용의 js파일을 고쳤는데 파폭에서 열고 소스보기하면 안바뀌어 있을 때가 있습니다. 그때는 Flex메뉴에서 Project -> clean을 해주면 되더라구요. 이걸로 혈압 10%상승!

실행하면 localhost로 뜨기 때문에 잘 될 겁니다. 소스파일입니다.

다음시간엔 실제 ajax를 요청해봐야겠다-_-;
 
Posted by 머드초보
,
 

http://code.google.com/p/swfobject/
여기서 2.1버전을 다운로드할 수 있습니다.
기존에 1.5에서 사용하는 방식과 완전이 틀려졌습니다.

더욱 간편해지고 더욱 쉬워졌습니다.
해당 파일을 받고 압축을 풀면 매우 쉽게 예제가 나와있습니다.
[code]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
    <head>
        <title>SWFObject 2 dynamic publishing example page</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <script type="text/javascript" src="swfobject.js"></script>
        <script type="text/javascript">
        swfobject.embedSWF("test.swf", "myContent", "300", "120", "9.0.0", "expressInstall.swf");
        </script>
    </head>
    <body>
        <div id="myContent">
            <h1>Alternative content</h1>
            <p><a href="http://www.adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p>
        </div>
    </body>
</html>
[/code]
핵심부분은 저기 swfobject객체의 embedSWF메소드를 호출하면 됩니다.
저런식으로. 아주 간단해요.

만약 파라메터나 flashvars를 넘기고 싶다면
[code]
var flashvars = {
  bridgeName: "mudchobo"
};
var params = {
  menu: "false"
};
var attributes = {};

swfobject.embedSWF ( "test.swf", "myContent", "300", "120", "9.0.0",
    "expressInstall.swf", flashvars, params, attributes );
[/code]
이런식으로 파라메터값을 넘겨줄 수 있습니다.

어떤분은 기존 flex3가 생성하는 html-templete을 기존방식이 아닌 swfobject방식으로 바꿔서 templete을 재구성했더라구요.
http://olegflex.blogspot.com/2008/06/swfobject-2-flex-template.html
여기서 받을 수 있습니다.

기존에 AC_FL_RunContent란 메소드를 호출하는 index.templete.html파일을 보면 정말 복잡합니다. 하지만 저 템플릿방식으로 변경하면 소스코드도 이해하기 쉽고, 나중에 javascript를 삽입해서 테스트를 해보고 싶을 때 더욱 쉽게 작업할 수 있겠죠.
 
Posted by 머드초보
,