设为首页 收藏本站
查看: 710|回复: 0

[经验分享] 使用Flex+JavaBean连接SQL Server数据库

[复制链接]

尚未签到

发表于 2016-11-5 10:30:21 | 显示全部楼层 |阅读模式
<!-- Feedsky FEED发布代码开始 -->欢迎点击此处订阅本Blog<!-- FEED自动发现标记开始 --><link title="RSS 2.0" type="application/rss+xml" href="http://feed.feedsky.com/softwave" rel="alternate"><!-- FEED自动发现标记结束 --> DSC0000.gif

<!--Google 468*60横幅广告开始--><script type="text/javascript"><!--google_ad_client = "pub-7343546549496470";google_ad_width = 468;google_ad_height = 60;google_ad_format = "468x60_as";google_ad_type = "image";//2007-07-26: CSDNgoogle_ad_channel = "6063905817";google_color_border = "6699CC";google_color_bg = "E6E6E6";google_color_link = "FFFFFF";google_color_text = "333333";google_color_url = "AECCEB";google_ui_features = "rc:6";//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script><!--Google 468*60横幅广告结束-->

首先,做一点说明。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。

第一步:创建数据库
这里我们有一个公告表,表名为Bulletin。结构如下:
字段名称   字段类型    说明
ID    自动编号    自动编号
title   Nvarchar(100)  题目
date    datatime   日期
author   Nvarchar(20)  作者
contents  ntext      内容
在数据库中创建这个表。保存之后进入下一步。

第二步:在JAVA中编写获取公告的代码
首先,我们要创建一个公告类来专门保存获取的公告信息,代码如下。
NoticeInfo.java

  • packagenet.zhuoqun.connectDB;
  • importjava.util.Date;
  • publicclassNoticeInfo{
  • privateStringtitle;//标题
  • privateStringauthor;//作者
  • privateStringcontent;//内容
  • privateDatedates;//时间
  • publicStringgetAuthor(){
  • returnauthor;
  • }
  • publicvoidsetAuthor(Stringauthor){
  • this.author=author;
  • }
  • ………………//其它get和set方法。
  • }

创建好这个之后我们要创建一个数据查询类:DataServiceImpl.java来查询数据库,并将查询结果传给将要创建的Flex程序。由于我们不清楚有多少条记录,所以就借助一下JAVA中的ArrayList这个类,它位于java.util 包中。先创建一个ArrayList:
ArrayList noticeList = new ArrayList();
查询数据库之后,每读取一条记录就添加到 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);
  • }

查询完毕之后你就可以把这个noticeList传回去,你也可以传回去一个 NoticeInfo 数组:

  • NoticeInfo[]notices=newNoticeInfo[noticeList.size()];
  • for(inti=0;i<noticeList.size();i++){
  • notices=(NoticeInfo)noticeList.get(i);
  • }
  • returnnotices;

我这里用的是后一种方法。如果你直接把noticeList传回去的话,记住一点,JAVA的ArrayList类型的对象到了Flex中会变成ArrayCollection类型的。

现在JAVA部分的代码就写好了。
DataServiceImpl.java 的全部代码如下:

  • 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(){

  • }
  • //查询数据库
  • 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;
  • }
  • //查询公告.这个是本程序的关键代码
  • 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<noticeList.size();i++){
  • notices=(NoticeInfo)noticeList.get(i);
  • }
  • returnnotices;
  • }catch(SQLExceptione){
  • e.printStackTrace();
  • returnnull;
  • }
  • }
  • }

第三步: 配置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>的子标签:
程序代码

  • <destinationid="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工程。

第五步:通过 RemoteObject 访问数据库
打开工程中生成的主文件 ConnectDB.mxml,声明一个 RemoteObject :
程序代码

  • <mx:RemoteObjectid="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:DataGridid="myDG">
  • <mx:columns>
  • <mx:DataGridColumnheaderText="标题"dataField="title"/>
  • <mx:DataGridColumnheaderText="发布日期"dataField="dates"labelFunction="formatDate"/>
  • </mx:columns>
  • </mx:DataGrid>

