따뜻한 대한민국 겨울만들기

FLASH, 제 친구들을 소개합니다.

Posted 2008. 9. 13. 22:30

'Flex와 Flash간의 파라미터 주고받기' 에 덧붙여 리뷰를 진행해 보겠습니다.

Flash와 Flex간의 소통은 엄청 중요한 부분이며,

오창훈님의 기술문서에는 이 소통에 관한 내용이 잘 설명 되어있습니다.

그래서 저는 오창훈님의 기술문서의 범위를 확장하여

'Flash와의 소통에 관련되어 있는 유용한 것들'


제한없이 나열해 보려고 합니다.

들어가기에 앞서,

이 리뷰는 Flash에 초점을 두었으며, 내용이 부족하거나 글 전개가 4차원이라도

편안하게 봐주셨으면 하는 바램입니다. (참고로 전 4차원은 아닙니다 ^^;;)

저는 글쓴이 겸 사회자 입니다. ;;

목차를 간단히 소개해 드리겠습니다.

1. FLASH - FLEX (Flex와의 소통)
   Flex Skinning Templates 사용
   ② Shake'n'Bake SWFs (F
lashLib.as) Open Source 활용

2. FLASH - JAVASCRIPT (Javascript와의 소통)
   ExternalInterface 에서 전달된 Object를 JSP에서 사용하기

3. FLASH - XML (XML과의 소통)
   ① JSP에서 XML형식으로 파싱하는 방법
   ② PHP에서 XML형식으로 파싱하는 방법

4. FLASH - 서버사이드 스크립트 (JSP/PHP와의 소통)
   ① JSP와 PHP에서의 out.print() (혹은 echo "")

서론이 길어졌네요... Flash에게 넘기겠습니다.

그럼...  __


----------------------------------------------------------------------------------------

안녕하세용.
전 Flash 라고 합니다.

저의 능력은 아주 뛰어나다고 감히 말할 수 있겠습니다.

'불가능'이란 단어를 무색하게 만들 정도이지요.

하지만 전 울렁증이 있어 이상하게도 혼자 있으면 작아집니다. ㅜㅜ

친구들과 다니면 그 힘을 주체할 수가 없는데도 말입니다...

이렇게 저에게 힘을 주는 친구들을 소개해 드리겠습니다.

여러분들도 보시면 무척 좋아하실 거에요 ^__^


1. FLASH - FLEX ( Flex와의 소통 )



우선 Flex라는 친구인데요.

얘는 요즘 AIR란 놈과 사귀더니 저의 능력을 뛰어 넘을 정도로 열심히 하고 있습니다.

아주 독한 놈이죠. '__'

하지만 전 신경 안써요.. 우린 분야가 틀리고 Flex는 제가 없으면 빛이 나지 않으니까요.ㅎㅎ



Flex Skinning Templates 사용

다시 저 입니다. (글쓴이 겸 사회자)  이후에도 쭉 이런식으로 글을 전개해 나갈 예정이에요.

Flex의 컴포넌트를 Flash, PhotoShop...등 에서 새롭게 디자인 할 수 있습니다.

이미 많은 사람들이 알고 있고, 사용하고 있는 방법인데요.

Flex와의 소통을 전달하기 위해 다시한번 말씀 드리겠습니다.

Flex Skin Design Extensions & Flex Component Kit for Flash CS3 

우선 여기서 FLEX SKIN DESIGN EXTENSION FOR FLASH 와
FLEX COMPONENT KIT FOR FLASH CS3 PROFESSIONAL 다운받겠습니다.
(Adobe ID가 있어야 다운로드가 가능합니다.)

FLEX SKIN DESIGN EXTENSION FOR FLASH :


는 Flex3 컴포넌트들이 모인 Flash 템플릿으로 디자인을 변경할 때 사용됩니다.

FLEX COMPONENT KIT FOR FLASH CS3 PROFESSIONAL :

는 Flash에서 만든 컴포넌트의 각종 효과를 Flex3에서 지원하게 해 줍니다.
(Flex3 부터는 SDK에 포함되어 있다는 말이 있습니다.)


