首先,做一点说明。Flex是不能直接连接数据库的,这一点大家需要知道,它只能间接地连
接数据库。Flex中提供了三种方式:HttpService,WebService和RemoteObject。其中
HttpService可以直接获取XML中的数据,还可以通过JSP,ASP以及PHP读取数据库中的
数据,这个比较简单,而且网上也有很多例子,我就不多说了。WebService我不懂,请自
己查资料。我一直用的是JAVA对象连接数据库,感觉这个挺方便,而且J2EE的技术已经
很成熟。今天的教程就是以Flex+JAVA+SQLServer获取数据库公告信息为例简单说一下
RemoteObject的用法。
前提
1.确保你安装了FlexDataService。这个对于单个CUP无限APP是免费的,可以去Adobe下
载。如果只是读取XML文件是不需要这个的,连接数据库就需要它了。
2.安装了FlexBuilder或者有FlexSDK。我这里使用的是FlexBuilder(IDE就是方便啊^_
^)。
3.安装了SQLServer数据库。
4.安装了JRUN或者tomcat或其它的J2EE容器,因为发的我的程要
J2EE上。
5.安装了JDK。
一:数据库
这里我有一个公告,为Bulletin。如下:
说明
ID自自
titleNvarchar(100)
datedatatime
authorNvarchar(20)者
contentntext容
数据库中这个。保?¢£?下一。
¥:JAVA中?获取公告的§currency1
首先,我要一个公告''“?保获取的公告信息,§currency1如下。
NoticeInfo.java
packagenet.zhuoqun.connectDB;
importjava.util.Date;
publicclassNoticeInfo{
privateStringtitle;//?
privateStringauthor;//者
privateStringcontent;//容
privateDatedates;//间
publicStringgetAuthor(){
returnauthor;
}
publicvoidsetAuthor(Stringauthor){
this.author=author;
}
………………//其它get和set方法。
}
?这个?¢我要一个数据查fi:DataServiceImpl.java''查fi数据库,fl查
fi果–?要的Flex程。?于我不·有多????,”以就?…一下JAVA
中的ArrayList这个,它‰于java.util中。先一个ArrayList:
ArrayListnoticeList=newArrayList();
查fi数据库?¢,?读取一???就`′noticeList。
while(rs.next()){
NoticeInfotemp=newNoticeInfo();
temp.setAuthor(rs.getString("author"));
temp.setContent(rs.getString("content"));
temp.setDates(rs.getDate("date"));
temp.setTitle(rs.getString("title"));
noticeList.add(temp);
}
查fi???¢你就可以ˉ这个noticeList–?去,你也可以–?去一个NoticeInfo数˙:
NoticeInfo[]notices=newNoticeInfo[noticeList.size()];
for(inti=0;i notices=(NoticeInfo)noticeList.get(i);
}
returnnotices;
我这里用的是¢一种方法。如果你直接ˉnoticeList–?去的¨,?一点,JAVA的
ArrayList的对象′了Flex中??成ArrayCollection的。
JAVA??的§currency1就??了。
DataServiceImpl.java的ˇ?§currency1如下:
packagenet.zhuoqun.connectDB;
importjava.sql.;
importjava.util.ArrayList;
importjava.util.Date;
publicclassDataServiceImpl{
privateConnectionconn=null;
privateStatementstmt=null;
//以下是数据库以及—信息
publicfinalstaticStringDRIVER="com.microsoft.jdbc.sqlserver.SQLServerDriver";
publicfinalstaticStringCONN_STR_PRE="jdbc:microsoft:sqlserver://";
publicfinalstaticStringHOST_NAME="localhost:1433;";
publicfinalstaticStringDATABASE_NAME="DatabaseName=mydata";
publicfinalstaticStringUSERNAME="aaa";
publicfinalstaticStringPASSWORD="aaa";
publicDataServiceImpl(){
}
//查fi数据库
privateResultSetexecuteQuery(StringsqlText){
try{
Class.forName(DRIVER);
}catch(ClassNotFoundExceptione){
e.printStackTrace();
}
try{
conn=DriverManager.getConnection(CONN_STR_PRE+HOST_NAME+
DATABASE_NAME,USERNAME,PASSWORD);
stmt=conn.createStatement();
ResultSetrs=stmt.executeQuery(sqlText);
returnrs;
}catch(SQLExceptione){
e.printStackTrace();
}
returnnull;
}
//查fi公告.这个是程的§currency1
publicNoticeInfo[]getNotices(){
ArrayListnoticeList=newArrayList();
StringsqlText="selectauthor,content,date,titlefromBulletin";
ResultSetrs=executeQuery(sqlText);
try{
while(rs.next()){
NoticeInfotemp=newNoticeInfo();
temp.setAuthor(rs.getString("author"));
temp.setContent(rs.getString("content"));
temp.setDates(rs.getDate("date"));
temp.setTitle(rs.getString("title"));
noticeList.add(temp);
}
NoticeInfo[]notices=newNoticeInfo[noticeList.size()];
for(inti=0;i notices=(NoticeInfo)noticeList.get(i);
}
returnnotices;
}catch(SQLExceptione){
e.printStackTrace();
returnnull;
}
}
}
三:FlexDataService
1,ˉ?的JAVA文件。FDS的安装文件,的文件
′\jrun4\servers\default\flex\WEB-INF\classes文件中,£下的。
2.FDS的安装文件。£?jrun4\servers\default\flex\WEB-INF\flex?。里是于
FlexDataService的文件,我这里只RemoteObject如,其它信息请自己
?…。我里的remoting-config.xml文件。里`如下信息,为
的子?a:
程§currency1
你了destination的,你就用了了可以用''连接??的信息通道
(messagingchannel)。它的id?o文件中是一无¥的。source是你的JAVA
classes文件中的?。?于我的DataServiceImplclasses\net\zhuoqun\connectDB
中,”以source的为net.zhuoqun.connectDB.DataServiceImpl。?,不要?.class¢。
?a还可以有一个子?a,其用我这里就不说了,大家自己?
文(于FDS的其?有很多,这??…文里?有,我这里不多说了,
也说不过'',自己?)。
我已经?了¢的FDS,做?了?个程的大??,接下''就是前Flex
程用的了。
四:Flex程
FlexBuilder,新一个程ConnectDB。菜单栏中File->New->FlexProject,这?
弹出一个对¨框,选择FlexDataService,了一个Flex程。
五:通过RemoteObject访问数据库
程中生成的主文件ConnectDB.mxml,声明一个RemoteObject:
程§currency1
destination="dataService"result="proccessResult(event.result)"fault="Alert.show(event.fault.fault
String,''Error'')"/>
其中destination的是我FDS的的destination。result示这个
RemoteObject成功返??¢”要做的,这里我用一个方法proccessResult()''处理
返?的数据,它的参数event.result就是从服务器获得的数据,数据是为一个对象–过
''的。fault示这个RemoteObject请求失败要做的处理,这里我?弹出一个显示错
误信息的对¨框。接下''我要声明一个DataGrid控件''显示公告的?和发:
程§currency1
labelFunction="formatDate"/>
其中headerText是显示上方的头,dataField示要显示的数据域,为什么数据域是
title和dates呢?因为我–?的是一个NoticeInfo对象数˙,虽然它是为一个对象–?
''的,但是其中的数据fl没有?,那?数据域的也没有?,”以我可以根据
NoticeInfo中的?量dataField。labelFunction是用''格式化显示的,因为–?''的
是格林威治间,”以我需要其格式化然¢显示出''。注意,这里只是显示两个数据
域,fl不§其它的数据?没有了,它仍然,只是没有显示出''。
接下'',?a中?proccessResult()方法和格式化的formatDate方法:
程§currency1
privatefunctionproccessResult(result:Object):void
{
myDG.dataProvider=ArrayUtil.toArray(result);
}
privatefunctionformatDate(item:Object,column:DataGridColumn):String
{
returndf.format(item.dates);
}//df是一个DateFormatter,下??出。于如格式化DataGrid的显示
//以及DateFormatter这里就不讨论了,?…里?得很·
这个函数只是简单地获得的数据–?myDG的dataProvider。result的是Object,因
为数据是为一个对象–过''的。?”以用ArrayUtil.toArray()这个方法,是因为返?的
??可能只有一?,而myDG的dataProvider显示单个对象的可能?出错,”以安ˇ
起见先其转换成数˙。
最¢,我?用RemoteObject的方法,使其程启就用。
程§currency1
privatefunctioninitApp():void
{
getData.getNotices();
}
其中getData是RemoteObject的id,getNotices()是DataServiceImpl.java中的方法。这里
可以直接用它。然,如果DataServiceImpl.java有其它方法,也可以通过这种方式直接
用。接下''˙件??用initApp()方法,中`一个
creationComplete:
程§currency1
creationComplete="initApp()">
ConnectDB.mxml的ˇ?§currency1:
程§currency1
creationComplete="initApp()">
importmx.controls.Alert;
importmx.utils.ArrayUtil;
privatefunctioninitApp():void
{
getData.getNotices();
}
privatefunctionproccessResult(result:Object):void
{
myDG.dataProvider=ArrayUtil.toArray(result);
}
privatefunctionformatDate(item:Object,column:DataGridColumn):String
{
returndf.format(item.dates);
}//df是一个DateFormatter,下??出。于如格式化DataGrid的显示
//以及DateFormatter这里就不讨论了,?…里?得很·
]]>
destination="dataService"result="proccessResult(event.result)"fault="Alert.show(event.fault.fault
String,''Error'')"/>
labelFunction="formatDate"/>
?个程终于?成,启JRUN,然¢程,查程果
如果是其他数据库,只需要改一下数据库—信息就可以了
|
|