반응형
xml를 스크립트로 넣는것과 HTTPService로 가져오는 것의 차이점?

출처 : http://cafe.naver.com/flexcomponent/5509

5496번 게시글과 답변글을 보시면

XML 데이터를 리피터를 사용해서 리스트로 뿌려주는것입니다.
그런데...
1. mxml 소스상에서 <mx:XML> ... 이런식으로 XML을 생성해서 Repeater에 dataProvider 해주는것과
2. HTTPService로 XML를 받아와서 Repeater에 dataProvider 해주는 것이 차이가 있는것인가요?

1번으로 하면 @label 이런식으로 데이터 접근이 가능한데
2번으로 하면 @label 하면 않되더라고요~~~

혹~~~ 차이점이 있는지요?

-----  1번 소스 -----
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="600" height="400" fontSize="11">
 <mx:Script>
  <![CDATA[
   import mx.controls.*;
  
   private function selectedDir(e:Event): void {
    var selectedItem:Object = List(e.target).selectedItem;
    Alert.show(selectedItem.@data);
   }
  ]]>
 </mx:Script>

  <mx:XML id="model"> 
 <photoDir>
  <items name="marriedcouple">
   <item label="f20061225" data="f20061225 DIR" summary="f20061225 SUMMARY" />
   <item label="f20070401" data="f20070401 DIR" summary="f20070401 SUMMARY" />
   <item label="f20070620" data="f20070620 DIR" summary="f20070620 SUMMARY" />
   <item label="f20070710" data="f20070710 DIR" summary="f20070710 SUMMARY" />
   <item label="handphone" data="handphone DIR" summary="handphone SUMMARY" />
   <item label="wedding" data="wedding DIR" summary="wedding SUMMARY" />
  </items>
  <items name="zzoro">
   <item label="day100" data="day100 DIR" summary="day100 SUMMARY" />
   <item label="f20070401" data="f20070401 DIR" summary="f20070401 SUMMARY" />
  </items>
 </photoDir>
 </mx:XML>
 
 <mx:Accordion width="100%" height="100%" >  
  <mx:Repeater id="repeat" dataProvider="{ model.items }" >  
   <mx:VBox width="100%" height="100%" label="{ repeat.currentItem.@name }" >   
    <mx:List labelField="@label" width="100%" height="100%" id="dirList" dataProvider="{ repeat.currentItem.item}" itemClick="selectedDir(event);"/>  
   </mx:VBox> 
  </mx:Repeater>
 </mx:Accordion>
</mx:Application>

----- 2번 소스 -----------

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="1000" height="700" fontSize="11" creationComplete="photo.send()">
 <mx:Script>
  <![CDATA[
   import mx.controls.Alert;
   import mx.controls.List;
   import mx.rpc.events.ResultEvent;
   import mx.rpc.events.FaultEvent;  
   
   private function resultHandler(event: ResultEvent): void {
    photoRep.dataProvider = event.result.photoDir.items;
   }
   private function faultHandler(event: FaultEvent): void {
    Alert.show(event.fault.message);
   }  
   private function selectedDir(e:Event): void {
    var selectedItem:Object = List(e.target).selectedItem;
    Alert.show(selectedItem.@data);
   }
  ]]>
 </mx:Script>
 <mx:Style source="css/gallary.css"/>
 <mx:HTTPService id="photo" destination="photoHttpService" useProxy="true" result="resultHandler(event)" fault="faultHandler(event)" />

 <mx:Accordion x="10" y="10" width="200" height="448" id="photoAccordion" headerHeight="30" cornerRadius="0">
  <mx:Repeater id="photoRep">
   <mx:VBox id="photoBox" label="{photoRep.currentItem.name}" height="356">
    <mx:List labelField="@label" width="200" height="301" id="dirList" dataProvider="{photoRep.currentItem.item}" itemClick="selectedDir(event);"/>
   </mx:VBox>
  </mx:Repeater>
 </mx:Accordion>

 <mx:TileList x="437" y="10" width="553" height="200" id="photoList"></mx:TileList>
 <mx:Image x="218" y="218" width="772" height="462" id="photoView"/>
 <mx:TextArea x="218" y="10" width="211" height="200" id="tArea"/>
