Flex 如何使用JAVA对象连接SQLServer数据库(转载)

以前我刚开始接触Flex1.5的时候怎么都不明白Flex是如何连接数据库的,虽然知道有三种方式,但还是不懂,这个问题让我头痛了好长时间,后来终于恍然大悟。今天写一篇如何在Flex中使用RemoteObject利用JAVA对象连接数据库的教程,给初学者做参考,高手就不需要看了。 首先,做一点说明。Flex是不能直接连接数据库的,这一点大家需要知道,它只能间接地连接数据库。Flex中提供了三种方式:HttpService,WebService 和 RemoteObject。其中HttpService可以直接获取XML中的数据,还可以通过JSP,ASP以及PHP读取数据库中的数据,这个比较简单,而且网上也有很多例子,我就不多说了。WebService我不懂,请自己查资料。我一直用的是JAVA对象连接数据库,感觉这个挺方便,而且J2EE的技术已经很成熟。今天的教程就是以 Flex + JAVA + SQLServer 获取数据库公告信息为例简单说一下RemoteObject的用法。 前提 1.确保你安装了Flex Data Service。这个对于单个CUP无限APP是免费的,可以去 Adobe下载。如果只是读取XML文件是不需要这个的,连接数据库就需要它了。 2.安装了Flex Builder或者有Flex SDK。我这里使用的是Flex Builder(IDE就是方便啊 ^_^)。 3.安装了SQLServer数据库。 4.安装了JRUN或者tomcat或其它的J2EE容器,因为发布的时候我们的程序要运行在J2EE平台上。 5.安装了JDK。 JDK版本问题:由于我用的是Flex Data Service自带的JRUN,它不支持JDK5.0,所以我用的是JDK1.4.2,版本问题大家看具体情况来。 第一步:创建数据库 这里我们有一个公告表,表名为Bulletin。结构如下:
程序代码 程序代码
字段名称    字段类型            说明 ID              自动编号          自动编号 title            Nvarchar(100)    题目 date          datatime                日期 author       Nvarchar(20)      作者 contents    ntext                内容
在数据库中创建这个表。保存之后进入下一步。 第二步:在JAVA中编写获取公告的代码 首先,我们要创建一个公告类来专门保存获取的公告信息,代码如下。 NoticeInfo.java
程序代码 程序代码
package net.zhuoqun.connectDB; import java.util.Date; public class NoticeInfo {     private String title;        // 标题     private String author;  // 作者     private String content;// 内容     private Date dates;       // 时间          public String getAuthor() {         return author;     }     public void setAuthor(String author) {         this.author = author;     }     ……………… // 其它get 和 set 方法。 }
创建好这个之后我们要创建一个数据查询类:DataServiceImpl.java 来查询数据库,并将查询结果传给将要创建的Flex程序。由于我们不清楚有多少条记录,所以就借助一下JAVA中的ArrayList这个类,它位于java.util 包中。先创建一个ArrayList:
程序代码 程序代码
ArrayList noticeList = new ArrayList(); // 这里我没有用泛型,因为我用的JDK1.4.2.
查询数据库之后,每读取一条记录就添加到 noticeList。
程序代码 程序代码
while(rs.next()){     NoticeInfo temp = new NoticeInfo();     temp.setAuthor(rs.getString("author"));     temp.setContent(rs.getString("content"));     temp.setDates(rs.getDate("date"));     temp.setTitle(rs.getString("title"));     noticeList.add(temp); }
查询完毕之后你就可以把这个noticeList传回去,你也可以传回去一个 NoticeInfo 数组:
程序代码 程序代码
NoticeInfo[] notices = new NoticeInfo[noticeList.size()]; for(int i=0;i<noticeList.size();i++){     notices[i] = (NoticeInfo)noticeList.get(i); } return notices;
我这里用的是后一种方法。如果你直接把noticeList传回去的话,记住一点,JAVA的ArrayList类型的对象到了Flex中会变成ArrayCollection类型的。 现在JAVA部分的代码就写好了。 DataServiceImpl.java 的全部代码如下:
程序代码 程序代码
package net.zhuoqun.connectDB; import java.sql.*; import java.util.ArrayList; import java.util.Date; public class DataServiceImpl {          private Connection conn = null;     private Statement stmt = null;     // 以下是数据库以及驱动信息     public final static String DRIVER = "com.microsoft.jdbc.sqlserver.SQLServerDriver";     public final static String CONN_STR_PRE = "jdbc:microsoft:sqlserver://";     public final static String HOST_NAME = "localhost:1433;";     public final static String DATABASE_NAME = "DatabaseName=mydata";     public final static String USERNAME = "aaa";     public final static String PASSWORD = "aaa";          public DataServiceImpl(){              }     // 查询数据库     private ResultSet executeQuery(String sqlText){         try{             Class.forName(DRIVER);         }catch(ClassNotFoundException e){             e.printStackTrace();         }         try{             conn = DriverManager.getConnection(CONN_STR_PRE + HOST_NAME + DATABASE_NAME, USERNAME, PASSWORD);             stmt = conn.createStatement();             ResultSet rs = stmt.executeQuery(sqlText);             return rs;         }catch(SQLException e){             e.printStackTrace();         }         return null;     }     // 查询公告. 这个是本程序的关键代码     public NoticeInfo[] getNotices(){         ArrayList noticeList = new ArrayList();                  String sqlText = "select author,content,date,title from Bulletin";                  ResultSet rs = executeQuery(sqlText);                  try{             while(rs.next()){                 NoticeInfo temp = new NoticeInfo();                 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 = new NoticeInfo[noticeList.size()];             for(int i=0;i<noticeList.size();i++){                 notices[i] = (NoticeInfo)noticeList.get(i);             }             return notices;         }catch(SQLException e){             e.printStackTrace();             return null;         }     } }
第三步: 配置Flex Data Service 1,把刚才写的JAVA文件编译。打开FDS的安装文件夹,将编译的文件拷贝到/jrun4/servers/default/flex/WEB-INF/classes 文件夹中,进行下面的配置。 2.打开FDS的安装文件夹。进入 jrun4/servers/default/flex/WEB-INF/flex 目录。里面是关于Flex Data Service 的配置文件,我们这里只看RemoteObject如何配置,其它配置信息请自己看帮助。现在我们打开里面的 remoting-config.xml 文件。向里面添加如下信息,作为<service>的子标签:
程序代码 程序代码
<destination id="dataService">      <properties>           <source>net.zhuoqun.connectDB.DataServiceImpl</source>      </properties> </destination>
当你设定了 destination 的时候,你就引用了了可以用来连接相应类的信息通道(messaging channel)。它的 id 必须在文件中是独一无二的。 source属性是指你编译的JAVA类在classes文件夹中的路径。由于我的DataServiceImpl类在classes/net/zhuoqun/connectDB中,所以source的值为net.zhuoqun.connectDB.DataServiceImpl。记住,不要写.class后缀。<properties> 标签还可以有一个<scope>子标签,其作用我在这里就不说了,大家自己看相关文档(关于FDS的配置其实有很多东西,这些在帮助文档里都有,我这里不多说了,也说不过来,自己看吧)。 现在我们已经配置好了后台的 FDS,做完了整个程序的大部分工作,接下来就是前台Flex程序调用的事情了。 第四步:创建Flex程序 打开Flex Builder,新建一个工程 ConnectDB。菜单栏中 File -> New -> Flex Project,这时会弹出一个对话框,选择 Flex Data Service最下面的,如图: 其中还有两个编译选项,分别是“在Flex Builder中本地编译”(编译成SWF和HTML页放到服务器)和“当用户浏览页面时再编译”,你可以根据需要选择,这里我们选择第一个。 接下来设置FDS服务器的根目录和路径: 输入工程的名称和目录: 然后点击下一步设定类路径以及输出文件夹等等: 这些都设定好之后点击 完成 就创建了一个Flex工程。 第五步:通过 RemoteObject 访问数据库 打开工程中生成的主文件 ConnectDB.mxml,声明一个 RemoteObject :
程序代码 程序代码
<mx:RemoteObject id="getData" destination="dataService" result="proccessResult(event.result)" fault="Alert.show(event.fault.faultString,'Error')"/>
其中 destination 的值是刚才我们在配置 FDS 的时候设定的 destination。 result 表示在这个RemoteObject 成功返回之后所要做的动作,这里我们调用一个方法 proccessResult()来处理返回的数据,它的参数 event.result 就是从服务器段获得的数据,数据是作为一个对象传过来的。 fault 表示在这个RemoteObject请求失败时要做的处理,这里我们会弹出一个显示错误信息的对话框。接下来我们要声明一个DataGrid控件来显示公告的标题和发布日期:
程序代码 程序代码
<mx:DataGrid id="myDG">     <mx:columns>         <mx:DataGridColumn headerText="标题" dataField="title"/>         <mx:DataGridColumn headerText="发布日期" dataField="dates" labelFunction="formatDate"/>     </mx:columns> </mx:DataGrid>
其中headerText是显示在上方的表头,dataField表示要显示的数据域,为什么数据域是title和dates呢?因为我们传回的是一个 NoticeInfo 对象数组,虽然它是作为一个对象传回来的,但是其中的数据结构并没有变,那些数据域的名字也没有变,所以我们可以根据 NoticeInfo 中的变量设定dataField。labelFunction 属性是用来格式化显示的,因为传回来的是格林威治时间,所以我们需要将其格式化然后显示出来。注意,这里只是显示两个数据域,并不代表其它的数据都没有了,它们仍然存在,只是没有显示出来。 接下来,在 <mx:Script> 标签中编写proccessResult()方法和格式化日期的 formatDate方法:
程序代码 程序代码
private function proccessResult(result:Object):void {     myDG.dataProvider = ArrayUtil.toArray(result); } private function formatDate(item:Object,column:DataGridColumn):String {     return df.format(item.dates); }    // df 是一个 DateFormatter,在下面会给出。关于如何格式化DataGrid的显示     // 以及DateFormatter这里就不讨论了,帮助里写得很清楚
这个函数只是简单地将获得的数据传给 myDG 的 dataProvider。result 的类型是Object,因为数据是作为一个对象传过来的。之所以调用 ArrayUtil.toArray() 这个方法,是因为返回的记录可能只有一条,而myDG 的 dataProvider显示单个对象的时候可能会出错,所以安全起见先将其转换成数组。 最后,我们编写调用 RemoteObject 的方法,使其在程序启动时就调用。
程序代码 程序代码
private function initApp():void {       getData.getNotices(); }
其中 getData 是RemoteObject的 id,getNotices()是DataServiceImpl.java中的方法。在这里可以直接调用它。当然,如果DataServiceImpl.java有其它方法,也可以通过这种方式直接调用。接下来设定组件创建完毕时调用 initApp()方法,在 <mx:Application>中添加一个creationComplete属性:
程序代码 程序代码
<mx:Application xmlns:mx=" http://www.adobe.com/2006/mxml" fontSize="12" creationComplete="initApp()"> ……………………
ConnectDB.mxml的全部代码:
程序代码 程序代码
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx=" http://www.adobe.com/2006/mxml" fontSize="12" creationComplete="initApp()">     <mx:Script>         <![CDATA[             import mx.controls.Alert;                          import mx.utils.ArrayUtil;                          private function initApp():void             {                 getData.getNotices();             }             private function proccessResult(result:Object):void             {                 myDG.dataProvider = ArrayUtil.toArray(result);             }             private function formatDate(item:Object,column:DataGridColumn):String             {                 return df.format(item.dates);             }// df 是一个 DateFormatter,在下面会给出。关于如何格式化DataGrid的显示             // 以及DateFormatter这里就不讨论了,帮助里写得很清楚         ]]>     </mx:Script>                 <mx:DateFormatter id="df" formatString="YYYY-MM-DD"/>     <mx:RemoteObject id="getData" destination="dataService" result="proccessResult(event.result)" fault="Alert.show(event.fault.faultString,'Error')"/>          <mx:DataGrid id="myDG">         <mx:columns>             <mx:DataGridColumn headerText="标题" dataField="title"/>             <mx:DataGridColumn headerText="发布日期" dataField="dates" labelFunction="formatDate"/>         </mx:columns>     </mx:DataGrid> </mx:Application>
整个工程终于完成,启动JRUN,然后运行。结果如图所示: 需要注意的地方: 1.注意你的 JRUN 或者其它容器对JDK版本的支持,不小心就会出错。 2.在运行时如果控制台出现了 找不到/messagebroker/amf文件 的错误,请看我以前找到的解决办法: http://www.zhuoqun.net/article.asp?id=180 3.运行的时候如果是获取数据出错的,控制台一般都会有提示信息,可以给你很多提示。 总结 这篇简单的教程算是给一些 Flex 的初学者一个入门,我技术也有限得很,写得不好,勿怪。另外限于篇幅,很多细节方面我都没有写出来,如果有什么看不明白的就去看帮助文档,那是最好的教科书。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值