Apach MINA

Development/ETC 2008.09.24 11:01
글로 그림 그리는 산골소년 님의 "진화하는 아파치 미나(Apache MINA) 위키 강좌

바로가기
Posted by 뚜기당
TAG Java

우선 Flex는 기본적으로 .Net Application 을 지원하지 않는다.
Adobe에서 연동 요청을 했으나, MS의 Silverlight에 대한 지원 정책으로 인해, MS가 거부했다는 풍문도 있다.

.NET App들이 DataSource로 사용하는 DataSet이 W3C 표준을 지원하지 않음으로,
(Framework 1.1을 기준으로 개발한 내 경우엔, 구조화된 DataSet으로 바꾸기 위해,
xml schema를 먼저 생성하고, 그놈으로 변환해서 return하는 형태로 구현했었음.)
 Flex Webservice가 해당 DataSet을 바로 Result를 처리할 수 있는 방법이 없다.
(element 에러가 발생하면서, Response를 파싱 하지 못한다.)

그렇다고 사용 안할 수는 없으니, 여기에 꽁수를 밝힌다.

1. .Net App에서 Webservice를 하나 생성하고, 호출하려는 Webservice를 웹참조한다.
   : 호출하려는 webservice에서 return하는 DataSet을 표준 xml로 변환하는
     Webservice를 생성하기 위해서이다.
