最近考虑项目是不是要引进Flex技术,所以花一周研究Flex的几大方面,先给出自己的一点体会[很浅],希望交流!
今天的富客户端,无论ajax,flex,javafx,sliverlight!
都不可回避的问题是什么???
客户端[可以看做新时代的web层]与服务器[看做新时代的服务组件]怎么交互.
最好是客户端,服务器端有容器帮我们解决,让我们写ajax,flex想struts2 freemarker一样简单!
所以:
Flex在客户端有Cairngorm
在服务器端有blazeDs
不过如果真的用还是建议自己简化封装blazeDs就是java的代码,以servlet作为入口,如果用过axis,cxf,呵呵是不是就 是 soap和AMF区别,那就是编码,解码器不同[引用通信术语],思考!
必须考虑的问题是什么?
通信的效率,通信的次数,编码解码的效率,UI渲染的效率[Ext渲染,与服务器交换次数,数量,javaeye的人应该生有体会,]
我们来简单看一个,flex+tomcat [blazeDa弱化,只是java的一个框架类似struts,axis]的例子,生有不要强化blazeDs需要弱化,因为知道AMF协议自己可以做个blazeDs 呵呵AMFPHP就是哈!
简单看哈Flex端代码:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" backgroundGradientColors="[0x000000,0x323232]">
<mx:ChannelSet id="channelSet">
<mx:AMFChannel id="amfChannel" url="http://localhost:8080/blazeDsTomcat/blazeDs/bobo"/>
</mx:ChannelSet>
<mx:RemoteObject id="srv" destination="language" channelSet="{channelSet}"/>
<mx:DataGrid dataProvider="{srv.getLanguages.lastResult}" width="100%" height="100%">
<mx:columns>
<mx:DataGridColumn dataField="id" headerText="id"/>
<mx:DataGridColumn dataField="name" headerText="Name"/>
<mx:DataGridColumn dataField="desc" headerText="Desc"/>
</mx:columns>
</mx:DataGrid>
<mx:Button label="Get Data" click="srv.getLanguages()"/>
</mx:Application>
http://localhost:8080/blazeDsTomcat/blazeDs/bobo这个很重要哈,看看服务器web.xml中怎么配置的哈?
<servlet>
<servlet-name>MessageBrokerServlet</servlet-name>
<servlet-class>flex.messaging.MessageBrokerServlet</servlet-class>
<init-param>
<param-name>services.configuration.file</param-name>
<param-value>/WEB-INF/flex/services-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>MessageBrokerServlet</servlet-name>
<url-pattern>/blazeDs/*</url-pattern>
</servlet-mapping>
哈哈Flex端请求到了flex.messaging.MessageBrokerServlet这个不就是Servlet与axis,struts有何区别
唯一不同是http承载的数据格式不同,需要不同的解码与编码器,一般内置了哈,开发是透明的!所以sping就是想达到开发flex与传统开发java没有多大区别,是开发值关心Flex ui 与event 与pojo
那么?MessageBrokerServlet类怎么处理请求,猜想肯定找对应的类解码AMF数据然后调用处理者[我们的业务组件]
源码:
String contextPath = req.getContextPath();
String pathInfo = req.getPathInfo();
String endpointPath = req.getServletPath();
if (pathInfo != null)
endpointPath = endpointPath + pathInfo;
Endpoint endpoint = null;
try
{
endpoint = broker.getEndpoint(endpointPath, contextPath);
}
呵呵根据请求找到对应的endpoint ,然后解码----调用业务组件---编码 返回Flex端
看看服务器端代码与配置[消除了网上很多例子的融于代码]
上面web.xml可以看到初始化了services-config.xml文件类似spring,一切都差不多,我们看看services-config.xml文件是什么? 如下
<?xml version="1.0" encoding="UTF-8"?>
<services-config>
<services>
<service-include file-path="remoting-config.xml" />
</services>
<channels>
<channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
<endpoint url="http://{server.name}:{server.port}/{context.root}/blazeDs/bobo" class="flex.messaging.endpoints.AMFEndpoint"/>
</channel-definition>
</channels>
</services-config>
就这样简单,引入了remoting-config.xml,看看这个文件是什么
<?xml version="1.0" encoding="UTF-8"?>
<service id="remoting-service"
class="flex.messaging.services.RemotingService">
<adapters>
<adapter-definition id="java-object"
class="flex.messaging.services.remoting.adapters.JavaAdapter"
default="true"/>
</adapters>
<default-channels>
<channel ref="my-amf"/>
</default-channels>
<destination id="language">
<properties>
<source>com.bobo.ComputerLanguageService</source>
</properties>
</destination>
</service>
也简单哈,大家仔细体会哈
blazeDs 是不是只是个axis,xfire这样差不多的[比axis,xfire还是轻量点哈]的一个接受请求,解码,调用服务[我们的],编码,就是个java的Servlet
所以关键是什么
客户端运行语言as----编码 为X[amf]------HTTP---------服务器接受请求派发[servlet]-----X解码----调用服务----java编码为X---返回客户端---X解码为客户端语言的类型
这个过程.,怎么做
1.都自己做 [会怎么样],想想javade发展 sevlet--jsp--srtuts1 webwork jsf
2.容器做 通信 编码解码
3框架类库
框架类库与容器概念今天不是很明确了
估计大家 很少几个能 看完的,不喜欢写博客就是业务说不清
还是喜欢 直接站在讲台讲课哈,可是 没有这样的好机会
代码见附件,2部分 flex java 那过去就可以跑!
localClientFlex.rar是flex的一个MXML需要你机器有Flex环境
localFlexClient_swf.rar包含flash直接可以运行但是要考虑安全设置