我的flex第一步

FLex 的 Remote Object 之我的实践 (详细教程看我上传的文档)
正文:
一.环境和工具:
           Jdk1.6.0
           MyEclipse6.5和FlexBuilder3 beta2 插件版
           Tomcat 6.0
           lcds251(全称为:Flex Data Service
下载地址:http://www.adobe.com/cfusion/tdrc/index.cfm?product=flex)
           Windows XP SP2

二.开发前的准备:
下载lcds并安装(注意:由于我使用了Tomcat6.0,所以安装时我选择的是Flex Data Services J2EE web application这一选项,如果选择了JRun的下面的配置可以省去JRun自带Tomcat的).
进入安装目录,将flex.war,samples.war和flex-admin.war拷贝到Tomcat的webapps下,启动tomcat会自动解压的.
   如图所示:



(3)为了让Tomcat能与FDS共同工作,还必须安装JOTM(Java Open Transaction Manager)下载地址:http://jotm.objectweb.org/download/index.html(目前的版本是:2.0.10) 下载后解压,将其中lib 目录下的jar文件(13个)全部拷贝到Tomcat的lib目录中.这样,Tomcat就能够解析编译MXML文件,并支持Remoting通信.

三.入门教程
1. 新建FlexLCDS工程
        File -> new -> Flex Project …
        注:以下设置绝大多数都可以在项目属性中可以修改。
. 向导界面


说明:Java source folder就是你自己java业务源码存放的根目录,在FB3里,LCDS项目旨在将Java J2ee项目和FlexLcds项目混合。

当然如果你不选择 combined 两个在一起,那么就麻烦些:要么你再单独新建一个Flex项目,而这个项目只写java代码。要么再建一个J2ee工程写java代码,而这个项目只写Flex代码,但最后要把Java编译后的class文件放到这个项目下的webroot\web-inf\classes目录中。即不管怎样,最后发布时,java编译后的class文件必须和lcds部署的项目在一起。(听起来绕昏头了?那就在一个工程里吧)

2). 向导界面2

说明:Target runtime实际上没什么用(后来我删除了配置文件里的对应信息,也没问题),但是不指定就不能继续,如果这里显示的是<none>那么就新建一个Tomcat的runtime,简单的只需要指定tomcat的安装目录即可。

Content folder实际上就是最终编译后的容器目录,因此,Lcds的flex.war文件将会发布到 该目录 下的web-inf下的flex目录中。同时因为教程采用的是MyEclipse,他默认的就是发布WebRoot里的内容,为了自动化,因此这里改为了WebRoot(这也是java开发的习惯)

Flex WAR file 指的是安装了lcds后的flex.war文件的路径

Compilation options指定了flex文件的编译方式,选择推荐的在FlexBuilder里编译吧,虽然开发时多耗点时间,但是在发布后不会占用服务器的编译处理时间,对用户来说是有好处的。

Output folder 指的是Flex编译后的swf和html等文件存放的路径,这里改为了WebRoot\bin

3). 向导界面3



说明:Main source folder 是flex的源码存放根目录,当然和java源码分开了。

Output folder URL 是在开发过程中运行和调试的请求路径,这个与发布无关,不会影响任何你在程序中使用的路径,但是能使开发方便

注意:FlexBuilder3这里存在bug,新建工程时,部分自定义的属性并没有保存下来,而必须在新建后的项目属性中更改,后面有说明到

放心这些设置都可以在以后修改。

4). 新建完成的项目结构看起来是这样的


2. 用MyEclipse添加Web容器
之前说到了,MyEclipse是很好用的J2EE的开发插件,其中就包含了部署功能。我们可以抛开烦琐的手动部署,交由MyEclipse完成吧,当然,首先得让你的FlexLCDS工程变成为J2EE的Web工程。


1). 向导界面1

注意:不要点快了,把这里的Create web.xml取消,这样就不会覆盖LCDS创建的web.xml文件

现在我们的工程的图标变成了J2EE Web 工程了,这意味着,你可以用MyEclipse来发布它或者添加更多容器,比如hibernate、spring等


部署FlexLCDS工程
有了MyEclipse,那么你就不用手动的部署你的项目了,可以简单的通过
点击工具栏上的这个图标


1). 部署向导1

注意:(如果你的列表中没有服务器,那么就自己建一个)
2). 新建部署Web应用服务器

注意:如果是MyEclipse6.0,则会自带一个Tomcat服务器。如果不是6.0,那么点Edit server connectors…自己添加一个tomcat。

