对于flex 的学习个人觉得主要 在于两个方面,一是 flex 丰富的标记库,能够轻松构造功能丰富的用户界面;另一方面,就是要学习flex 作为web app的表现层怎样和 多层应用中的 其他基层来通信。
flex 调用server JVM中的 javaBean 初步:
背景:
flex 可以通过三种方法来 使用 data service :一是 Web Service, 二是 Remote object service ,三是 http service, web service 只知道个大概,没有部署过,http service 觉得在一般的 三层应用中用的不多,就先研究了一下 Remote object service 。 Remote object service 说白了就是 flex 与 服务器端一般java 对象的交互,这些java对象 可以是 pojo(plain old java object)或者是 javabean 等任何没有被部署为 web service的对象。
标记:
在flex 中要使用remote java object 则通过使用 标记 <mx:RemoteObject .....> 来标识
RemoteObject 可以分为两类,named 和 unnamed , 这两个的区分在标记上的区别就是 <mx:RemoteObject named = "...."> 如果有named(这个是用来告诉flex 调用java 对象是哪个类的) 这个属性则这个RemoteObject是named的 。而如果没有named属性,那么必须要象<mx:RemoteObject source= "....">一样有source属性(source = Package.ClassName 这个类是在flex 能找到的classpath下的 全限定名 如果在用的是tomcat 的话 这个classpath 就是..\WEB-INF\classes 目录)。这两种用法在使用实质上有什么不同还不是很清楚,先不深究,继续往下看。
调用:
flex 与java object的通信就是 调用 java 对象的方法,这就涉及到参数怎么传递的问题了,flex中调用 java 对象的函数 传递参数有两种方法:1。显式 参数传递 就是象平时写java 代码一样把 参数写在函数的 参数列表中,看一个例子:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml">
<mx:Panel>
<mx:Label text="Msg: " />
<mx:TextInput text="" id="msg" />
<mx:Button label="Ok" click="data.setMsg(msg.text) "/>
</mx:Panel>
<mx:RemoteObject id="data" source="dataSourceExample"> </mx:RemoteObject>
</mx:Application>
当然 dataSourceExample 这个类的定义是:
public class dataSourceExample
{
private String msg;
public void setMsg(String msg)
{
this.msg = msg;
show();
}
public String getMsg()
{
return msg;
}
public void show()
{
System.out.println(msg);
}
}
最后一步:
这样flex 和java 类都写好了,就是运行了,但是还有一点要配置以下,就是要对..\WEB-INF\flex目录下的flex-config.xml配置一下
<remote-objects>
........
<whitelist>
<!-- whitelist config for unnamed objects -->
<unnamed>
<source>samples.*</source>
<source>samples</source>
<source>*</source>
<!--
Uncomment the source element below to enable access to all classes
during development.
We strongly recommend not allowing access to all source files
in production, since this exposes Java and Flex system classes.
<source>*</source>
-->
</unnamed>
<!-- whitelist config for named objects -->
<named>
<object name="SampleEmployeeRO">
<source>samples.explorer.EmployeeManager</source>
<type>stateful-class</type>
<allow-unnamed-access>true</allow-unnamed-access>
</object>
</named>
</whitelist>
</remote-objects>
刚刚说了 这个RemoteObject 中没有named属性, 那么这个是 unnamed 的RemoteObject 所以要在 remote-objects 下的whitelist 下的 unnamed 下 加一个<source>*</source> 以使classes 下的所有的class都能被访问。
运行:
在输入框中 输入后点击OK 后能在tomcat 终端看到传来的msg 被输出了。
另外一种传参方法:
除了以上显式传参,还可以用参数邦定的方法(argument binding): 在上面的 mxml代码的RemoteObject标记要改成:
<mx:RemoteObject id="data" source="dataSourceExample">
<mx:method name="setMsg">
<mx:arguments>
<arg1>{msg.text}</arg1>
</mx:arguments>
</mx:method>
</mx:RemoteObject>
代码意思显而易见,不多加解释了,在调用方法的地方 button的click事件 改为:click="data.setMsg.send()"
send方法一被调用 参数就被传到setMsg 方法中了