前些日子, 做了一个组态监控程序,考虑到图形化展示,最终选择了 flex做为前端显示,即在jsp中嵌入flash的形式实现。
大家都知道,目前有很多 java+flex 的系统,基本上都使用了开源的一些框架,remote等 ,网上例子很多。这次我们不用任何框架,用flex 和jsp以及 js脚本来实现相互通讯。
注意,这次介绍只介绍flex部分,java服务器端部分留着下次来介绍。
先介绍下使用的基本原理:
Flex中As调用Js的方法是:
1、导入包 (import flash.external.ExternalInterface;)
2、使用ExternalInterface.call("Js函数名称",参数)进行调用,其返回的值就是Js函数所返回的值
Js调用As的方法是:
1、导入包 (import flash.external.ExternalInterface;)
2、在initApp中使用ExternalInterface.addCallback("用于Js调用的函数名",As中的函数名)进行注册下
3、js中 就可以用document.getElementById("Flas在Html中的ID").注册时设置的函数名(参数)进行调用。
然后介绍下这次实现的框架的基本功能:
1、组件和服务器基本的实时通讯,信息交互。
2、子组件之间的实时相互通讯,信息交互。
3、加载不同子组件,构成预期的系统。
接下来是实现的过程原理,以及相关源代码:
1、声明基本的存储变量和 初始化 主组件
private var graphId:String;
private var moduleMap:Map=new HashMap();
private var moduleInfo:Object=new Object(); // 所有的IModuleInfo
private function init():void//主组件加载方法
{
flash.system.Security.allowDomain("*");//权限设置
ExternalInterface.addCallback("showMsg", showMsg); // 允许javascript调用
ExternalInterface.addCallback("setGraphMsg", setGraphMsg); // 允许javascript调用
graphId=ExternalInterface.call("getGraphId");//获取图形id
handleStyle(ExternalInterface.call("getGraphStyle"));//获取图形样式
handleStruct(ExternalInterface.call("getGraphStruct"));//获取图形子组件,以及结构,构成
// fullScream();
}
2、获取对应图元,用于子组件之间的交互
/**
* 根据id获取对应图元
*/
public function getModule(id:String):Module
{
return moduleMap.get(id) as Module;
}
3、处理样式
/**
* 处理样式
*/
private function handleStyle(style:String):void
{
var styleXML:XML=new XML(style);
var classList:XMLList=styleXML.elements("class");
for (var i:int=0; i < classList.length(); i++)
{
var classXML:XML=classList[i];
var selector:String=classXML.attribute("name");
if (selector == null)
{
continue;
}
var css:CSSStyleDeclaration=StyleManager.getStyleDeclaration(selector);
var attrList:XMLList=classXML.attributes(); // 所有属性
for (var j:int=0; j < attrList.length(); j++)
{
var attrName:String=attrList[j].name(); // 属性名
var attrValue:String=classXML.attribute(attrName); // 属性值
// name属性为selector
if (attrName != "name")
{
if (attrValue.indexOf(",") > -1)
{
css.setStyle(attrName, attrValue.split(","));
}
else
{
css.setStyle(attrName, attrValue);
}
}
}
}
}
4、结构处理
/**
* 处理图形构成
*/
private function handleStruct(struct:String):void
{
var structXML:XML=null;
var metaList:XMLList=null;
try
{
structXML=new XML(struct);
metaList=structXML.elements("meta");
}
catch (e:Error)
{
Alert.show("错误:" + e.message);
}
for (var i:int=0; i < metaList.length(); i++)
{
var metaXML:XML=metaList[i];
moduleInfo[metaXML.@id]=ModuleManager.getModule(metaXML.@url);
moduleInfo[metaXML.@id].addEventListener(ModuleEvent.READY, moduleLoadReady);
moduleInfo[metaXML.@id].addEventListener(ModuleEvent.ERROR, moduleLoadError);
// 将除url属性全部放到data上
var attributes:Object=new Object();
var attrList:XMLList=metaXML.attributes(); // 所有属性
for (var j:int=0; j < attrList.length(); j++)
{
var attrName:String=attrList[j].name(); // 属性名
var attrValue:String=metaXML.attribute(attrName); // 属性值
if (attrName != "url")
{
attributes[attrName]=attrValue;
}
}
moduleInfo[metaXML.@id].data=attributes;
moduleInfo[metaXML.@id].load();
}
}
/**
* 图元导入完成
*/
private function moduleLoadReady(event:ModuleEvent):void
{
var module:IModuleInfo=event.module;
var meta:Module=module.factory.create() as Module;
meta.data=module.data; // 将所有属性传递给图元
moduleMap.put(module.data.id, meta); // 将新增图元添加到map
// meta.addEventListener(MouseEvent.DOUBLE_CLICK, full);
this.addChild(meta);
}
private function moduleLoadError(event:ModuleEvent):void
{
Alert.show('加载错误,详细错误信息:' + event.errorText);
}
中
5、 通讯方法
/ * 接收、设置服务器消息
* 格式:图元标识 + "$" + 消息
*/
public function setGraphMsg(msg:String):void
{
var id:String=msg.substr(0, msg.indexOf("$"));
var module:Module=getModule(id);//得到子组件
// Alert.show(id+":"+msg+":"+msg.substr(msg.indexOf("$") + 1));
module["setGraphMsg"](msg.substr(msg.indexOf("$") + 1));//发送给子组件消息相当于
//module.setGraphMsg(msg.substr(msg.indexOf("$") + 1));
}
6、 发送消息给所有客户端
/**
* 将消息发往所有客户端
*/
public function sendMsgToAllClient(msg:String):void
{
ExternalInterface.call("sendMsgToAllClient", msg);
}
7、jsp中实现,嵌入生成的swf文件 即可,然后相互发送消息
<script type="text/javascript">
function getGraphId() {//get graph key
return document.forms[0].graphId.value;
}
function getGraphStyle() { //get graph style
return document.forms[0].graphStyle.value;
}
function getGraphStruct() {//get graph struct
return document.forms[0].graphStruct.value;
}
function setGraphMsg(msgType, msg) {//send message to graph
document.getElementById("GraphViewer").setGraphMsg(msg);
}
function sendMsgToAllClient(msg){
//异步提交到服务器,服务器作出相应后发送给相应的客户端,
}
</script>
<!-嵌入jsp的flash--->
<table class="tableGrid">
<tr>
<td width="100%" height="100%">
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
id="GraphViewer"
codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab">
<param name="movie" value='graph/swf/GraphViewer.swf?U=<%=U%>' />
<param name="quality" value="high" />
<param name="allowFullScreen" value="true" />
<param name="wmode" value="transparent" />
<param name="allowScriptAccess" value="always" />
<embed src='graph/swf/GraphViewer.swf?U=<%=U%>' quality="high"
name="GraphViewer" play="true" loop="false" quality="high"
allowScriptAccess="always" type="application/x-shockwave-flash"
allowFullScreen="true"
pluginspage="http://www.adobe.com/go/getflashplayer">
</embed>
</object>
</td>
</table>
另外,附上用此框架实现的系统截图:
立体库房
自动化流水线组态监控
- 大小: 78.9 KB
- 大小: 89.2 KB
分享到:
相关推荐
2. 在JSP项目中创建服务端接口和实现,例如使用JavaBean或Servlet处理业务逻辑。 3. 在`web.xml`中配置相应的Servlet来处理Flex的AMF请求。 4. 在Flex客户端,使用`mx.rpc.amf`包中的类(如`AMFChannel`和`...
本资源“Jsp嵌入Flex 、Jsp Flash报表实现源码”提供了一种将Flex的图形化展示能力和JSP的数据处理能力结合起来,以创建具有丰富视觉效果和交互性的报表应用的方法。 首先,让我们深入理解JSP和Flex各自的特性: 1...
综上所述,这个项目是一个宝贵的学习资源,有助于开发者理解如何在实际项目中整合JSP和Flex4,实现高效的数据交换和复杂的用户交互。通过分析源代码和运行DEMO,我们可以深入掌握这两种技术的融合,提升Web应用开发...
2. flex-bootstrap.jar:这个文件是Flex运行时环境的一部分,包含了Flex框架的基础组件和类库,用于初始化和加载Flex应用程序。Bootstrap类库通常用于启动Flex应用程序,确保正确加载所需的SWF文件和资源。 3. flex...
在IT行业中,尤其是在Web开发领域...总之,"FLEX3嵌入到JSP,实现的jar包"是一个集合了Flex与JSP集成所需核心组件的资源包,帮助开发者轻松地在Java Web应用中集成Flex功能,创建具有动态交互和丰富用户体验的Web应用。
在Flex和Java的交互中,BlazeDS是一个关键组件。BlazeDS是Adobe提供的一个免费的服务器端解决方案,它提供了AMF(Action Message Format)协议,使得Flex客户端能够与Java应用服务器进行低延迟、高性能的数据交换。...
Flex 和 JSP 结合使用是一种常见的前端与后端交互方式,它允许开发人员...综上所述,Flex 和 JSP 的结合使用为构建动态、交互的 Web 应用提供了一个强大的平台,开发者可以通过熟练掌握这种技术来提升应用的用户体验。
**正文** JSP(JavaServer Pages)...通过以上知识点的学习和实践,开发者可以有效地在JSP中嵌入一个或多个Flex模块,创建出功能强大且用户体验优良的Web应用。理解并掌握这些技术,对于提升Web开发能力具有重要意义。
标题中的“一个Flex+Jsp+Mysql实现的增删查改例子”表明这是一个使用Adobe Flex作为前端,JavaServer Pages(JSP)作为后端处理,以及MySQL作为数据库的Web应用示例。这个项目可能是一个基础的教学案例,用于演示...
### FLEX通过JSP与数据库交互的关键知识点 #### 一、背景介绍 FLEX是一种用于构建高度互动的应用程序的框架,它可以与多种后端...此外,文章还提供了实际的代码示例和配置指南,帮助开发者更好地理解和实现这一过程。
这个合并的jar包通常包含了Flex编译器生成的SWC库,比如Flex框架类、Flex组件库、 BlazeDS或LiveCycle Data Services的相关类等。开发者在JSP环境中使用Flex时,需要这个jar包来确保所有必要的Flex运行时环境已经...
在IT行业中,Flex是一种基于Adobe Flash技术的开源框架,用于构建富互联网应用程序(RIA)。它提供了丰富的用户界面组件和强大的数据通信能力,尤其适合创建动态、交互性强的Web应用。而JSP(JavaServer Pages)是...
【JSP+Flex+JavaSocket+jQuery+Ajax聊天】是一个技术综合的应用实例,它整合了多种前端和后端技术,为用户提供类似QQ的聊天体验。下面将分别介绍这些技术及其在聊天应用中的作用。 **JSP(JavaServer Pages)**是...
4. **JSP交互**:为了使Flex应用与JSP进行数据交互,可以使用AMF(Action Message Format)协议。AMF是一种高效的数据交换格式,Flex SDK和 BlazeDS(一个开源的Java服务器)支持AMF,使得Flex应用能够方便地调用JSP...
总之,将Flex嵌入JSP页面是一个涉及前端和后端多方面技术的过程。解决遮挡问题需要综合运用HTML、CSS、JavaScript以及Flex和JSP的相关知识。通过不断学习和实践,我们可以有效地解决这类问题,创建出既美观又功能...
标题与描述概述的知识点是关于如何将Flex框架嵌入到JSP页面中,以实现更丰富的数据可视化功能,特别是图表的展示。以下是基于标题、描述、标签以及部分内容的详细解析和扩展。 ### Flex嵌入JSP开发心得 #### 1. ...
5. **Flex与JSP的通信**:如果Flex应用和JSP页面需要紧密交互,可以利用Flex的ExternalInterface或Ajax技术实现两者之间的通信,动态地调整Z-index或其他CSS属性,以达到理想的显示效果。 6. **重新设计布局**:在...
为了实现Flex和JSP的通信,我们需要配置一个后台服务,如 BlazeDS 或 LCDS(LiveCycle Data Services),它们提供了AMF(Action Message Format)协议,能够高效地传输数据。在Flex客户端,我们可以使用HTTPService...