点finish后则会开始部署。成功后会在Deployment status里提示success,并且看到列表中你的项目已经成功部署

修改一下项目的访问路径
打开项目的属性,在这里,我们可以重新修改项目编译和发布的配置,包括先前向导里的设置


修改output folder url

为什么要这么做?
这样每次发布都会自动将编译的最终swf文件直接发布至WebRoot\bin目录下,而下面的output folder url则会在我们启动和调试项目时,直接请求这个路径(这跟发布无关,只是我们在开发过程中会方便些)

修改Flex Server的项目容器属性(非常重要,多数连接路径错误就是这里配置错误)
改成如下配置

说明:
Root url 当然就是你的web服务器的根路径了,Tomcat默认是8080端口,如果改了就自己修改

Context root 就是LCDS工程的名称(注意:如果你分开为两个工程,则这里指的是你J2ee项目的名称,而不是你Flex项目的名称,因为你在请求Java的数据服务),在Flex请求LCDS时,会采用这个作为参数
http://{server.name}:{server.port}/{context.root}/messagebroker/amf
如果Context root错了,那么永远不可能正确的请求LCDS的服务了。

确定后,我们来运行测试一下这个FlexLCDS项目是否能正常访问

启动服务器

稍等片刻,等到服务器完全启动后继续下面的操作

运行访问



注:如果之前的Output folder url配置正确,那么会自动的弹出访问页面,DEBUG时也是一样。


OK,一切顺利,至此,你已经做到了第一步,即,将Flex项目、LCDS服务成功的整合至J2EE web 项目,这样的好处就是今后发布省的麻烦了。

