国庆闲来无事,拿出原来下来的FDS(Flex Data Service,现改名为LiveCycle Data Services)的Express版安安,顺便编点儿小程序,期望能体验一下FDS2.0及AS3.0的改进所带来的一些快感。
本以为有丰富Flex1.5编程经验的我会信手拈来,没想到还是碰到了不少的麻烦事,把此次经历记录下来,也好给大伙儿一个借鉴。
首先介绍一下我的环境:
操作系统:Windows Vista HomeBase(笔记本上自带的)
Eclipse:3.3
数据库:MS SQL Express
应用服务器:JBoss4.0.5GA
登录用户:Administrator(主要是嫌Vista的UCA控制麻烦)
呵呵,全是正版或是免费的,这年头不太赶用盗版的,怕麻烦。
首先下一个FlexBuilder2.01,安上,试用31天,呵呵,先试着用吧,反正又不真用这个来编程。
首次安装就出现问题了,呵呵,解压后提示用户不属于PowerUser组,第一次就碰了个钉子。点右键,以管理员身份运行,OK,可以安装了。
为了能够享受Eclipse中的各项功能,故选择PlugIn方式安装。选择Eclipse目录时安装过不去,虽然当时的安装界面上的提示是3.1或以上版本的Eclipse,看来还只能是用Eclipse3.1版的才行。
没办法,又下了一个Eclipse3.1.2,另外下了个Lomoboz插件(主要为后面可以创建动态Web工程时用)。一切OK,顺利安完。
第一步就有点儿不太顺,看来下一步就更要小心了。
运行FlexBuilder,在Licence界面上点Try,反正试用嘛,倒也无所谓了。
一切正常,安装成功。
现在开始进入主题了,安装FDS,选择安装至J2EE服务器选项,一切正常,顺利安装完成。虽然是双核CPU,但运行Express版的FDS时倒也不会有什么问题。
下一步要配FDS环境到服务器上了,根据安装教程将flex-tomcat-common.jar及flex-tomcat-server.jar文件复制到Jboss安装目录下的Server/Default/lib目录下。
把Flex.war,Flex-admin.war及Samples.war文件复制入Server/Default/deploy目录下。
OK,Run启动应用服务器。
¥%……%——……%,一堆的异常。
还是慢慢来吧,首先是初始化失败,java.lang.NoSuchFieldError: ANY_HOST_CONFIGURATION。
这是怎么回事儿呢?Google了一番,说是Common-httpclient.jar文件的版本太低了。OK,上Apache站点上下个最新的来,替换掉Flex.war和Samples.war中的文件。
热部署,问题依旧。:(。干脆一不做二不休,备份好JBoss服务器中的相关内容后,连着Default/lib中的相关文件也替换了。
还是不行……
重装一下试试,这回选择集成JRun版本。安装完成,运行JRun,通过Http://localhost:8700/Flex验证安装结果,一切正常。看来问题还是出在Common-httpclient.jar身上。
复制出Flex.war中的Common-httpclient.jar文件,替换了Jboss中Client目录及Default/lib目录下的相关文件。
重启服务器。终于正常了。:)
看来,Java的Jar问题跟MS当年的DLL问题一样严重啊。
开始做点东西玩玩。打开FlexBuilder
1.新建一个动态WEB工程;
2.将Flex的WEB-INF和META-INF文件导入当时工程;
3.在工程名中点击右键,选择Flex Project Nature菜单,因为习惯在Server端编译MXML文件(图改起来和部署方便),故而选择Add Flex Project Nature(Compile on server)选项。
OK,一切就绪。
先写个连接程序。
建立一个数据库包zag.db,写入相应的ConnectionDB类,主要就是返回个数据库连接。
建立一个数据库应用包zag.usedb,写入相应的FindPY类,主要是通过数据库连接返回个表的全部内容。
代码如下:
public class FindPY {
public List getFindPY() throws Exception{
ArrayList alret=new ArrayList();
Connection conn=ConnectionDB.getConnection();
try{
Statement st=conn.createStatement();
ResultSet rs=st.executeQuery("select CHINESE,LETTER from tabfindpy");
while(rs.next()){
HashMap hm=new HashMap();
hm.put("chn",rs.getString(1).trim());
hm.put("letter",rs.getString(2).trim());
alret.add(hm);
}
if(rs!=null)rs.close();
if(st!=null)st.close();
}catch(Exception ex){
ex.printStackTrace();
}finally{
if(conn!=null)conn.close();
}
return alret;
}
}
因为这张表是一张引用表,习惯了用EJB3的那套来做了,所以用了一个HashMap来接收相应的值,这样做主要是返回值可以十分方便的组合成Array,可以在前台编程中省去不少麻烦。
OK,在WebConcent目录下新建一个FlexApplication,取名Test01,在新建时最好不要自动转换到FlexBuilder视图,把Flex的几个窗口在J2EE视图下打开,这样编程和前台设计都方便。
代码如下:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:RemoteObject destination="findpy" id="fp" showBusyCursor="true" >
<mx:method name="getFindPY" result="getFP(event);" />
</mx:RemoteObject>
<mx:Script>
<![CDATA[
import mx.rpc.events.ResultEvent;
import mx.controls.Alert;
private function getFP(event:ResultEvent):void{
var res:Object=event.result;
dgFP.dataProvider=res;
}
]]>
</mx:Script>
<mx:DataGrid id="dgFP" x="10" y="36" width="596" height="315">
<mx:columns>
<mx:DataGridColumn headerText="chn" dataField="chn"/>
<mx:DataGridColumn headerText="letter" dataField="letter"/>
</mx:columns>
</mx:DataGrid>
<mx:Button x="10" y="10" label="检索" click="fp.getFindPY();"/>
</mx:Application>
这回就要配置RemoteObject引用了。打开WEB-INF/Flex目录下的remoting-config.xml文件。在其中加上:
<destination id="findpy">
<properties>
<source>zag.testdb.FindPY</source>
</properties>
</destination>
OK,增加JBoss服务器。右键单击工程,选择Run As下的Run on Server,部署,运行……
系统将出现如下界面。
OK,点击检索按钮。呵呵,结果出来了。终于搞定了。
通过以上方法来创建工程,最大的好处是即可以保持原来WEB开发的习惯,同样也可以使用FlexBuilder所见即所得的编辑功能。
希望这些经历能对Flex2的使用者们有些帮助。