</mx:Application>


--------------------------------------------------------------------------------------------------
HTTPService을 자바랑 같이 쓰진 않아서 정확하게는 모르겟습니다만.
PHP와 연동할때는 XML데이터를 저는HTTPService에서 resultFormat에 e4x로 지정해두고 받아서 @속성 으로 접근합니다..
--------------------------------------------------------------------------------------------------
ormat="e4x" 로 하니까 아무것도 않나타 나던데요... 으흐흐흐~~~ 서블릿에서 xml를 만드는건 jdom으로 만드는데... 아고~~~ 어렵네요~~~ ^^
--------------------------------------------------------------------------------------------------
resultFormat를 하시면 리턴되어져오는 객체 자체가 new XML(e.result.data)로 선언한것과 같이 리턴되요
--------------------------------------------------------------------------------------------------
resultFormat정의안하면 기본타입이 object입니다. 도트연산자를 사용하여 접근하는 방식이죠. e4x를 지정 해야 xml파싱 api를 사용할수 있습니다.



jsp의 xml데이터 가져오기가 안되요~~

데이터 그리드에 아무런값도 가져오지못하네요~
jsp페이지만 실행해 봤는데....요렇게 에러메세지만 나오구요..

XML 페이지를 표시할 수 없습니다.

스타일시트를 사용하여 XML 입력을 볼 수 없습니다. 오류를 수정한 다음 새로고침 단추를 누르거나 나중에 다시 시도하십시오.


XML 문서에는 최상위 요소가 있어야 합니다. 'http://localhost:8080/homepage/bin/get_data.jsp' 리소스를 처리하는 데 오류가 발생했습니다.

왕초보라서..도대체뭐가 문제인지 도무지 알수가 없습니다.
소스는요..

==================
index.mxml
==================

<?xml version="1.0" encoding="utf-8"?>

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="feedRequest.send();">

<mx:HTTPService id ="feedRequest" url="http://localhost:8080/homepage/src/get_data.jsp" useProxy="false">
</mx:HTTPService>

       <mx:Panel title="Example" height="100%" width="90%" paddingTop="10" paddingBottom="10" paddingLeft="10" paddingRight="10" layout="vertical">
               <mx:DataGrid id="dgPosts" dataProvider="{feedRequest.lastResult.result_set.record}" width="100%"/>
       </mx:Panel>
</mx:Application>

이구요...

==================
get_data.jsp
==================

<%@ page contentType="text/xml; charset=UTF-8"%>
<%@ page import = "java.io.*, java.sql.*, java.util.*, java.net.*" %>
<?xml version="1.0" encoding="utf-8"?>

<%

 String sql = "select emp_id, fname, lname, job_id from employee";
 Connection conn = null;
 Statement stmt = null;
 ResultSet rs = null;  
 
 try{
      Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
      String url = "jdbc:sqlserver://localhost:1433;DatabaseName=pubs";
      conn = DriverManager.getConnection(url,"sa","sa");
      stmt = conn.createStatement();
      rs = stmt.executeQuery(sql);

      out.println("<result_set>");
      while (rs.next()){
            out.println("<record>");
                   out.println("<emp_id>" + rs.getString(1) + "</emp_id>");
                   out.println("<fname>" + rs.getString(2) + "</fname>");
                   out.println("<lname>" + rs.getString(3) + "</lname>");
                   out.println("<job_id>" + rs.getString(4) + "</job_id>");
            out.println("</record>");
       }
       out.println("</result_set>");

       rs.close();
       stmt.close();
      conn.close();  
 }
 catch(Exception e){
       e.printStackTrace();  
 }
%>

요렇습돠~~!!