其中headerText是显示在上方的表头,dataField表示要显示的数据域,为什么数据域是title和dates呢?因为我们传回的是一个NoticeInfo 对象数组,虽然它是作为一个对象传回来的,但是其中的数据结构并没有变,那些数据域的名字也没有变,所以我们可以根据NoticeInfo 中的变量设定dataField。labelFunction属性是用来格式化显示的,因为传回来的是格林威治时间,所以我们需要将其格式化然后显示出来。注意,这里只是显示两个数据域,并不代表其它的数据都没有了,它们仍然存在,只是没有显示出来。
接下来,在 <mx:Script> 标签中编写proccessResult()方法和格式化日期的 formatDate方法:
程序代码

  • 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 的方法,使其在程序启动时就调用。
程序代码

  • privatefunctioninitApp():void
  • {
  • getData.getNotices();
  • }

其中 getData 是RemoteObject的id,getNotices()是DataServiceImpl.java中的方法。在这里可以直接调用它。当然,如果DataServiceImpl.java有其它方法,也可以通过这种方式直接调用。接下来设定组件创建完毕时调用 initApp()方法,在<mx:Application>中添加一个creationComplete属性:
程序代码

  • <mx:Applicationxmlns:mx="http://www.adobe.com/2006/mxml"fontSize="12"creationComplete="initApp()">

ConnectDB.mxml的全部代码:
程序代码

  • <?xmlversion="1.0"encoding="utf-8"?>
  • <mx:Applicationxmlns:mx="http://www.adobe.com/2006/mxml"fontSize="12"creationComplete="initApp()">
  • <mx:Script>
  • <![CDATA[
  • 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这里就不讨论了,帮助里写得很清楚
  • ]]>
  • </mx:Script>
  • <mx:DateFormatterid="df"formatString="YYYY-MM-DD"/>
  • <mx:RemoteObjectid="getData"destination="dataService"result="proccessResult(event.result)"fault="Alert.show(event.fault.faultString,'Error')"/>
  • <mx:DataGridid="myDG">
  • <mx:columns>
  • <mx:DataGridColumnheaderText="标题"dataField="title"/>
  • <mx:DataGridColumnheaderText="发布日期"dataField="dates"labelFunction="formatDate"/>
  • </mx:columns>
  • </mx:DataGrid>
  • </mx:Application>

整个工程终于完成,启动JRUN,然后运行程序,查看程序结果。如果是其他数据库,只需要改一下数据库驱动信息就可以了。

<!--新Google 468*60横幅广告开始--><script type="text/javascript"><!--google_ad_client = "pub-7343546549496470";/* 468x60, 创建于 08-8-6 */google_ad_slot = "7368701459";google_ad_width = 468;google_ad_height = 60;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script><!--新Google 468*60横幅广告结束-->

<!--新Google 468x15 横链接单元开始--><script type="text/javascript"><!--google_ad_client = "pub-7343546549496470";/* 468x15 横链接单元 */google_ad_slot = "5785741422";google_ad_width = 468;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script><!--新Google 468x15 横链接单元结束-->

<!-- Google Reader shared发布代码开始 --><script type="text/javascript" src="http://www.google.com/reader/ui/publisher.js"></script><script type="text/javascript" src="http://www.google.com/reader/public/javascript/user/00697638153916680411/state/com.google/broadcast?n=5&amp;callback=GRC_p(%7Bc%3A%22green%22%2Ct%3A%22%5Cu8FD9%5Cu4E9B%5Cu6587%5Cu7AE0%5Cu4E5F%5Cu503C%5Cu5F97%5Cu4E00%5Cu770B%22%2Cs%3A%22false%22%7D)%3Bnew%20GRC"></script><!-- Google Reader shared发布代码结束 -->

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-296093-1-1.html 上篇帖子: sql分页 下篇帖子: SQL Server错误代码及解释(留着备用)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表