真才实料才是最真

Dream have no limit

统计

积分与排名

good link

最新评论

最简单的flex + java + mysql

第一步:创建数据库
第二步:在JAVA中编写获取公告的代码

首先,我们要创建一个公告类来专门保存获取的公告信息,代码如下。
NoticeInfo.java


package com;


public class NoticeInfo {
 
 private String userid;
 private String username;
 private String contents;
 private String dates;
 
 
 public String getContents() {
  return contents;
 }
 public void setContents(String contents) {
  this.contents = contents;
 }
 public String getDates() {
  return dates;
 }
 public void setDates(String dates) {
  this.dates = dates;
 }
 
 
 public String getUserid() {
  return userid;
 }
 public void setUserid(String userid) {
  this.userid = userid;
 }
 public String getUsername() {
  return username;
 }
 public void setUsername(String username) {
  this.username = username;
 }
 
 
}

创建好这个之后我们要创建一个数据查询类: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 com;

import java.sql.*;
import java.util.ArrayList;

import com.ConnectionFactory;

public class DataServiceImpl {
 
 String sql;  // 定义类型
 Connection conn = null;
 Statement stmt = null;
 ResultSet rs = null;
  
 public DataServiceImpl(){
  
 }
 
 
 public NoticeInfo[] getNotices(){
  
  ArrayList noticeList = new ArrayList();
  
  try{
   conn = ConnectionFactory.getConnection();
   stmt = conn.createStatement(); 
   
   String sql = "select userid, username, contents, dates from gbook ";
   System.out.println("this is =============>" + sql);
   System.out.println("connect to db is successful~~~");
   rs = stmt.executeQuery(sql);  
   
   
   while(rs.next()){
    
    NoticeInfo temp = new NoticeInfo(); 
    temp.setUserid(rs.getString("userid"));
    temp.setUsername(rs.getString("username"));
    temp.setContents(rs.getString("contents"));
    temp.setDates(rs.getString("dates"));
    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;
  }
 }

}

package com;

import java.sql.*; //调用SQL包

public class ConnectionFactory {

 private static ConnectionFactory ref = new ConnectionFactory();
 // 连接mysql数据库, database : test  user : root  password : 1272107226
 private ConnectionFactory()
 {
  try{
   Class.forName("com.mysql.jdbc.Driver");
  }catch(ClassNotFoundException e)
  {
   System.out.println("ERROR: exception loading driver class");
  }
 }
 public static Connection getConnection() throws SQLException{
  
  String url = new String ("jdbc:mysql://localhost:3306/test?user=root&password=1272107226");
  return DriverManager.getConnection(url);
 }
 
 public static void close(ResultSet rs)
 {
  try{
   rs.close();
  }catch(Exception ignored){}
 }
 public static void close(Statement stmt)
 {
  try{
   stmt.close();
  }catch(Exception ignored){}
 }
 public static void close(Connection conn)
 {
  try{
   conn.close();
  }catch(Exception ignored){}
 }
 
}

第三步: 配置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);
            }

  ]]>
 </mx:Script>
 
 <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="id" dataField="userid"/>
            <mx:DataGridColumn headerText="username" dataField="username"/>
            <mx:DataGridColumn headerText="contents" dataField="contents"/>
            <mx:DataGridColumn headerText="dates" dataField="dates"/>
        </mx:columns>
    </mx:DataGrid>

</mx:Application>

整个工程终于完成,启动JRUN or Tomcat,然后运行。结果如图所示:

posted on 2007-09-03 15:13 gavinkin555 阅读(5774) 评论(2)  编辑 收藏 引用 所属分类: FLEX

评论

# re: 最简单的flex + java + mysql 2015-12-03 11:53 张三

asczc  回复  更多评论   

只有注册用户登录后才能发表评论。