위의 두개파일 (Flex_Skins_12_05.mxp, FlexComponentKit.mxp)을 설치합니다.


설치가 완료되고 Flash를 열어보면, 아래와 같이 Flex Skins 가 생긴 것을 보시게 될 것입니다.


Flex Skins을 눌러 바꾸고 싶은 컴포넌트를 선택하시고 스킨 디자인을 변경합니다.
완료 후 컴파일을 하면 comboBox.swf와 comboBox.swc가 생성됩니다.
( 전체 스킨을 바꾸시려면 flex_skins라는 템플릿을 선택하시면 되겠습니다. )

comboBox.swcFlex에서 사용하는 방법을 설명해 보겠습니다.

Flex Builder3 로 갑니다.

해당 프로젝트에 커서를 갔다 대고 마우스 우클릭을 하여 import 를 선택합니다.

그러면 아래와 같은 화면이 나오게 되고, swc파일을 css로 변환하기 위해 Artwork을 선택합니다.


그러면 아래와 같이 Flash에서 생성한 swc파일의 경로를 지정하고,
생성될 css파일의 경로를 지정해 줍니다.


Next 를 클릭한 후 아래와 같은 화면이 나오면 사용할 스킨을 선택합니다.
( 참고로 각각의 컴포넌트 템플릿을 사용하였다면 해당 컴포넌트 스킨만 보이게 될 것입니다. )


그런 다음 완료를 누르면 css파일이 생성이 될 것입니다.


해당 프로젝트 마우스 우클릭 → Properties Flex Build Path 에 보시면 swc파일이 자동으로등록이 되어 있는 것을 확인하실 수 있습니다.

이제 스킨을 변경한 컴포넌트의 css파일을 아래와 같이 로드하여 사용하면 되겠습니다.


<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" >
<mx:HBox>
     <mx:Button id="btn" label="button" />
</mx:HBox>
<mx:Style source="flex_skins.css"/>
</mx:WindowedApplication>

css파일을 따로 만들지 않고 그냥 Library Path에 등록 시켜 사용하는 방법은,
맥가이버를 닮은 Glenn RuehleCreate customer Flex components using Flash CS3 에 잘 설명되어 있으니 참고하시면 되겠습니다.


②  Shake'n'Bake SWFs (FlashLib.as) Open Source 활용

위의 Glenn Ruehle의 동영상에는,
Flash CS3의 무비클립을 SWC파일로 만들어 Flex Library Path에 추가 시켜 사용하는 방법을 잘 알려줍니다.

이번에 소개할 방법은 Flash CS3의 라이브러리에 있는 무비클립을 Flex 에서 사용하는 방법으로,

이미 우리에게 잘 알려진 Grant SkinnerFlashLib라는 클래스를 이용하는 방법입니다. 

Shake'n'Bake SWFs 라 불리우는 이 FlashLib 클래스는 Adobe Extension Manager로 확장하여 사용할 수 있는 mxp파일FlashLib.as 클래스로 사용하는 두가지 방법을 제공해 줍니다.

여기선 FlashLib.as 클래스를 사용하는 방법을 소개하겠습니다.

mxp 파일FlashLib.as 클래스를 다운 받기 위해선 아래의 블로그를 방문하시면 되겠습니다.

gskinner.com(gBlog) : Using Flash Symbols with ActionScript in Flex

먼저, 위의 블로그에서 FlashLib.as를 다운받은 뒤 적당한 곳에 위치 시킵니다.

Flash CS3 를 열고 flash_src.fla 란 파일을 만들겠습니다.

Flex에서 사용할 무비클립을 만들고, 링키지 속성을 다음과 같이 설정합니다.
( Graphic Symbol 은 사용하지 못합니다. MovieClip Symbol을 사용해야 합니다. )


이렇게 설정한 뒤 컴파일을 하겠습니다. flash_src.swf 란 파일이 생성 되겠지요.

그런 다음 Flex Builder 로 가보겟습니다.

Flex에서 사용하는 방법은 아래의 샘플 코드를 보시면 되겠습니다.
 
<?xml version="1.0" encoding="utf-8"?>
<mx:Window xmlns:mx="http://www.adobe.com/2006/mxml">

