dataProvider in flex
출처 : 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페이지만 실행해 봤는데....요렇게 에러메세지만 나오구요..
왕초보라서..도대체뭐가 문제인지 도무지 알수가 없습니다.
소스는요..
==================
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,"'","'");
html = replaceAll(html,"\"",""");
--------------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
을 jsp페이지에 가장위로 하세요.. 그럼 될거에요
음.. 글을 검색하다보니 답이있네요.
첨엔 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에서 선언된 변수값을 플렉스로 반환하고 싶습니다.
데이터그리드로 받는방식말고 다른 방식은 없는지 가르쳐 주시면 감사하겠습니다.
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>
--------------------------------------------------------------------------------------------------
'WebPrograming관련 > Adobe Flex' 카테고리의 다른 글
flex DataGrid에서 컬럼 포맷 바꾸기 (0) | 2007.08.10 |
---|---|
flex 연습중 찾은 글들. (0) | 2007.08.10 |
flex DataGrid에서 itemRenderer를 사용하면서의 경험 (0) | 2007.08.10 |