꼭..좀 갈켜주세요~~~^^
--------------------------------------------------------------------------------------------------
JSP페이지가 제대로 XML을 만들어내지 못해서 발생하는 에러입니다. JSP파일을 다시 살펴보세요
--------------------------------------------------------------------------------------------------
지나가다가 한마디.. 객체를 XML 로 만드는 여러가지 방법이 있는데 그중 Caster 라는 놈이 성능은 좀 떨어지나 사용하기 편하네요.. out.print 를 사용하는 것보단 객체를 가져와서 와그장창 XML 로 변환하심이 좋을듯 합니다.
--------------------------------------------------------------------------------------------------
음.. http://www.castor.org/xml-mapping.html 있습니다. 시간이 좀 걸리시더라도 문서를 숙지하시어 DB 결과를 자바객체에 담으시고 그 결과객체를 위 링크의 내용처럼 XML 로 변환하시면 좀더 유연해 지지 않을까 합니다.. 즐거운 프로그램 되세요
--------------------------------------------------------------------------------------------------
xml데이터에 특수문자가 포함된건 아닌지? &,<,>,',\
특수문자가 포함되어 있다면 변경해줘야 합니다.
html = replaceAll(str,"&","&");
html = replaceAll(html,"<","<");
html = replaceAll(html,">",">");
html = replaceAll(html,"'","&apos;");
html = replaceAll(html,"\"",""");

--------------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
을 jsp페이지에 가장위로 하세요.. 그럼 될거에요



httpservice에서 request보내었을때 돌아오는 값이 null이라서 에러 날때 처리법

음.. 글을 검색하다보니 답이있네요.

첨엔 try... catch를 쓸까 하다가

제 지론이 저건 헷갈리니까 쓰지말자... 여서 자바 공부할때부터 아예 저건 안봤거든요.

암튼.. 정녕 try... catch문을 써야되는가 고민했는데.... 문제해결 방안이 있네요.

..........................................................

1. 일단 리퀘스트 보내는 부분.

<!--문서카테고리 받아오기 리퀘스트-->
 <mx:HTTPService id="cateListRequest" url="http://localhost/sejin/backoffice/check_login.php"
  useProxy="false" method="POST" resultFormat="e4x">
  <mx:request xmlns="*">
   <proMode>cateRead</proMode>
   <cateOwner>{userId.text}</cateOwner>
  </mx:request>
 </mx:HTTPService>

2. 리퀘스트 받기가 성공하면...

//문서리스트 받기 성공 resultHandler
  private function docuListResultHandler(event:ResultEvent):void{
   //리스트 받기에서 돌아온 결과가 null값일 때의 처리
   var listResult:ArrayCollection = event.result.docs.doc as ArrayCollection
   //일단 받은 값을 ArrayCollection으로 처리
   if(listResult == null){ //널값이면 해당 폴더의 문서가 없다는 경고 발생
    mx.controls.Alert.show("지정하신 폴더의 문서는 존재하지 않습니다");
   } else{
    documents.dataProvider = docuListRequest.lastResult.docs.doc;
   }
  }

음...

그런데도 뭐 좀 짜잘한 에러는 계속 발생하는군요.. 계속 원인을 살펴봐야겠습니다.

------------------------------------------------------------------------------------------------
데이타그리드의 프로퍼티 dataProvider로 listResult 를 바인딩 시켜놓으면 null 값이라도 에러는 발생하지 않아용.. 그냥 참고하세용.. dg.dataProvider={listResult}


php에서 mysql로 검색한 몇 개의 칼럼값을 플렉스로 반환하고 싶은데 어떻게 해야 할지 가르쳐주세요

php에서  mysql로 검색한 몇 개의 칼럼값을  플렉스로 반환하거나

php에서 선언된 변수값을 플렉스로 반환하고 싶습니다.

데이터그리드로 받는방식말고 다른 방식은 없는지 가르쳐 주시면 감사하겠습니다.


id_searchRequest.php
<? //아이디 찾기
   Define( "DATABASE_SERVER", "localhost" );
   Define( "DATABASE_USERNAME", "root" );
   Define( "DATABASE_PASSWORD", "apmsetup" );
   Define( "DATABASE_NAME", "php_sample" );
 
   //DB
   $mysql = mysql_connect(DATABASE_SERVER, DATABASE_USERNAME, DATABASE_PASSWORD);
   mysql_select_db( DATABASE_NAME );
 

 if($_POST["username_s"] AND $_POST["emailaddress_s"])                                                    
{
        //$username = mysql_real_escape_string($_POST["username_s"]);
        //$emailaddress = mysql_real_escape_string($_POST["emailaddress_s"]);


 //별명과 이메일주소로 아이디가 존재하는지 검색
       $query2 = "SELECT * FROM joinjoin2 WHERE username = '$username_s' and emailaddress = '$emailaddress_s'";
       $result2 = mysql_fetch_array(mysql_query($query2));
}

$Return .= "<search_userid>";
  
  
   while ( $ser = mysql_fetch_object( $result2 ) )
   {
     $Return .= "
         <user>
        
   <userid>".$ser->userid."</userid>
  
         </user>";
   }

   $Return .= "</search_userid>";

   mysql_free_result( $result2 );
   print ($Return)
 ?>
///////////////////////////////////////////////////////////////////////

<?xml version="1.0" encoding="utf-8"?>
<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="600" height="326">


<mx:HTTPService id="id_searchRequest"
   result="id_search_re(event)" showBusyCursor="true" url="http://localhost/MainFlex/id_searchRequest.php" useProxy="false" method="POST">
 
      <mx:request xmlns="*">
        
         <username_s>{username_s.text}</username_s>
         <emailaddress_s>{emailaddress_s.text}</emailaddress_s>
        
      </mx:request>
</mx:HTTPService>


<mx:Script>
 <![CDATA[
  import mx.controls.Alert;
  private function id_searbtn():void{
   if(username_s.length==0) {
               Alert.show("별명을 입력하세요 !","Alert");
               username_s.focusEnabled=true;
           
             } else if(emailaddress_s.length==0) {
                Alert.show("이메일주소를 입력하세요 !","Alert");
                emailaddress_s.focusEnabled=true;
           
             } else {
              id_searchRequest.send();
              emailaddress_s.text="";
              username_s.text="";
             }
  }
 
  import mx.rpc.events.ResultEvent;
    
     //HTTPService id="id_searchRequest" result="id_search_re(event)"
      private function id_search_re(evt:ResultEvent):void
       {
          if(evt.result.search_userid.user.userid >= 0){
           id_sear1.text = evt.result.search_userid.user.userid;
        Alert.show("OK","Alert");
       }else if(evt.result.search_userid.user.userid == "no_search_userid"){
        Alert.show("에러!","Alert");
       }
     
       }
 ]]>
</mx:Script>
 <mx:Canvas id="kingcanvas" x="0" y="0" width="580" height="286">
  <mx:Canvas x="0" y="0" width="580" height="128">
   <mx:Text x="10" y="10" text="아이디 찾기" fontSize="14"/>
   <mx:Text x="67" y="38" text="별명" fontSize="12"/>
   <mx:TextInput x="144" y="38" id="username_s"/>
   <mx:Text x="67" y="81" text="이메일주소" fontSize="12"/>
   <mx:TextInput x="144" y="81" id="emailaddress_s"/>
   <mx:Button x="419" y="81" label="아이디 찾기" id="id_sear" fontSize="12" click="id_searbtn()"/>
   <mx:Text x="324" y="40" text="Text" width="225" id="id_sear1"/>
  </mx:Canvas>
  <mx:Canvas x="0" y="127" width="580" height="44">
   <mx:DataGrid x="90" y="0" height="44" dataProvider="{id_searchRequest.lastResult.search_userid.user}" width="346">
    <mx:columns>
     <mx:DataGridColumn headerText="ID" dataField="userid"/>
    </mx:columns>
   </mx:DataGrid>
  </mx:Canvas>
  <mx:Canvas x="0" y="169" width="580" height="117">
   <mx:Text x="10" y="10" text="비밀번호 찾기" fontSize="14"/>
   <mx:Text x="65" y="41" text="아이디" fontSize="12"/>
   <mx:TextInput x="142" y="39"/>
   <mx:Text x="65" y="67" text="비밀번호질문" fontSize="12"/>
   <mx:ComboBox x="142" y="65" width="275"></mx:ComboBox>
   <mx:Text x="65" y="93" text="질문의 답" fontSize="12"/>
   <mx:TextInput x="142" y="95"/>
   <mx:Button x="419" y="95" label="비밀번호 찾기" fontSize="12"/>
  </mx:Canvas>
 </mx:Canvas>
 
</mx:TitleWindow>




--------------------------------------------------------------------------------------------------
반응형
Posted by Real_G