<mx:Script>
<![CDATA[
import flash.events.*;
import flash.display.*;
import mx.core.UIComponent;
import util.FlashLib;

// 위에서 제작한 버튼이 포함된 flash_src.swf를 layoutMc클래스에 로드합니다.
// 다른 경로에 있으면 그 경로를 적어주시면 됩니다. ( assets/flash_src.swf 와 같이..)

[Embed(source="flash_src.swf",mimeType='application/octet-stream')]
private var layoutMc:Class;
// 여기선 FlashLib.as 가 util 패키지에 있음을 참고하세요.
private var newFlashLib:FlashLib;

public function init():void{
     newFlashLib = new FlashLib(new layoutMc());
     // flash_src.swf 의 로드가 완료되면 handlerFlashLibInit 메소드를 호출합니다.
     // handleFlashLibInit 메소드가 호출된 시점 이후부터 라이브러리에 있는 심볼을 
     // 사용하실 수 있음을 명심하세요.

     newFlashLib.eventDispatcher.addEventListener(Event.INIT, handleFlashLibInit);
}
private function handleFlashLibInit(event:Event):void{
     var btnWrap:UIComponent = new Component();
     // 위에서 설정한 링키지 속성에 따라 라이브러리에 있는 btn 무비클립을 가져옵니다.
     var btn:MovieClip = newFlashLib.getInstance("btn") as MovieClip;
    
     btnWrap.addChild(btn);
     hbox1.addChild(btnWrap);
}
]]>    
</mx:Script>

<mx:HBox id="hbox1">
</mx:HBox>
</mx:Window>

위 코드에서 굵은 글씨로 표시된 부분이 FlashLib 클래스를 사용하는 부분입니다.

as파일에서도 같은 방식으로 사용하시면 되겠습니다. ^^


2. FLASH - JAVASCRIPT ( Javascript와의 소통 )


앗 벌써 또 제 차례네요 ^^;

이번 소개할 친구는 JAVASCRIPT란 친구입니다.

이 친구도 대단함이 만만치 않죠 ㄷㄷ

전 이 친구와 ExternalInterface로 대화를 하는데요.

자꾸 JSP라는 녀석이 우리 얘길 엿들을려고 해요..

말도 안통하면서 말이죠..ㅋ



ExternalInterface 에서 전달된 Object를 JSP에서 사용하기


ExternalInterfaceActionscriptJavascript간의 양방향 통신을 하게 해주는 아주 중요한 클래스입니다.

AS3.0에 와서는 모든 Actionscript - Javascript간의 통신에 ExternalInterface 사용을 권장할 정도니깐 말이죠.

이번 시간에는 ExternalInterface를 이용해 Javascript로 Object( Map형식 )를 전달하고,

Javascript에서 전달받은 Object를 약간의 데이터 가공을 통해..

JSP에서 이 Object 데이터를 사용하는 방법을 설명하도록 하겠습니다.

보통, Flash에서 Javascript 함수로 전달한 Object값들( Map형식 )은 JSP에서 바로 사용하기에 무리가 있었습니다.

그럼 예제를 통해 본론으로 들어가 보겠습니다.

예제 구성은 다음과 같습니다.
Flash CS3 : ei.fla,  Main.as ( ei.fla의 Document Class )
JSP          : eiObj.jsp,  result.jsp


ei.fla의 Document Class인 Main.as파일

package{
     import flash.display.*;
     import flash.events.MouseEvent;
     import flash.external.ExternalInterface;
    
     public class Main extends Sprite{
          // Javascript로 보낼 Object
          private var userObj:Object;
          // userObj안에 담을 배열
          private var infoArr:Array;
         
          public function Main(){
               init();
          }
          public function init():void{
               // 임시로 유저를 5명으로 정함
               var userLen:int = 5;
              
               userObj = new Object();
              
               for(var i:int = 0; i<userLen; i++){
                    infoArr       = new Array();
                    infoArr[0]  = i;
                    infoArr[1]  = "tester" + i;
                    infoArr[2]  = "aaa@aaa.com";
                    infoArr[3]  = "011-1111-1111";
                    // JSP에서 쓰일 배열 구분자
                    infoArr[4]  = "/";
                    // 각 배열값을 Object에 할당
                    userObj["userInfo"+i] = infoArr;
               }
               // 유저가 몇명인지도 Object에 할당
               userObj["arrLen"] = userLen;
              
               btnSend.addEventListener(MouseEvent.CLICK, sendClickHandler);
               btnSend.buttonMode = true;
          }
          /**
          *  버튼을 누르면 Javascript의 setObj메소드에 userObj를 전달
          */

          public function sendClickHandler(event:MouseEvent):void{
               ExternalInterface.call("setObj", userObj);
          }
     }
}