四.常见错误:
           (1) [RPC Fault faultString="[MessagingError message='Unknown destination
'UserManager'.']" faultCode="InvokeFailed" faultDetail="Couldn't establish
a connection to 'UserManager'"]
                       错误原因:remoting-config.xml配置的java类路径错误或java类不存在
                       解决:配置正确路径。
           (2)[ RPC Fault faultString="[MessagingError message='Unknown destination
'UserManager'.']" faultCode="InvokeFailed" faultDetail="Couldn't establish a
connection to'UserManager'"]
错误原因:java版本问题,JRun 4.0支持到jdk1.4.2,不支持1.5
解决:使用jdk1.4.2
           (3) [RPC Fault faultString="Cannot create class of type 'UserManager'."
                       faultCode="Server.ResourceUnavailable" faultDetail="Type 'UserManager' not
found."]
                       错误原因:remoting-config.xml配置的java类路径错误或java类不存在
                       解决:配置正确路径。
注:我的这个remoting-config.xml配置的java类应放在
                                   %\fds2\jrun4\servers\default\flex\WEB-INF\classes\下
           (4) Unsupported major.minor version 49.0异常;
错误原因:在J2SE1.4的时候编译的是J2SE1.4的字节码形式,在J2SE5.0是5.0的字节码形式,一般只具有向下兼容性,也就是说在J2SE5.0中可以运行J2SE1.4的字节码,但是反过来则不行,在J2SE1.4下运行了J2SE5.0编译出来的字节码,就会出现上面所说的java.lang.UnsupportedClassVersionError错误了。最后,还要注意一点的是,不仅你的class文件要注意,所有在classpath下用到的lib的jar文件的版本也要注意,如果jar文件里面的class以前是高版本JDK编译出来的字节码形式,那也同样会出java.lang.UnsupportedClassVersionError错误的。
解决:原来是Eclipse里面的设置有了点问题(不知道什么时候被改了)。打开Window--->Preferences,选择里面的Java里面的Compiler,修改右面的Compiler compliance level:的值为1.4。


另外:
我在网上看到的错误,但我这里没发生的:
1.could't invoke XXX method(例如调用具体RO的GetQuote,误写成getQuote)
原因大概是由于具体RO的函数名写错了,由于MXML语言大量使用参数注释型的方式指定对象属性,导致在引号之内的标记无法被编译器识别,问题被延迟到Run-time时刻发现。
2.Send failed
原因是service-config.xml中的channels定义my-amf的{context.root}在Flex Builder编译器参数中未指定其context-root,导致编译的swf文件可能有误;
如图:

解决方法:将Context root路径改为你的项目名称路径, 如图

3.Ljava.lang.NoSuchMethodError...
原因是RO对应的Java代码中可能出现调用不存在的方法。例如某个RO对应Java类Ticker在其函数中GetQuote中new一个StockQuote实例StockQuote x = new StockQuote(param1,param2),但StockQuote类只有一个空参数的构造函数,因此NoSuchMethodError错误被传递到Flex调用RO的客户端。为什么会出现Ticker引用不存在的StockQuote构造函数,原因是没有及时同步代码。比如,StockQuote代码修改了,删除了带参数的构造函数,而依赖此类的Ticker没有及时修正。
4.ReferenceError: Error #1056:无法为a创建属性b
这是一个奇怪的问题,所有同步Java对象类的ActionScript类,即通过metadata关键字RemoteClass指定的类。对应Java类的属性名称不能以大写字母开头。
5.RemoteObject使用过程有几个问题也比较麻烦。
1.编译、配置过程烦琐,例如常见的unknown destination问题就是由于编译或配置过程有误造成的。
2. 编写与Java对象对应的ActionScript对象也是一个比较烦琐的过程。可以归为重复性而且意义不大的工作。可以考虑由工具完成此项任务。想象一 下,对于一个面临需求变化且规模较大的项目,要维护ActionScript与对应Java对象的映射,确实不是件令人愉快的事情。
遇到的几个问题:
1.unknown destination
出错原因可能是flex编译器未制定service参数。
解决方法:在Flex Builder或安装FlexBuilder2插件的Eclipse环境中设置编译器参数,选中Flex项目右键,选中properties,再选择Flex Complier,在附加参数中增加相应参数及值。例如下面两个,黑体是修改前,红体字是修改后。
-locale en_US
-locale en_US -context-root=/flex -services="C:\Program Files\Apache Software Foundation\Tomcat 5.0\webapps\flex\WEB-INF\flex\services-config.xml"
2.could't invoke XXX method(例如调用具体RO的GetQuote,误写成getQuote)
原因大概是由于具体RO的函数名写错了,由于MXML语言大量使用参数注释型的方式指定对象属性,导致在引号之内的标记无法被编译器识别,问题被延迟到Run-time时刻发现。
3.Send failed
原因是service-config.xml中的channels定义my-amf的{context.root}在Flex Builder编译器参数中未指定其context-root,导致编译的swf文件可能有误;
解决方法同1
4.Ljava.lang.NoSuchMethodError...
原 因是RO对应的Java代码中可能出现调用不存在的方法。例如某个RO对应Java类Ticker在其函数中GetQuote中new一个 StockQuote实例StockQuote x = new StockQuote(param1,param2),但StockQuote类只有一个空参数的构造函数,因此NoSuchMethodError错误 被传递到Flex调用RO的客户端。为什么会出现Ticker引用不存在的StockQuote构造函数,原因是没有及时同步代码。比如, StockQuote代码修改了,删除了带参数的构造函数,而依赖此类的Ticker没有及时修正。
5.ReferenceError: Error #1056: 无法为 a 创建属性 b
这是一个奇怪的问题,所有同步Java对象类的ActionScript类,即通过metadata关键字RemoteClass指定的类。对应Java类的属性名称不能以大写字母开头。
例如,StockQuote类在java
java 代码

package com.stockquote; 
    public class StockQuote { 
 
    public StockQuote(){} 
 
    public String getCompany(){ 
        return Company; 
    } 
 
    public void setCompany(String company){ 
        this.Company = company; 
    } 
 
    public double getPrice(){ 
        return price; 
    } 
 
    public void setPrice(double price){ 
        this.price = price; 
    } 
 
    private String Company; 
    private double price; 


在ActionScrpit中,Company和price必须以小写开头,否则会出错,即无法在Flex调用端反序列该字段。
java 代码

package com.stockquote{ 
    [Bindable] 
    [RemoteClass(alias="com.stockquote.StockQuote")] 
 
    public class StockQuote{ 
 
        function StockQuote () { 
            // Constructor code if needed 
            trace(this); 
        } 
        public function getCompany():String{ 
            return Company; 
        } 
 
        public function setCompany(company:String ):void{ 
             this.Company = company; 
        } 
 
        public function getPrice():Number{ 
             return price; 
        } 
 
        public function setPrice(price:Number):void{ 
             this.price = price; 
        } 
         
        public var Company:String; 
        public var price:Number; 
    } 

如上代码,会导致以下错误。
ReferenceError: Error #1056: 无法为 com.stockquote.StockQuote 创建属性 company。

 

你可能感兴趣的:(java,tomcat,MyEclipse,Flex,actionscript)