2. 다음과 같은 Webservice를 정의한다. (VS.Net 2008, C# 기준)
        /*FlexInterfaceCallasmx */
        [WebMethod]
        public XmlDocument DataSetBoxing()
        {
            XmlDocument xml = new XmlDocument();

            try
            {
                호출하려는 Web Reference ws = new 호출하려는 Web Reference();

                DataSet ds = ws.호출하려는 Method();

                if (ds != null && ds.Tables[0] != null)
                {
                    System.IO.StringWriter sw = new System.IO.StringWriter();
                    ds.WriteXml(sw);
                    sw.Close();

                    xml.LoadXml(sw.ToString());
                }
                else
                    xml.LoadXml("<Error>Interface Error : Data Not Found</Error>");

                return xml;
            }
            catch (Exception ex)
            {
                xml.LoadXml("<Error>" + ex.Message + "</Error>");
                return xml;
            }
        }


   3. Flex에서는 해당 Result를 Object Format으로 받아서, ArrayCollection으로 변환한다.
          <mx:Script>
               <![CDATA[
                      private function fnSucs(e:ResultEvent) : void
                     {
                           this.dsResult.removeAll();
   
                          if( e.result.최상위다음노드 != null )
                          {
                                 if (e.result.최상위다음노드.NewDataSet == null)
                                       Alert.show(ObjectUtil.toString(e.result.최상위다음노드.Error),"Alert");
                                 else if (e.result.DataSetBoxingResult.NewDataSet.Table == null)
                                       Alert.show("조회된 자료가 없습니다.","Notice");
                                 else
                                       this.dsResult = ArrayCollection(e.result.DataSetBoxingResult.NewDataSet.Table);
                          }

                         this.dgTest.dataProvider = this.dsResult;
                  }
   
                  private function fnFail(e:FaultEvent) : void
                 {
                       Alert.show(ObjectUtil.toString(e.fault));
                  }
           ]]>
      </mx:Script>

      [Bindable] protected var dsResult : ArrayCollection = new ArrayCollection();

      <mx:WebService id="webService" wsdl="http://localhost/FlexInterfaceCall.asmx?wsdl"
             useProxy="false" showBusyCursor="true">
             <mx:operation name="DataSetBoxing" resultFormat="object"
                    result="this.fnSucs(event)" fault="this.fnFail(event)">
             </mx:operation>
      </mx:WebService>

    <mx:DataGrid x="10" y="98" width="402" height="404" id="dgTest" />

Posted by 뚜기당

Monday, October 02, 2006

asp.net C# data webservice for Flex

This is kinda the next evolutionary step from my previous blog. In this example I demonstrate how to get an array of records from .net to flex. Again, I have simplified this for the purpose of this blog. In the asp.net webservice, I would normally retrieve records from the database and then iterate thru the dataset to build my array, while here in this example I have just populated the array manually.

C# Webservice:

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Services;
using System.Xml.Serialization;

namespace Director
{
public class MemberService : System.Web.Services.WebService
{
public MemberService() { InitializeComponent(); }
private IContainer components = null;
private void InitializeComponent() {}
protected override void Dispose( bool disposing ) {
if(disposing && components != null) {
components.Dispose();}
base.Dispose(disposing);
}

[WebMethod]
[XmlInclude(typeof(Member))]
public Member[] getMembers()
{
ArrayList al = new ArrayList();
Member mem = new Member(0,"bob","bsmith","password1",
"bob@abc.com","Initiate",false,DateTime.Now);
al.Add(mem);
Member mem1 = new Member(0,"jim","jsmith","password2",
"jim@abc.com","Member",false,DateTime.Now);
al.Add(mem1);
Member mem2 = new Member(0,"ed","esmith","password3",
"ed@abc.com","Officer",false,DateTime.Now);
al.Add(mem2);
Member mem3 = new Member(0,"neil","nsmith","password4",
"neil@abc.com","Guest",false,DateTime.Now);
al.Add(mem3);
Member[] outArray = (Member[])al.ToArray(typeof(Member));
return outArray;
}
}

[Serializable]
public class Member
{
public int memberid;
public String name;
public string username;
public string password;
public string email;
public string comments;
public bool disabled;
public DateTime created;

public Member(int _memberid, string _name,
string _username, string _password,
string _email, string _comments,
bool _disabled, DateTime _created)
{
memberid = _memberid;
name = _name;
username = _username;
password = _password;
email = _email;
comments = _comments;
disabled = _disabled;
created = _created;
}
public Member(){}
}
}

In Flex, the Member.as file:
package com.abc.ws
{
[Managed]
[RemoteClass(alias="com.abc.ws.Member")]
public class Member
{
public var memberid:int;
public var name:String;
public var username:String;
public var email:String;
public var password:String;
public var comments:String;
public var disabled:Boolean;
public var created:Date;

public function Member(obj:Object = null)
{
if (obj != null)
{
this.memberid = obj.memberid;
this.name = obj.name;
this.comments = obj.comments;
this.username = obj.username;
this.email = obj.email;
this.disabled = obj.disabled;
this.created = obj.created;
this.password = obj.password;
}
}
}
}
In Flex, the application:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
<mx:Script>
<![CDATA[
import mx.rpc.events.ResultEvent;
import com.abc.ws.Member;
import mx.collections.ArrayCollection;

[Bindable]
private var myMembers:ArrayCollection;

private function resultHandler(event:ResultEvent):void {
myMembers = event.result as ArrayCollection;
for (var i:int=0; i<myMembers.length; i++) {
var currentMember:Member = new Member();
currentMember = new Member(myMembers.getItemAt(i));
myMembers.setItemAt(currentMember, i);
}
}
]]>
</mx:Script>
<mx:WebService id="myService"
wsdl="http://localhost/Director/MemberService.asmx?wsdl"
load="myService.getMembers()"
showBusyCursor="true"
result="resultHandler(event)"/>

<mx:DataGrid dataProvider="{myMembers}"/>
</mx:Application>
Posted by 뚜기당

Saturday, July 28, 2007

Getting .NET datasets in Flex through webservices

The current support in Flex for .NET datasets is rather 'limited' to say the least. This is a pitty because most .NET developers make use of datasets and the missing support currently prevents major adoption of Flex by the .NET community.

Although this solution doesn't add complete dataset support to Flex it at least allows you to get the records of a .NET dataset (or a datatable) in Flex through an easy webservice call.

Up till now the typical suggestion is to create a class in .NET that matches the datatable layout, create an array based on this class and fill the array with the records of the datatable.

There is however a much easier solution. Your WebMethod in .NET should look like this:

[WebMethod]
public XmlDocument GetAllUsers()
{
dsBC dsBC1 = new dsBC();
// here you should fill the datatable with database records
return GetXml(dsBC1.bcUser);
}

public XmlDocument GetXml(DataTable dt)
{
System.IO.StringWriter sw = new System.IO.StringWriter();
dt.WriteXml(sw);
sw.Close();
XmlDocument xd = new XmlDocument();
xd.LoadXml(sw.ToString());
return xd;
}

When calling the GetAllUsers web method from Flex you can simply bind for example a datagrid to the event.result object.

Dates are returned in W3C format by .NET! Therefore you should convert them to 'real' Flex dates by using the DateUtil routines in corelib.

Posted by 뚜기당

단상

My Story/Gossip 2007.12.18 09:26

언제나 그렇지만, 나이가 먹을 수록 세상 일이 단순해 진다.
일어나서, 먹고, 출근하고, 그날의 일을 하고, 먹고, 남은 일하고, 먹고, 또 남은 일하고,
퇴근하고, 보고, 잔다.

10대 때는 멍하게, 세상이 무엇인지도 모르고 그냥 그렇게 살았고,
20대 때는 복잡한 세상 답이 없어 보였고,
30대 초반엔, 살기 위해 발버둥을 쳤고,
이제 슬슬 세상이 점점 단순해 진다는 생각이 든다.
나중에 어떻게 되려나,

난 비싼 카메라가 있다....물론 내 수준에서 비싼 카메라다.

그런데 사진을 거의 찍지 않는다.

순 아이들 사진만.....다른 사람들 처럼 일상의 편린들을 찍고 싶지만....
잘 되지 않는다.

왜 일까....불현듯....

내 삶이 단순해서라는 생각이 들었다.
그래...단순 하니까....다를께 없으니까....어제와 같은 오늘....오늘과 같은 내일...

기억에 담기엔....추억이라 말하기엔.....

밖에 눈이 온다....사박사박....

Posted by 뚜기당

Flex의 PopUp 창 구현하기.
1. 개요
PopUp Dialog창 구현하기.

2. 필요한 import 문
import mx.core.IFlexDisplayObject;
import mx.managers.PopUpManager;

3. 필요한 MXML Component
Title Window
이  컴포넌트는 띄우기만 하면 dim처리를 자동으로 처리해주고 주의할 것은

showCloseButton을 true를 해주고   close속성에서 close버튼에 대한 정의가 된 함수를

호출해주는 것이 좋다.(ex.PopUpManager.removePopUp(this as IFlexDisplayObject);


4. PopUp Example
in main.mxml에서는


Popup 창을 호출하는 함수의 예.
   <mx:Script>
        <![CDATA[
            import mx.core.IFlexDisplayObject;
            import mx.managers.PopUpManager;
           
            private function login():void{
            var flexPopup:IFlexDisplayObject =

PopUpManager.createPopUp(this as DisplayObject, PopIn, true);
 //popupmanager에 "flexpopup"이라는 popup창을 띄운다.

           //PopIn은 띄울 팝업창에 대한 정의가 되어 있는 mxml이름이다.

           (flexPopup as PopIn).myid = this.insert.text;     

//혹시 팝업창에 넘길 인자가 있다면 이런 식으로 넘겨주면 된다.

       PopUpManager.centerPopUp(flexPopup);   //팝업창이 띄워지는 위치를 정중앙으로 옮긴다.
            }       
        ]]>
</mx:Script>

//.....


in PopIn.mxml 에서는
<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="586"

height="452"   showCloseButton="true" close="this.closeView2()" 

//close버튼을 true으로 셋팅하고 그 버튼에 대한 정의된 함수를 호출한다.

 closeButtonDownSkin="@Embed('img/FP_Button_CloseWindow_Normal.png')"

 closeButtonOverSkin="@Embed('img/FP_Button_CloseWindow_Hover.png')"
 closeButtonUpSkin="@Embed('img/FP_Button_CloseWindow_Normal.png')"

  borderStyle="outset" backgroundColor="#000000" backgroundAlpha="0.0" alpha="0.88">
 //스킨 및 옵션에 대한 셋팅
 <mx:Script>
  <![CDATA[
   import mx.core.IFlexDisplayObject;
   import mx.managers.PopUpManager;
   
   [Bindable]public var myid:String;
   
   
   private function closeView2():void
   {
    PopUpManager.removePopUp(this as IFlexDisplayObject);
    //PopUpManager에서 팝업창을 제거해준다.
   }
  ]]>
 </mx:Script>
</mx:TitleWindow>

Posted by 뚜기당

// Flex 에서 GET  형태로 넘어온 value를 접근하기 위해 필요

//javascript로 구현한 Request

function Request(valuename)
{
    var rtnval;
    var nowAddress = unescape(location.href); //현재 url주소값 가져오기
    var parameters = new Array();

    parameters = (nowAddress.slice(nowAddress.indexOf("?")+1,nowAddress.length)).split("&");
    for(var i = 0 ; i < parameters.length ; i++)
   {
        if(parameters[i].indexOf(valuename) != -1)
       {
            rtnval = parameters[i].split("=")[1];

            if(rtnval == undefined || rtnval == null)
                rtnval = "";

            return rtnval;
        }
    }
}


function Request(valuename)
valuename --> valuename 변수명에 필요한 파라미터 변수명을 던져 값을 받아온다.


[예제]
http:www.naver.com?txtSearchWord=네이버
var result = Request("txtSearchWord");

txtSearchWord라는 파라미터 변수명만 던지면 네이버 라는 값을 가져온다

Posted by 뚜기당

1. Dom을 이용해 플래쉬에 접근하는 경우 E에서는 Object의 ID를 FF에서는 Embed의 ID를 사용하게 된다. 즉 아래와 같다.

     <object id="id1"><embed src="test.swf" id="id1" /></object>

위와 같이 설정하고

      document.getElementById('id1')

라고 하면 IE에서는 정상동작하겠지만 FF에서는 Object를 참조하기 때문에 오동작하게된다.

2. <form></form> 안에서 사용하면 안된다.
<form>
       form으로 둘러싸인 플래쉬 무비에서 ExternalInterface를 addCall 하면 해당 플래쉬의 ID를 찾을 수 없다는 에러를 발생시킨다.
</form>

이 문제는 아래의 코드를 사용해 해결할 수 있다. ExternalInterface를 사용하는 페이지에 아래의 로직을 인클루드시킨다.

<script type="javascript/text">
function ExternalInterfaceManager() {
   this.registerMovie = function(movieName) {


   if(!window.fakeMovies) window.fakeMovies = new Array();
      window.fakeMovies[window.fakeMovies.length] = movieName;
   }


   this.initialize = function() {
      if(document.all) {
         if(window.fakeMovies) {
            for(i=0;i<window.fakeMovies.length;i++) {
               window[window.fakeMovies[i]] = new Object();
            }


            window.onload = initializeExternalInterface;
         }
      }
   }
}


function initializeExternalInterface() {
   for(i=0;i<window.fakeMovies.length;i++) {
      var movieName = window.fakeMovies[i];
      var fakeMovie = window[movieName];
      var realMovie = document.getElementById(movieName);

      for(var method in fakeMovie) {
         realMovie[method] = function() {
            flashFunction = "<invoke name=\"" + method.toString() + "\" returntype=\"javascript\">" +       __flash__argumentsToXML(arguments, 0) + "</invoke>";this.CallFunction(flashFunction);
         }
      }

      window[movieName] = realMovie;
   }
}


</script>
   플래쉬를 표시하기 전 아래의 자바스크립트를 실행한다.
<script type="text/javascript">
//<![CDATA[var eim = new ExternalInterfaceManager();

eim.registerMovie("flashID");

eim.initialize();
//]]>
</script>



위의 방법보다 간단한 방법이라 소개된 자료
 function Flash(id, url, width, height)
{
     var str;
     str = '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="' + width + '" height="' + height + '" id="' + id + '" align="middle">';
     str += '<param name="allowScriptAccess" value="sameDomain" />';
     str += '<param name="movie" value="' + url + '" /><param name="quality" value="high" /><param name="bgcolor" value="#ffffff" />';
     str += '<embed src="' + url + '" quality="high" bgcolor="#ffffff" width="' + width + '" height="' + height + '" id="'+ id +'" name="' + id + '" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />';
     str += '</object>';
 
     document.write(str);
 
     //Flash의 ExternalInterface가 Form Tag내에서 오류나는 버그를 해결하는 코드
     eval("window." + id + " = document.getElementById('" + id + "');");
}

Posted by 뚜기당
TAG flex
이걸루 한 3주는 삽질을 했다.
물론, 내 부주의일 수도 있겠지만,

FlexBuilder 2.0 혹은 2.0.1을 Vista에 설치하거나, Vista가 설치된 후, Vitual PC등으로 XP환경을 구성을 한 후에 설치하고 실행하면, 자바 어쩌구 환경파일이 어쩌구 에러가 발생한다.
걍 권한 문제인가 보다 하고, 또 새로 옮긴 회사에서 빵빵한 사양의 노트북을 사줘서 (회사에서 내께 젤 조타...캬햐햐햐) 걍 무시하고 넘어갔는데, 혹시나 싶어, 관리자 권한으로 실행하면 될까 하는 생각이 불현듯, 그리고 때늦게 떠올랐다.

내 경우에는 설치 시에(Vista던지, Virtual PC로 XP 설치) 2.0인 2.0.1에서 별다른 메세지가 안 나온 것으로 기억을 하는데, 3.0 을 설치하니, 설치 중에 최초 한번은 관리자로 실행하라고 나오더만,

머 일단 VISTA 권한에 대한 나의 무지를 탓할 수밖에,
덕분에 앞으로 집에서도 FLEX 하게 생겼다.

지화자~!
Posted by 뚜기당
언제나 느끼는 것이고, 어느 직업이 또 안 그렇겠느냐 마는,
이 바닥은 너무나 많이 변하고 새로운 것이 최고인양,
새로운 무엇인가에 대하여 피상적인 지식이라도 알고 있어야만 한다는 것이
너무나 무겁게 다가오는 것 같다.

새로운 시작은 언제나 설레이지만,
이제 슬슬 나이가 먹는지, 잔재주만 피울려고 한다.

언제까지 나의 사기질이 먹힐지 모르겠지만,
그래도 배운 재주가 얼렁뚱땅이라...얼렁뚱땅이라도 열심히 해보려고 한다.

ps) 그런데 옮긴 회사 뜨신 물이 안 나온다.....손이 꽁꽁~!
Posted by 뚜기당