eiObj.jsp

<%@ page contentType="text/html; charset=euc-kr"%>
<html>
<head>
<title></title>
<script language="javascript">
// Flash에서 호출할 setObj메소드
function setObj(obj){
   var userArr = new Array();
   // Flash에서 저정한 유저의 총 인원 (5명)
   var arrLen  = obj.arrLen;
   // JSP에서 obj["userInfo"+i]형태로 사용을 못하므로,
   // userArr에 인덱스 형식으로 저장
   for(i=0; i<arrLen; i++){
      userArr[i] = obj["userInfo"+i];
   }
   // frmUser form의 userArr에 배열값을 저장
   document.frmUser.userArr.value = userArr;

   frmUser.target = "_self";
   // userArr 배열값을 result.jsp에 전송
   frmUser.submit();
}

// 임의로 만든 object 태그
function swf(src,w,h){
html = '';
html += '<object type="application/x-shockwave-flash"       classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,22,0" id="param" width="'+w+'" height="'+h+'">';
html += '<param name="movie" value="'+src+'">';
html += '<param name="quality" value="high">';
html += '<param name="allowScriptAccess" value="always">';
html += '<embed src="'+src+'" quality=high width="'+w+'" height="'+h+'" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent"><\/embed>';
html += '<\/object>';
document.write(html);
}
</script>

</head>
<body>
<!-- ei.swf 를 화면에 출력함 -->
<script>swf('ei.swf','550','400')</script>
</body>
</html>

<!-- result.jsp에 보내기 위한 form -->
<form name="frmUser" id="frmUser" method="post" action="result.jsp">
<input type="hidden" name="userArr" id="userArr" value="">
</form>


result.jsp

<%@ page contentType="text/html; charset=euc-kr"%>
<%@ page import="java.util.*"%>
<%@ page import="java.text.*"%>
<%@ page import="java.lang.*"%>
<%
// eiObj.jsp에서 보낸 userArr 배열값을 userArr에 받는다.
// 넘어온 배열의 형태는 a1,b1,c1,d1,/,a2,b2,c2,d2,/, ...
String userArr = request.getParameter("userArr");

// Flash에서 설정한 '/' 구분자로 userInfoArr 배열을 만든다.
// 여기선 5개의 배열이 생성될 것이다.
// userInfoArr[0] = a1,b1,c1,d1
// userInfoArr[1] = ,a2,b2,c2,d2
// userInfoArr[2] = ,a3,b3,c3,d3  ...
String[] userInfoArr = userArr.split("/");
List list = new ArrayList();
int userInfoLen         = userInfoArr.length;

for(int i = 0; i<userInfoLen; i++){
   // Flash에서 넘어온 배열값을 자동으로 ',' 구분자로 넘어오므로(String화)
   // ','를 기준으로 다시 userInfoDetailArr란 배열을 만든다.
   // userInfoDetailArr[0] = a1
   // userInfoDetailArr[1] = b1
   // userInfoDetailArr[2] = c1  ...
   String[] userInfoDetailArr = userInfoArr[i].split(",", 0);

   Map map = new HashMap();

   /*out.print("no : " + userInfoDetailArr[0] + " || ");
   out.print("name : " + userInfoDetailArr[1] + " || ");
   out.print("email : " + userInfoDetailArr[2] + " || ");
   out.print("cphone : " + userInfoDetailArr[3] + " || ");
   out.print("    ##     " + " || ");
   */

   // 다음은 JSP에서 사용하기 쉽게 HashMap형식으로 저장한다.
   if(i == 0){
      map.put("user_no", userInfoDetailArr[0]);
      map.put("user_name", userInfoDetailArr[1]);
      map.put("user_email", userInfoDetailArr[2]);
      map.put("user_cphone", userInfoDetailArr[3]);
   // i 가 1부터는 앞에 ','가 하나 더 있으므로
   // 배열 인덱스를 1 부터 시작해 준다.
   }else{
      map.put("user_no", userInfoDetailArr[1]);
      map.put("user_name", userInfoDetailArr[2]);
      map.put("user_email", userInfoDetailArr[3]);
      map.put("user_cphone", userInfoDetailArr[4]);
   }

   // Map을 ArrayList 추가 시킨다.
   list.add(map);
}


