传统的HttpService方式显然对于我们项目来说不那么实用,如果既想保留传统页面,又想使用Flex就要换种思路了,就是将flex嵌入到传统页面中(其实上面例子也是这样做的,只不过是Adobe自动生成js自动帮助嵌入的)。
首先介绍两种组件,第一个不用多说,BlazeDS,Adobe提供的用于和java交互的免费项目,精简版的LCDS(LiveCycle Data Service)。
使用:将BlazeDS发布包(Adobe老窝有)中的flex目录文件夹拷到web-inf下,lib下所有类库导进来(有些用不到)就OK了,进行远程回调时主要是写remote-config.xml,下面会提到。
还有一个就是swfobject,这个是老外(可能是小外)开发的js库,目前版本2.0,主要用来方便的嵌入swf文件(flex编译后产生swf),主要就一个方法
swfobject.embedSWF(swf文件名,要嵌入的html容器名, 宽, 高, flash版本号),另外还有提供传入swf的参数的选项等,封装的比Adobe公司提供的AC_OETags.js要强大一些,使用起来也更加方便。
下面以图表显示为例:首先是显示曲线图。
客户端js代码:
//先将html页面数据封装成JSON:
function queryAreaChart(sh){
var qssj = $F("sssqqYear")+$F("sssqqMonth");
var jzsj = $F("sssqzYear")+$F("sssqzMonth");
var obj = "{'sh':'"+sh+"','qssj':'"+qssj+"','jzsj':'"+jzsj+"'}";//页面的查询条件:起始时间,截止时间,税号
$("areachartdata").value=obj;//先缓存起来
$("DataContent").style.display="none";
$("AreaContent").style.display="";
swfobject.embedSWF("/sygl/wjgssygl-flex-debug/AreaChart.swf","AreaContent", "1200", "600", "9.0.0");//开始加载flex
}
//这个方法由ActionScript调用
function getAreaChart(){
var str = $("areachartdata").value;
var obj = eval('('+str+')');
return obj;
}
Flex代码(这里使用了BlazeDS远程回调):
<?xml version="1.0"?>
<mx:Application xmlns:mx="[url]http://www.adobe.com/2006/mxml[/url]"
backgroundGradientAlphas="[1.0, 1.0]"
backgroundGradientColors="[#11EDD0, #D6F3DB]"
initialize="callremote()">
<mx:Style>
.ChineseFont{
fontFamily:”Verdana”,”宋体”;
fontSize:12;
}
</mx:Style>
<mx:Script>
<![CDATA[
import mx.rpc.events.ResultEvent;
import mx.collections.ArrayCollection;
[Bindable]
private var dp:ArrayCollection;
//回调函数获得页面JSON,关键函数ExternalInterface.call(js函数名,参数)
public function callremote():void{
var f:String = "getAreaChart";
var obj:Object = ExternalInterface.call(f);
hs.getData(obj);//开始调用java端的方法
}
public function back():void{
var f:String = "backdata";
var obj:Object = ExternalInterface.call(f);
}
public function resultHandler(event:ResultEvent):void{
var obj:Object = event.result;//获得java服务端返回的Map,到客户端自动转型为object,List转为Array
dp = new ArrayCollection( [
{ Month: "一月", 区局: obj["qjdata1"], 分局: obj["fjdata1"]},
{ Month: "二月", 区局: obj["qjdata2"], 分局: obj["fjdata2"]},
{ Month: "三月", 区局: obj["qjdata3"], 分局: obj["fjdata3"]},
{ Month: "四月", 区局: obj["qjdata4"], 分局: obj["fjdata4"]},
{ Month: "五月", 区局: obj["qjdata5"], 分局: obj["fjdata5"]},
{ Month: "六月", 区局: obj["qjdata6"], 分局: obj["fjdata6"]},
{ Month: "七月", 区局: obj["qjdata7"], 分局: obj["fjdata7"]},
{ Month: "八月", 区局: obj["qjdata8"], 分局: obj["fjdata8"]},
{ Month: "九月", 区局: obj["qjdata9"], 分局: obj["fjdata9"]},
{ Month: "十月", 区局: obj["qjdata10"], 分局: obj["fjdata10"]},
{ Month: "十一月", 区局: obj["qjdata11"], 分局: obj["fjdata11"]},
{ Month: "十二月", 区局: obj["qjdata12"], 分局: obj["fjdata12"]} ]);
}
]]>
</mx:Script>
<!--flex回调对象-->
<mx:RemoteObject id="hs" destination="hyyjtService" >
<mx:method name="getData" result="resultHandler(event)"/>
</mx:RemoteObject>
<!-- Define custom colors for use as fills in the AreaChart control. -->
<mx:SolidColor id="sc1" color="blue" alpha=".3"/>
<mx:SolidColor id="sc2" color="red" alpha=".3"/>
<mx:SolidColor id="sc3" color="green" alpha=".3"/>
<!-- Define custom Strokes. -->
<mx:Stroke id = "s1" color="blue" weight="2"/>
<mx:Stroke id = "s2" color="red" weight="2"/>
<mx:Stroke id = "s3" color="green" weight="2"/>
<mx:Panel title="企业税负图示" fontSize="12"
height="100%" width="70%" layout="horizontal">
<mx:AreaChart id="Areachart" height="100%" width="100%"
showDataTips="true" dataProvider="{dp}">//数据绑定到图
<mx:horizontalAxis>
<mx:CategoryAxis categoryField="Month"/>
</mx:horizontalAxis>
<mx:series>
<mx:AreaSeries yField="区局" form="curve" displayName="区局" areaStroke="{s1}" areaFill="{sc1}"/>
<mx:AreaSeries yField="分局" form="curve" displayName="分局" areaStroke="{s2}" areaFill="{sc2}"/>
</mx:series>
</mx:AreaChart>
<mx:Button label="返回" click="back()"/>
<mx:Legend dataProvider="{Areachart}" legendItemClass="BigFontLegendItem"/>
</mx:Panel>
</mx:Application>
java服务端代码:
public class HyyjtService {
//获得显示数据
public Map getData(Map map){
//测试数据
Map m = new HashMap();
m.put("qjdata1", 1);
m.put("qjdata2", 2);
m.put("qjdata3", 3);
m.put("qjdata4", 4);
m.put("qjdata5", 5);
m.put("qjdata6", 6);
m.put("qjdata7", 7);
m.put("qjdata8", 8);
m.put("qjdata9", 5);
//省略。。。。
return m;
}
}
web.xml添加配置:
<listener>
<listener-class>flex.messaging.HttpFlexSession</listener-class>
</listener>
<servlet>
<servlet-name>MessageBrokerServlet</servlet-name>
<display-name>MessageBrokerServlet</display-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>/messagebroker/*</url-pattern>
</servlet-mapping>
remote-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="hyyjtService">
<properties>
<source>cn.tohot.sygl.yjfx.chart.HyyjtService</source >
</properties>
</destination>
</service>
分享到:
相关推荐
在这个名为“ddp.rar_flex_对对碰”的压缩包中,包含了完整的源代码、工程文件以及运行程序,为开发者提供了宝贵的参考资源。 首先,让我们关注核心的编程文件`Game.as`。这是一个ActionScript类文件,它定义了...
FlexLib是iOS开发中的一款创新工具,它将前端布局模型——Flexbox引入到原生的iOS应用开发中,极大地简化了界面构建的过程。这个开源项目旨在解决iOS界面设计中的复杂性问题,使得开发者能够如同编写网页布局那样,...
在这个实验中,我们将聚焦于“杭电编译原理实验——简单C语言语法分析器”,这是一个旨在帮助学生深入理解词法分析概念的实际操作项目。** **词法分析**是编译过程的第一步,它的主要任务是将源代码分解成一系列有...
在实习项目中,你可能会接触到如ANTLR、Flex & Bison等工具,它们可以帮助你完成上述过程。ANTLR用于生成解析器,Flex和Bison则常用于词法分析和语法分析。此外,你还需要编写文档,详述你的设计思路、实现过程以及...
为了更清晰地理解Flex_Viewer中文件和组件是如何组织的,下面将详细介绍两个核心文件——`MapManager.mxml`和`Controller.mxml`。 ##### MapManager.mxml 该文件定义了地图的基本配置和操作,包括地图控件的初始化...
在编写过程中,因为大家都知道,日历组件是有固定行数和每一行的固定列数的(即使当前方块内没有值),所以结合小程序“数据优先”的特点,最合适的布局方式一定是flex了! 先说一下大致思路(布局上),笔者将整个...
在本文中,我们将深入探讨如何利用Mpvue框架来构建这样的应用,并分析其核心技术和设计思路。 首先,我们需要理解什么是Mpvue。Mpvue是由滴滴出行开源的一个基于Vue.js的小程序框架,它允许开发者使用Vue.js的语法...
2. **数据绑定**:在wxml中,通过双大括号`{{ }}`进行数据绑定,将后台数据与前端界面关联起来,实现动态显示。 3. **API调用**:微信小程序提供了丰富的API接口,如网络请求、用户授权、设备信息获取等。在“仿...
【描述】中提到,这个项目遵循GNU协议,这表明它是一个开源软件。GNU协议(GNU General Public License,简称GPL)是一种广泛使用的自由软件许可证,确保所有用户都能自由地使用、修改、复制和分发该软件。这意味着...
在实际开发中,PureMVC的使用可以简化项目管理,让开发者更专注于业务逻辑而不是架构细节。同时,其模块化的特性使得团队协作变得更加容易,每个成员可以专注于自己负责的部分,而不用担心对全局的影响。此外,由于...
2. **设计思路**:详细说明如何设计词法分析器,包括选择合适的算法(如LR、LL、LR(1)等)和数据结构(如有限状态机),以及如何处理边缘情况和错误处理。 3. **实现方法**:具体描述实现词法分析器的过程,可能...
【番茄时钟小程序的源码比较全】这个标题暗示了我们即将探讨的是一个关于时间管理工具——番茄工作法的小程序的源代码。番茄工作法是一种流行的时间管理技巧,通过将工作时间分割成25分钟的工作块(称为“番茄”)和...
在实际操作中,你可能需要用到一些工具和库,例如ANTLR、Flex和Bison等,它们可以帮助简化编译器的构建。同时,深入阅读并理解编译器相关的经典书籍,如《编译器设计》(Dragon Book),将对你的学习大有裨益。 ...
在设计过程中,使用了MAX+PLUS II软件进行设计输入、编译、综合与仿真。此外,还介绍了如何通过使用LPM宏单元库、硬件描述语言(如VHDL)以及EAB单元来提高设计效率。 #### 结论 本项目成功地利用CPLD实现了由...
在实践中,词法分析器的实现可以使用手工编写,也可以利用工具自动生成,如Flex或JavaCC。 可执行源代码是指经过编译或解释过程后的代码,它可以直接在目标平台上运行,无需进一步的翻译。在编译原理的上下文中,这...
同时,可能需要提供一份项目说明文档,解释设计思路和实现过程。 在这个“我的家乡”网页大作业中,学生不仅可以锻炼Dreamweaver的操作技能,还能学习到如何用网页语言讲述个人的故事,让更多人了解和欣赏自己的...
在这个"微信小程序-仿豆瓣电影-demo"项目中,开发者模仿了知名的电影评分与分享平台——豆瓣电影的功能,旨在帮助学习者理解微信小程序的开发流程和相关技术。 一、微信小程序的基础架构 微信小程序基于JavaScript...
3. **编译原理课程设计报告**:课程设计报告通常会详细记录学生在学习编译原理时所完成的项目,包括目标、设计思路、实现方法、遇到的问题及解决方案等。通过阅读这些报告,你可以了解到实际应用编译原理知识的过程...
在这个项目中,可能使用了ID选择器(#id)、类选择器(.class)以及元素选择器(element)等,通过这些选择器来指定特定元素的样式。例如,`.header`可能代表头部区域,`#main-content`可能是主要内容区域。属性如`...