Flex 技术分享与学习
1:flex与java整合
在分享这几种配置之前,先简单的介绍一下需要用到的一些资源。
1、 MyEclipse+Flex 插件(官网下载)
2、 Tomcat6.0作为服务器(官网下载)
3、 用 BlazeDS(免费)代替 LCDS(收费);只能先使用免费的了。从 Adobe官方网站上下载下来。
4、 解压BlazeDS,解压出来的文件放到java项目WEB-INF(可替换),
Flex+Java配置:
第一种: Java工程和 Flex 工程独立,这种方式也是很多人使用的方式, Flex程序员和 Java
程序员相互独立的工作,这种方式网上有很多的资料,在这里就不再 赘述了。
第二种:Flex工程加入 Java 元素
首先导入java项目,切换视图:
右键项目——添加更改项目类型——选择添加flex项目类型;切换视图
服务器类型是 JaEE 选中(BlazeDs(B))点击下一步 切换视图
根文件夹选中tomcat 部署的项目,如果上图,即可 psmsuite为项目名称
点击完成:切换视图
这时已经整合上去了。可以马上测试一下,不过错误来了,你会看到页面会出现一个红色小错误提示,这个简单,你只需选中右键,
重建html模块,ok,就没问题了。
小提示(自动生成src目录,这时会和java项目混绕起来,没关系,跟着我做,就可以把他们区分出来)请看图片
把主源文件src 改成flex_src点击确定,你就可以看到flex_src, 与java文件区分出来,你在把src里面自动生成的flex mxml 复制(cope)到flex_src,包里,即可。那么整个flex与java整合就完成了。谢谢大家的分享。
成功例子:(java struts + hibernage+spring+mysql +flex)一个超大数据查询
效果图:(psmsuite/源码)
根据多种条件查询出数据,并且实现分页功能。
其实我们已经整合了flex与java了。接下来就是很简单了。方法有多种,获取数据库里面的数据,我就提供如下这种方法,其他方法自己去摸索,下面我介绍
<mx:HTTPService id="msdsFlex" url="http://localhost:8080/website/msds/MsdsAction.action" method="post">
<mx:request xmlns="" >
<giOper></giOper>
<allcols></allcols>
<ipage></ipage>
</mx:request>
</mx:HTTPService>
使用HTTPService请求数据
<mx:HTTPService id="feedRequest" url="http://localhost:8080/website/msds/MsdsAction.action" method="post" />
返回一个jsp文件,解析好看代码:
<%@ page language="java" pageEncoding="utf-8"%>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<?xml version="1.0" encoding="utf-8" ?>
<msdss>
<page>
<allcols><![CDATA[${pagebean.allcols}]]></allcols>
<cpage><![CDATA[${pagebean.cpage}]]></cpage>
<allpage><![CDATA[${pagebean.allpage}]]></allpage>
<ipage><![CDATA[${pagebean.ipage}]]></ipage>
</page>
<c:forEach var="item" items="${msdsList}">
<msds>
<mid><![CDATA[${item.mid}]]></mid>
<chineseName><![CDATA[${item.chineseName }]]></chineseName>
<englishName><![CDATA[${item.englishName}]]></englishName>
</msds>
</c:forEach>
</msdss>
Flex 中发送调用方法(
<mx:Panel layout="absolute" title="MSDS 2011权威3500多种" width="877" height="568" x="9" y="215">
<mx:Label x="8" y="13" text="请输入查询条件:"/>
<s:Button x="550" y="69" label="查询" id="subBtn" click="seacher(0)"/>
<mx:DataGrid x="20" y="106" dataProvider="{msdsFlex.lastResult.msdss.msds}" height="279" width="791" id="dg" itemClick="gsShow()">
<mx:columns>
<mx:DataGridColumn headerText="化学品中文名称" dataField="chineseName"/>
<mx:DataGridColumn headerText="化学品英文名称" dataField="englishName"/>
<mx:DataGridColumn headerText="CAS.NO" dataField="casNo"/>
<mx:DataGridColumn headerText="危险品货物编号" dataField="unNo"/>
<mx:DataGridColumn headerText="分子式" dataField="molecularFormula"/>
</mx:columns>
</mx:DataGrid>
<s:TextInput x="321" y="37" id="englishName" name="englishName"/>
<s:TextInput x="530" y="37" id="casNo" name="casNo"/>
<s:TextInput x="119" y="67" id="unNo" name="unNo"/>)
关键取值方法( dataProvider="{msdsFlex.lastResult.msdss.msds}")其他标签基本一样
在来一个发送方法就ok了
<s:Button x="550" y="69" label="查询" id="subBtn" click="seacher(0)"/>找到seacher()方法:
//查询按钮的提交方法
private function seacher(num:Number):void
{
if(num == 0) {
msdsFlex.request.cpage = 1;
}
msdsFlex.request.chineseName=chineseName.text;
msdsFlex.request.englishName=englishName.text;
msdsFlex.request.casNo=casNo.text;
msdsFlex.request.unNo=unNo.text;
msdsFlex.request.molecularFormula=molecularFormula.text;
if("" == chineseName.text && ""==englishName.text && ""==casNo.text &&""==unNo.text &&""==molecularFormula.text) {
Alert.show("必须输入一个查询条件");
}
else
{
msdsFlex.send();
}
}
就这样,就能查出数据来了。谢谢你的分享!如有问题,上psmsuite网站,www.psmsuite.com.
2:flex安全跨域问题解决。
方法:
1.新建一个名为crossdomain.xml的文件
其内容如下:
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<site-control permitted-cross-domain-policies="master-only"/>
<allow-access-from domain="*" to-ports="517-512" />
<allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>
2.将文件放到根文件夹下。Ok,赶快试试吧!
参考资料:
问题1:
Flash/Flex,会涉及到跨域访问URL的安全性问题,最常见的就是出现"访问URL时遇到安全性错误",这也是人们以前常说的安全沙箱问题,解决方案是在目标域名根目录加入跨域策略文件crossdomain.xml,例如:
<?xml version="1.0"?><cross-domain-policy> <allow-access-from domain="*.techmango.com" /> </cross-domain-policy>
这表示目标源允许*.techmango.com下的资源访问该域名下的资源.
问题2:
如果涉及到Socket,跨域策略文件中需要加入to-ports,例如:
<cross-domain-policy> <allow-access-from domain="*" to-ports="507" /> <allow-access-from domain="*.example.com" to-ports="509,516" /> <allow-access-from domain="*.example1.com" to-ports="517-521" /> </cross-domain-policy> 这个策略文件是指定允许哪些域的主机通过那些端口链接.
问题3:
如果在访问Webservice需要用到SOAPHeader验证,跨域策略文件做相应修改,例如:
<cross-domain-policy>
<allow-access-from domain="*.chenfeisoft.com" />
<allow-http-request-headers-from domain="*.techmango.com" headers="*"/>
</cross-domain-policy>
否则会出现DefaultHTTP错误.
问题4:
跨域访问第三方组件提供的数据,如BlazeDS,也会遇到DefaultHTTP错误.这需要服务器及UI端做相应配置,例如:
[Service端]
在服务器端的配置文件中,找到proxy-config.xml文件,里面有一个默认的destination节点: <destination id="DefaultHTTP"> </destination>
默认代理的destination将转向客户端指定的URL进行请求。首先你必须使用dynamic-url属性来指定允许代理的destinations.如下:
把你要访问的URL都配置到dynamic-url节点里。
<destination id="DefaultHTTP">
<properties>
<dynamic-url>http://cnn.com/*</dynamic-url>
<dynamic-url>http://news.yahoo.com/*</dynamic-url>
</properties>
</destination>
修改后,保存。
[UI端]:
为了Flex应用能够访问代理服务,要确保你的应用程序指向正确的service,并设置useProxy 属性为ture.如:
<mx:HTTPService url=”http://cnn.com” useProxy=”true” />
<mx:WebService url=”http://cnn.com/api?wsdl” useProxy=”true” />