// 값들이 모두 할당이 되면 JSP에서는
// 아래와 같이 자유롭게 사용할 수 있다.
out.print(((Map)list.get(0)).get("user_name"));
out.print(((Map)list.get(3)).get("user_name"));
%>

주석으로 설명 하였지만, 간단히 요약해 보겠습니다.

Flash에서 Javascript로 Object를 전달하면 Javascript내에선 자유자제로 표현이 가능하나,

JSP단에서는 Object의 .(dot)형식으로 사용상 제한이 있었습니다.

때문에 구분자를 두어 String형식을 다시 배열 형식으로 바꿔 사용하였습니다.

누구나 구현 할 수 있는 방법이고, 자칫 뻘짓이 될 수도 있는 방법이나..

가끔 유용하게 사용될 때가 있었습니다.

시도조차 하지 않아 안되는 방법이 되는 것을 막고자 이번 리뷰에 설명하게 되었습니다.

예제 소스  :  ei.zip 


3. FLASH - XML ( XML과의 소통 )


네.. 또 저입니다.

이번에 소개해드릴 친구는 XML이란 놈인데요.

대부분의 RIA개발자와 친한 정말 대단한 놈입니다.

XML이란 친구는 너무 유명해서 이 친구에 대해선 다음에 소개를 해드리구요.

XML 친구의 부모격(?)이 되는 JSP와 PHP친구들에 의해서 

XML이 태어나는 과정을 간단히 소개할까 합니다.



① JSP에서 XML형식으로 파싱하는 방법


먼저 JSP입니다. Flash와 친하기로는 PHP 다음이라고 하는데요.

저랑 친하기 때문에 소개해 드리겠습니다.

// contentType="text/html; 이 아닌 contentType="text/xml; 로 해야합니다.
<%@ page contentType="text/xml; charset=euc-kr"%>
<%@ page import="java.util.*"%>
<%@ page import="java.net.*"%><%@ page import="java.sql.*"%>
<%@ page import="com.gmdat.common.RDBConnectionTop"%>
<%// DB에 데이터를 가져오는 부분
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
StringBuffer sb = new StringBuffer();
String subject = "";
String content = "";
String regdate = "";
int len = 0;
List list = new ArrayList();
//==================================================
// TEST란 테이블에 데이터를 가져옵니다.
// 원래는 JAVA단에서 처리하나,
// 설명을 위해 디비 접근 부분을 jsp에 포함 시켰습니다.
try{
// Connection 부분은 각자의 환경에 따라 Connection을 변경합니다.
con = RDBConnectionTop.getInstance().getConnection();
sb.append("SELECT * ");
sb.append("FROM TEST ");
ps = con.prepareStatement(sb.toString());
rs = ps.executeQuery();
while(rs.next()){
Map map = new HashMap();
map.put("SUBJECT", rs.getString("SUBJECT"));
map.put("CONTENT", rs.getString("CONTENT"));
map.put("REGDATE", rs.getString("REGDATE"));
list.add(map);
}
rs.close();
ps.close();
con.close();
len = list.size();


//==================================================
%>
<?xml version="1.0" encoding="euc-kr"?>
<ROOT>
<%
// 데이터베이스에 데이터가 있을 경우
if(len > 0){
// 데이터의 갯수에 따라 루프를 돌립니다.
for(int i=0; i<len; i++){
Map list_map = new HashMap();
list_map = (Map)list.get(i);
%>
// 지정한 XML형태대로 반복이 이루어지게 함
<RECORD ROWNUM="<%=i%>">
<SUBJECT><%=list_map.get("SUBJECT")%></SUBJECT>
<CONTENT><%=list_map.get("CONTENT")%></CONTENT>
<REGDATE><%=list_map.get("REGDATE")%></REGDATE>
</RECORD>
<%
}
// 데이터베이스에 데이터가 없을 경우
}else{
%>
<RECORD ROWNUM="0">
<ALERT>현재 등록 된 데이터가 없습니다.</ALERT>
</RECORD>
<%
}
%>
</ROOT>
<%
}catch(Exception e){
System.out.println("jspToXml.jsp : " + e);
}finally{
if(rs != null){rs.close();}
if(ps != null){ps.close();}
if(!con.isClosed()){con.close();}
}
%>



② PHP에서 XML형식으로 파싱하는 방법


<?
// 데이터베이스에 연결을 시도합니다.
@extract($HTTP_POST_VARS);
$mysql = mysql_connect("localhost","test","12341234") or die("데이트 베이스에 접근할수가 없습니다.");
mysql_select_db("test") or die("데이트 베이스를 찾을수가 없습니다.");


$num    = 1;
$Query  = "SELECT * FROM test ORDER BY REGDATE DESC";
// 쿼리문에 대한 결과값들을 얻어옵니다.
$Result = @mysql_query( $Query );

// XML형식으로 출력합니다.
echo('<?xml version="1.0" encoding="euc-kr"?>');
echo("\n<ROOT>\n");
// 결과값이 존재하면 행에 대응되는 객체를 반환(mysql_fetch_object)
// 결과값이 존재하지 않으면 FALSE를 반환함
while ( $User = mysql_fetch_object( $Result )){
   //
   echo("<ITEM>\n");
   echo("<NUM>" . $num++ . "</NUM>");
   echo("<ID>" . $User->ID . "</ID>\n");
   echo("<NAME>" . $User->NAME . "</NAME>\n");
   echo("<EMAIL>" . $User->EMAIL . "</EMAIL>\n");
   echo("</ITEM>\n");
}
echo("</ROOT>");
?>

보시다시피 JSP와 PHP 둘다 형식은 비슷합니다.

각각의 데이터베이스의 설정이 달라서 실핼할 수 있는 코드를 올리지 못한것이 좀 맘에 걸리네요.+_+

웹개발을 하시는 분이시라면 잘 아실만한 내용이지만요,

그렇지 않은 분들을 위해 대략적으로 이렇다.. 라는것을 보여드린겁니다.

조금이나마 참고가 되길 바랍니다.

예제소스 xml.zip



4. FLASH - 서버사이드 스크립트 (JSP/PHP 와의 소통)

드디어 마지막 친구네요 ^__^;;

JSP와 PHP라는 녀석인데요.

이 녀석들이 저와 간단한 대화를 할때는 URLLoader라는 것을 사용합니다.

제가 이녀석들에게 말을 걸면, 이녀석들은 출력을 하여 저한테 응답을 하는데요.

이 두 녀석들이  출력하는게 각각 조금씩 틀려서 애를 먹기도 한답니다.

뭐가 틀린지 알아볼까요? ㅋ




① JSP와 PHP에서의 out.print() (혹은 echo "")


먼저 아래는 MyLoader라는 URLLoader 기능의 클래스입니다.

package{
     import flash.display.Sprite;
     import flash.events.*;
     import flash.net.*;
     import flash.system.*;
    
     public class MyLoader extends Sprite{
          public function MyLoader(){
               init();
          }
          public function init():void{
               System.useCodePage         = true;
               var loader:URLLoader         = new URLLoader();
               // URLLoader 가 읽어들일 데이터 포맷을 지정합니다. 
               // VARIABLES, BINARY, TEXT가 있는데,
               // 저희는 이름/값으로 출력되는 데이터들을 받아올 것이므로
               // URLLoaderDataFormat.VARIABLES을 사용합니다.

               loader.dataFormat               = URLLoaderDataFormat.VARIABLES;
               configureListeners(loader);

               var request:URLRequest      = new URLRequest("JSP 또는 PHP 주소");
               // JSP나 PHP에 보낼 데이터 설정
               var variables:URLVariables  = new URLVariables();
               variables.id        = "chrispark";
               
               // POST방식으로 데이터들을 전송합니다.
               request.method  = URLRequestMethod.POST;
               request.data       = variables;
              
               try{
                    loader.load(request);
               }catch(error:Error){
                    trace("Unable to load requested document.");
               }
          }
          private function configureListeners(dispatcher:IEventDispatcher):void {
               dispatcher.addEventListener(Event.COMPLETE, completeHandler);
          }
          private function completeHandler(event:Event):void {
               // JSP나 PHP에서 값들을 받아옵니다.
            var loader:URLLoader = URLLoader(event.target);

               switch(loader.dataFormat) {
                case URLLoaderDataFormat.TEXT :
                trace("completeHandler (text): " + loader.data);
                break;
                case URLLoaderDataFormat.BINARY :
                trace("completeHandler (binary): " + loader.data);
                break;
                    // 데이터포맷이 VARIABLES이므로 아래에 받은 데이터가 로드됩니다.
                    // loader.data.name, loader.data.email ...
                case URLLoaderDataFormat.VARIABLES :
                trace("completeHandler (variables): " + loader.data);
                break;
           }
         }
     }
}

위와 같은 URLLoader를 사용하여 JSPPHP의 값들을 읽어들일때,

각 페이지에서 출력시 주의해야 할 사항들이 있습니다.

JSP ( print.out(" "); )

처음 부분
 =&aaa=1&bbb=2&ccc=3  정상
 &aaa=1&bbb=2&ccc=3  에러
 aaa=1&bbb=2&ccc=3  두번째 값부터 정상

마지막 부분
 =&aaa=1&bbb=2&ccc=3&=  정상
 =&aaa=1&bbb=2&ccc=3&  에러
 =&aaa=1&bbb=2&ccc=3  정상

따라서,
=&aaa=1&bbb=2&ccc=3
=&aaa=1&bbb=2&ccc=3&=

만이 Flash에서 정상적으로 값을 받을 수 있습니다.

PHP ( echo " "; )

처음 부분
 =&aaa=1&bbb=2&ccc=3  정상
 &aaa=1&bbb=2&ccc=3  에러
 aaa=1&bbb=2&ccc=3  정상

마지막 부분
 =&aaa=1&bbb=2&ccc=3&=  정상
 =&aaa=1&bbb=2&ccc=3&  에러
 =&aaa=1&bbb=2&ccc=3  정상
 aaa=1&bbb=2&ccc=3&=  정상
 aaa=1&bbb=2&ccc=3&  에러
 aaa=1&bbb=2&ccc=3  정상


따라서,
=&aaa=1&bbb=2&ccc=3
=&aaa=1&bbb=2&ccc=3&=
aaa=1&bbb=2&ccc=3
aaa=1&bbb=2&ccc=3&=

Flash에서 정상적으로 값을 받을 수 있습니다.

에러일때는 아래와 같은 메세지를 보실 수 있을 것입니다.





이번 리뷰를 진행하면서...

Flex나 AIR와 관련있는 사항들만 정리를 할 것인가...에 많은 고민을 하였습니다.

고민 끝에... Flex 뿐만 아니라 Flash와 연관 되어 있는 다른것들도 다뤄보기로 하여 리뷰를 적어 나갔습니다.

Flash에 초점이 맞춰져 있지만 Flex개발에도 전혀 상관없지 않은 내용들을 적어 나가려고 노력하였으며, 서버사이드 언어들과 연계하여 리뷰를 진행 하였습니다.

깊이 보다는 범위를 넓혀 모름직한 내용들을 다루려다 보니깐 부족한 면이 많이 있을것으로 생각됩니다.

그리고 4차원적인 글 전개에 대해선 너무 부담갖지 마시고 읽어 주셨으면 하는 바램입니다. ^^;;

이것으로 리뷰를 마치겠습니다.



※ 기술문서 원문 URL : http://www.adobeflex.co.kr/iwt/board/board.php?tn=pds_tech&id=181&mode=view