用Jersey构建RESTful服务2--JAVA对象转成XML输出

2014-03-17 Java Jersey REST

##一、 总体说明 XML和JSON 是最为常用的数据交换格式。本例子演示如何将java对象,转成XML输出。 ##二、流程

  • 1.在上文的例子中,创建一个包“com.waylau.rest.bean”
  • 2.在该包下创建一个JAVA类”User”
	package com.waylau.rest.bean;  
	import javax.xml.bind.annotation.XmlRootElement;  
	/* *
	 * 用户 bean 
	 * @author waylau.com 
	 * 2014-3-17 
	 */  
	@XmlRootElement  
	public class User {  
	      
	    private String userId;  
	    private String userName;  
	    private String age;  
	      
	    public User() {};  
	      
	    public User(String userId, String userName, String age) {  
	        this.userId = userId;  
	        this.userName = userName;  
	        this.age = age;  
	    }  
	    public String getUserId() {  
	        return userId;  
	    }  
	    public void setUserId(String userId) {  
	        this.userId = userId;  
	    }  
	    public String getUserName() {  
	        return userName;  
	    }  
	    public void setUserName(String userName) {  
	        this.userName = userName;  
	    }  
	    public String getAge() {  
	        return age;  
	    }  
	    public void setAge(String age) {  
	        this.age = age;  
	    }  
	}  

注意:该类上面增加了一个注解“@XmlRootElement”,在将该类转化成XML时,说明这个是XML的根节点。

  • 3.在“com.waylau.rest.resources”中,增加资源“UserResource“,代码如下:
	package com.waylau.rest.resources;  
	  
	import java.util.ArrayList;  
	import java.util.HashMap;  
	import java.util.List;  
	import java.util.Map;  
	  
	import javax.ws.rs.Path;  
	import javax.ws.rs.Produces;  
	import javax.ws.rs.PathParam;  
	import javax.ws.rs.core.MediaType;  
	import javax.ws.rs.DELETE;  
	import javax.ws.rs.GET;  
	import javax.ws.rs.POST;  
	import javax.ws.rs.PUT;  
	  
	import com.waylau.rest.bean.User;  
	  
	@Path("/users")  
	public class UserResource {  
	    private static Map<String,User> userMap = new HashMap<String,User>();//存储用户  
	     /** 
	     * 查询所有 
	     * @return 
	     */  
	    @GET  
	    @Produces(MediaType.APPLICATION_XML)  
	    public List<User> getAllUsers(){       
	        List<User> users = new ArrayList<User>();  
	        User u1 = new User("001","WayLau","26");  
	        User u2 = new User("002","King","23");  
	        User u3 = new User("003","Susan","21");  
	          
	        userMap.put(u1.getUserId(), u1);  
	        userMap.put(u2.getUserId(), u2);  
	        userMap.put(u3.getUserId(), u3);  
	          
	        users.addAll( userMap.values() );  
	        return users;  
	    }  
	      
	    @GET  
	    @Path("/getUserXml")  
	    @Produces(MediaType.APPLICATION_XML)  
	    public User getUserXml() {  
	     User user  = new User();  
	     user.setAge("21");  
	     user.setUserId("004");  
	     user.setUserName("Amand");  
	     return user;  
	    }  
	}  

其中MediaType.APPLICATION_XML 说明了是以XML形式输出

在浏览器输入http://localhost:8089/RestDemo/rest/users/getUserXml,输出单个对象 在浏览器输入 http://localhost:8089/RestDemo/rest/users 输出对象的集合

本章源码https://github.com/waylau/RestDemo/tree/master/jersey-demo2-xml


用Jersey构建RESTful服务1--HelloWorld

2014-03-17 Java Jersey REST

#一、环境

#二、流程

  • 1.Eclipse 中创建一个 Dynamic Web Project ,本例为“RestDemo”
  • 2.按个各人习惯建好包,本例为“com.waylau.rest.resources”
  • 3.解压jaxrs-ri-2.7,将api、ext、lib文件夹下的jar包都放到项目的lib下; 项目引入jar包
  • 4.在resources包下建一个class“HelloResource”

	package com.waylau.rest.resources; 
	import javax.ws.rs.GET; 
	import javax.ws.rs.Path; 
	import javax.ws.rs.Produces; 
	import javax.ws.rs.PathParam; 
	import javax.ws.rs.core.MediaType; 
	@Path("/hello") 
	public class HelloResource { 
		@GET @Produces(MediaType.TEXT_PLAIN) 
		public String sayHello() 
		{ 
			return "Hello World!" ; 
		}
		
		@GET @Path("/{param}") 
		@Produces("text/plain;charset=UTF-8") 
		public String sayHelloToUTF8(@PathParam("param") String username) 
		{ 
			return "Hello " + username; 
		}
		
	}
  • 5.修改web.xml,添加基于Servlet-的部署
<servlet> 
	<servlet-name>Way REST Service</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
	<init-param> 
	<param-name>jersey.config.server.provider.packages</param-name> 
	<param-value>com.waylau.rest.resources</param-value> </init-param> 
	<load-on-startup>1</load-on-startup> 
</servlet>

<servlet-mapping> 
	<servlet-name>Way REST Service</servlet-name> 
	<url-pattern>/rest/*</url-pattern> 
</servlet-mapping>

http://localhost:8089/RestDemo/rest/hello/Way你好吗,输出Hello Way你好吗

参考:https://jersey.java.net/documentation/latest/user-guide.html

本章源码https://github.com/waylau/RestDemo/tree/master/jersey-demo1-helloworld


Flex4 Label文本换行

2014-03-12 Flex

图标中的文本如果太长就显示不全了。 图片 查API , Label继承了TextBase,而 TextBase有maxDisplayedLines属性,表述如下: 确定是否截断文本以及在何处截断文本的整数。

截断文本意味着使用截断指示符(如 "...")替换超额文本。截断指示符与区域设置相关;它是由 "core" 资源包中的 "truncationIndicator" 资源指定的。
如果值为 0,则不会发生截断。相反,如果文本不在组件的界限内,则将只是剪辑文本。
如果值为正整数,则会根据需要截断文本以将行数减少至此整数。
如果值为 -1,则会截断该文本以显示将完全放在组件的高度内的行。
仅当 lineBreak 样式为 "toFit" 时,才执行截断;如果 lineBreak 为 "explicit",则会忽略此属性的值。
默认值为 0。
将 maxDisplayedLines 设为2,解决 图片

win7下Flash字体显示异常,解决

2014-01-05 Flash

刚换了win7系统 ,原有Flex项目中的字体显示出现不一致的情况,如下图 图片

且,几部电脑安装该系统盘均出现上述情况,而用另外系统碟装的系统却正常。 由于该Flash项目调用的是系统中的字库,可初步判断是字库的问题 。

解决:更换系统字库 在C:\Windows\Fonts 目录下 存放的就是系统所有的字体, 更换也挺简单,只需要复制其他系统的全部字体过来,覆盖该系统的字体即可 图片


Flex项目release后图片资源不见了–图片资源采用嵌入与不嵌入的区别

2013-10-19 Flex

近期项目发现,在使用release发布项目包,图片找不到了,而debug下面又有图片。

后来发现,原来图片被另外一个组件嵌入了。

下面例子展示了组件嵌入和不嵌入图片的区别

<?xml version=”1.0″ encoding=”utf-8″?> 
<s:Application xmlns:fx=”http://ns.adobe.com/mxml/2009″ xmlns:s=”library://ns.adobe.com/flex/spark” xmlns:mx=”library://ns.adobe.com/flex/mx” minWidth=”955″ minHeight=”600″> 
<fx:Declarations> 
<!– Flex项目release后图片资源不见了—-图片资源采用嵌入与不嵌入的区别 更多示例请访问www.waylau.com–> 
</fx:Declarations> 
<s:VGroup> 
<s:Panel title=”嵌入测试”> 
<s:HGroup> 
<s:Button id=”btn1″ icon=”@Embed(source=’images/close.png’)”/> 
<s:Button id=”btn2″ icon=”images/close.png”/> 
</s:HGroup> 
</s:Panel> 
<s:Panel title=”未嵌入测试”> 
<s:HGroup> <s:Button id=”btn3″ icon=”images/myIco.png”/> <s:Button id=”btn4″ icon=”images/myIco.png”/> </s:HGroup>
</s:Panel> 
</s:VGroup> 
</s:Application>

btn1嵌入了的图片,btn2就无法引用了, 而btn3、btn4没有嵌入,所以都可以引用。 看release的文件btn1嵌入的图片close.png是看不到的,已经嵌入进swf, 而myIco.png是存在的。

嵌入图片和不嵌入图片各有利弊,嵌入图会加快访问图片的速度,但同时也增大了编译文件, 以下是一个错误的示例,多个文件嵌入了同一份资源save24.png,使得每个swf文件都变大了。要按照实际需要选择

在上面的例子中当多个控件引用的是同一个资源时,嵌入图片用简单的变量访问方式,在多个地方引用所嵌入的资源。 这是变量就代表资源,提高写代码的效率

<?xml version=”1.0″ encoding=”utf-8″?> 
<s:Application xmlns:fx=”http://ns.adobe.com/mxml/2009″ xmlns:s=”library://ns.adobe.com/flex/spark” xmlns:mx=”library://ns.adobe.com/flex/mx” minWidth=”955″ minHeight=”600″> 
<fx:Declarations> 
<!– Flex项目release后图片资源不见了,图片资源采用嵌入与不嵌入的区别 更多示例请访问www.waylau.com–> 
</fx:Declarations> 
<fx:Script> 
<![CDATA[ [Embed(source="images/close.png")] [Bindable] public var imgCls:Class; ]]> 
</fx:Script> 
<s:VGroup> 
<s:Panel title=”嵌入测试”> 
<s:HGroup> 
<s:Button id=”btn1″ icon=”{imgCls}”/> 
<s:Button id=”btn2″ icon=”{imgCls}”/> 
</s:HGroup> 
</s:Panel> 
<s:Panel title=”未嵌入测试”> 
<s:HGroup> 
<s:Button id=”btn3″ icon=”images/myIco.png”/> 
<s:Button id=”btn4″ icon=”images/myIco.png”/> 
</s:HGroup> 
</s:Panel> 
</s:VGroup> 
</s:Application>

解决 Callout位置不更新的问题

2013-10-12 Flex

spark 手机 Callout组件可以实现子组件的分类
如下效果
但是在使用过程中发现Callout位置老是固定不变,
虽然里面的数据变了。
removeAllElements();
close();
也不好使。
查API 找到updatePopUpPosition();
需要在 close();之后使用,搞掂!

自定义Flex error tip 样式

2013-10-12 Flex

核心代码

s=”该分类下没有应用”;
myTip = ToolTipManager.createToolTip(s,event.currentTarget.x + event.currentTarget.width,   event.currentTarget.y+50,null, IUIComponent(event.currentTarget)) as ToolTip;
myTip.setStyle(“styleName”, “errorTip”);
myTip.width = 135;
myTip.height = 55样式 <fx:Style>
@namespace s “library://ns.adobe.com/flex/spark”;
@namespace mx “library://ns.adobe.com/flex/mx”;
.errorTip {
borderColor: #1F1F27;
backgroundColor :#1F1F27;
color: #ffffff;
fontFamily: Base02Embedded;
fontSize: 12;
fontWeight: normal;
}
  </fx:Style>

2013国庆“惠州——厦门”骑行活动总结及攻略

2013-10-06 Outdoor

从惠州骑行至厦门,三天骑行 600+ 公里,我们做到了!!

六字概况谓之“天时地利人和”。

  • “天时”,三天行程除第二日有短时毛毛雨外,其他时间以阴晴为主,老天还算给力~
  • “地利”,队员方向感还算比较强,对地形还算比较熟悉,一个百度地图基本上都能搞定~
  • “人和”,车还是要靠人踩的,队员们体力都很不错,特别是阿乃童鞋,之前一直没有踩车,出发前一夜才买了新车就上路了,最后竟然也能跟完全程,体能素质可见一斑;老郭、11度都是骑行的老将了,体力和维修都是好手;狂澜意志力很不错,脚扭伤了,都还能坚持走完全程。


CorelDRAW X4文件很大打开很卡,安装加速补丁(图解)

2013-09-04 CorelDRAW

CorelDRAW X4打开文件时,很卡,

首先,要确保你的文件和你的软件所在的硬盘要有充足的空间,别傻X的直接在U盘里面打开文件。

最好,放在除C盘以外的其他硬盘。

其次,来吧,安装补丁立马见效。 1.下载 下载地址: http://pan.baidu.com/share/link?shareid=1297224101&uk=907556543

2.解压 解压后有两个安装文件

http://g.hiphotos.bdimg.com/album/s%3D550%3Bq%3D90%3Bc%3Dxiangce%2C100%2C100/sign=5bdf4abd21a446237acaa567a8190333/4e4a20a4462309f7a6af9dd5730e0cf3d6cad630.jpg?referer=f0a115cf5243fbf29c3b911312ee&x=.jpg

3.安装 分别双击安装上述两个文件即可,默认安装即可

http://h.hiphotos.bdimg.com/album/s%3D550%3Bq%3D90%3Bc%3Dxiangce%2C100%2C100/sign=04c5c50afd039245a5b5e10ab7afd5ff/c2fdfc039245d68813348163a5c27d1ed31b24c6.jpg?referer=8cf0fd1aaa64034f56daf63684dc&x=.jpg

http://h.hiphotos.bdimg.com/album/s%3D550%3Bq%3D90%3Bc%3Dxiangce%2C100%2C100/sign=6309345acaef7609380b999a1ee6d2f1/30adcbef76094b36c3522b2aa2cc7cd98c109d30.jpg?referer=f6d8b9c65d6034a870f58fb1dbee&x=.jpg

http://c.hiphotos.bdimg.com/album/s%3D550%3Bq%3D90%3Bc%3Dxiangce%2C100%2C100/sign=4d4e455e8326cffc6d2abfb7893a3bad/42a98226cffc1e177089bff64b90f603728de9c7.jpg?referer=98d2f424562c11df87c68b1357dd&x=.jpg

http://c.hiphotos.bdimg.com/album/s%3D550%3Bq%3D90%3Bc%3Dxiangce%2C100%2C100/sign=95da21889f2f07085b052a05d91fc9a4/267f9e2f070828380d3cefd3b999a9014d08f1c7.jpg?referer=825e9ed5730e0cf3f9e07acb3fdd&x=.jpg

 


Apache Maven 3.1.0 安装、部署、使用

2013-09-03 Java Maven

##一、下载

下载页面http://maven.apache.org/download.cgi 找到最新的 ,本例为Maven 3.1.0

http://mirrors.cnnic.cn/apache/maven/maven-3/3.1.0/binaries/apache-maven-3.1.0-bin.zip

##二、安装

1.解压zip ,将apache-maven-3.1.0文件夹拷贝至C:\Program Files\Apache Software Foundation 目录下

2.在环境变量中添加一个用户变量(如果不成功,也可以添加到系统变量中)

变量:M2_HOME

值:C:\Program Files\Apache Software Foundation\apache-maven-3.1.0

3.在环境变量中的系统变量的path添加一个

%M2_HOME%\bin

4.校验

Cmd 模式下 输入

mvn --version

出现以下画面,则安装成功!

##三、配置

建一个文件夹作为仓位: 我的是在d:\ workspaceMaven

C:\Program Files\Apache Software Foundation\apache-maven-3.1.0\conf目录下找到 settings.xml文件,

打开文件找到被注释的 <localRepository>/path/to/local/repo</localRepository>

将它启动,写上仓库的路径,

即为<localRepository>D:\workspaceMaven</localRepository>

如下效果

打开cmd,输入

mvn help:system

如果配置正确,将开始从中央仓库下载文件至4中配置的本地仓库。该过程持续时间因网络带宽影响可能持续时间很长。

见下图,则配置成功

仓库下会多出很多文件

##四、使用

找一个maven的项目。本例为“cat78”,放到任意目录下

2.cmd 下 执行cd cat78到该目录下

运行

mvn clean compile

此时,项目开始编译

又需要一段时间来下载相关jar包、pom文件

3.编译完成 ,会生产.bat可运行文件,双击运行就行了~

完整的使用教程,请访问使用maven编译Java项目


MySQL 在 Windows 平台下的安装、使用(图解)

2013-08-19 MySQL Windows

一、 首先电脑要具备.Net Framework 4 以上环境 二、 MySQL下载、安装、执行

  1. 下载http://cdn.mysql.com/Downloads/MySQL-5.6/mysql-5.6.13-win32.zip
  2. 安装 点击“install MySQL products” 选中“I accept the licence terms”,点击next

选中“Skip the check for updates” ,Next

选中“custom”,Next

Next

Execute

Next

Execute

Next

Next

Next

设置root密码“root”,Next

Next

Next

Next

Finish

  1. 使用 这个是主页面

Databases->Query Database

连接本地实例“Local instance MySQL 56”,OK

填密码,选中保存,OK

输入查询语句,CREATE DATABASE waylau DEFAULT CHARACTER SET ‘utf8’; use waylau; create table users (user_no char(5) not null, user_name char(50) ); 执行

刷新左侧树形栏,出现刚刚执行的库和表,则说明使用成功!!


2013-8-11惠州——三洲田、大梅沙骑行,作业贴,骑行攻略

2013-08-12 Outdoor

这次骑行找不到队友啊,只能独骑闯大梅沙了~
七点出发,经过仲恺、 镇隆镇 、 新圩镇 、 坪地镇基本上九点多到深圳龙岗界内。进行了第一次休整 。
发觉市区的环境确实很恶劣,特别是骑行道,很多障碍。提不起速度。
建议走汽车道。尾气很重,差点熏死我~
在市区内就要开启导航了。因为要转拐的路段较多。
干,竟然走到了绝路,晕。。
经过三洲田大桥就要注意了,因为很快三洲田的入口就要出现了。
有个十字路口,但是 没有提示,左拐过去看了牌子才发现有“东部华侨城”“xx酒店”字样的,就是入
口了。
预示着一段艰辛的爬坡路段开始了......
盘上公路直插云霄啊,喜欢爬坡的车友鸡冻了,有木有......
居然有女汉子。。。猛!
吓尿了吧。。。。。
高架桥攀爬完毕,给小so留个念。
高兴太早了,后面的路段更曲折。
顾不上拍照了,直喘气。神马房车酒店、主题公园、欧式风情、小火车都是一瞟而过。攀顶。攀顶。
见“江山如此多娇”,恭喜,攀顶成功!俯瞰群山和大海吧~
稍作修息,准备下山了。最好先检查刹车,要速降了 。妖~
半山腰,寻一水潭,比较隐蔽,纯天然矿泉水,喝上五瓶先~
正直当午,果断宽衣解带,泡潭咯~ 太凉了,鸡皮疙瘩都起来了。爽!!
爽完就要下山了。速降了,一路刹~车很多,要注意安全。~
下到山脚,左拐 ,沿着海边骑行道走就可以了,可以经过大、小梅沙海滩。
人忒多了,实现没有下海的冲动了。~
很多免费的海滩也很不错哦,好清新
回程了,肚子果断叫唤了,才发觉没有吃午饭,我汗。。。秀色可餐啊~
貌似也过了吃饭的店,饭店没啥吃的了。到葵涌镇补充干粮
其他返程的就不多说了,一路飙回惠州吧》~
另外,回程路上遇上一个骑友,说是要上北京 。吓到,
但看他没有专业的山地车,没有防护装备,坐垫还是棉被裹的,我汗。估计有点悬
他是深圳出发的,要经过惠州,一路看地图找不到路。于是,我他带到惠州。
离别了嘱咐他多跟家人保持联系。长路漫漫多珍重~
总结:龙岗市区环境很恶劣,做好防护准备
从三洲田速降大梅沙的时候,刹车一定要检查好
全程往返170公里左右
花费:
纯天然矿泉水 450 ml * 5 0元
XX糕点 5只装 4元
雪碧2L 8元
康师傅矿泉水550ml 2元
共计: 14元
用最少的钱走最远的路

 


纯AS3项目利用 Adobe AMF3 协议与 Java 交互,示例

2013-08-03 ActionScript3 Java

package 
{ 
    import flash.net.NetConnection; 
    import flash.net.ObjectEncoding; 
    import flash.net.Responder; 

    public class Amf3ServiceInvoker  
    {              

       private var nc : NetConnection = new NetConnection();    
       private var responder : Responder = null; 
       private const amf3URL : String = “http://gcc.waylau.com:8080/messagebroker/amf”; 

       public function Amf3ServiceInvoker(result : Function, error : Function) 
       {                     
           responder = new Responder(result, error);  
           super(); 
       } 

       public function getWeather2(city: String) : void{ 
           nc.objectEncoding = ObjectEncoding.AMF3;  
           nc.connect(amf3URL);      
           nc.call(“amf3ServiceInvoker.getWeather2″, responder, city); 
       } 

    } 
}

2013-7-28惠州——东莞大岭山松山湖骑,作业贴,骑行攻略

2013-07-29 Outdoor

一行三人,出门还有丝丝细雨。于是放弃了防晒装备(后面因此付出代价) 骑行的线路大致是酱紫滴 惠州学院对面,华康医院附近出发, 沿演达大道,向北 下演达立交,进入三环南路,经过师大立交,进入仲恺大道 下面的路段,基本上是闭着眼睛也不会走错啦~

补过,过仲恺的时候确实应该发下牢骚, 这路确实是太狗血了~啦~见图~

并且在这途中,还遗失了一位队友, 顶。~

后来 还是 找回来啦~ 咔咔

托了高铁的福,我一直叫他沿着高铁柱子走。~

继续出发

仲恺五路、仲恺六路、仲恺八路,过沥林镇,谢岗镇,樟木头镇,黄江镇一路都是笔直的 樟木头和黄江有一大坡相隔,需要冲坡!!

只要沿着大道走,就不会走X 。 出黄江镇再走一段,就要准备左转了。~ 地图导航显示的位置大概是 金朗南路的杨涌村,往西南方向走, 擦~ 全是 村间小道 ,感觉地图导航坑了我~ 不过经过新马莲村,却意外看到了一池子 好荷花! 正是好景六月中,风光不与四时同也~

一直吧,跨过那漫漫的田野, 擦~ 人迹开始罕见~ 晴空开始骄阳 除了几个工业区。 最后竟然还走到了路的尽头~

。。。汗。没路了后,只好右拐穿过莞佛高速~ 到达东莞水平商贸城,

看地图离目的地址不远,遂先填饱肚子 一碗木桶饭顶住先~

饭饱后继续前行,沿着美景西路(X241) 到达西牛陂广场 ,就要往小路往西走了~

直到 环湖路 环湖路 环的就是松山湖啊 ,亲,差不多到了~

再往西走一段路程,就能看到大门,进了门,就 尽情的绕湖吧~~~~~~~~

景区内还有马术场,不错,威远

回程路线:

绕完湖,沿着大学路朝大朗方向走,

无需约定,路程中,总能相会~

沿美景中路、美景东路,到达大朗镇,

至此与队友分别,

这些哥们实在是顶不住了。 独自再沿金朗中路、黄江方向 直线 飚回惠州, 期间口渴的不行, 买了瓶2L美年达,呼呼一口气干了二分之一,爽啊!!!!!

行吧,最后一张金华火腿

总结: 去程约77公里,全程往返154公里左右(数据来源百度地图) 花费: 康师傅矿泉水550ml 2元 木桶饭 8元 美年达 汽水2L 7元 共计17元


AsWing 应用之JTable的例子

2013-07-26 ActionScript3 AsWing

package
{
	import flash.display.Sprite;
	import org.aswing.ASColor;
	import org.aswing.JScrollPane;
	import org.aswing.JTable;
	import org.aswing.VectorListModel;
	import org.aswing.event.SelectionEvent;
	import org.aswing.table.PropertyTableModel;
	import org.aswing.table.sorter.TableSorter;
	/**
	 * 一个AsWing JTable的例子
	 *@author waylau.com
	 *@data 2013-7-26
	 */
	public class JTableExample extends Sprite
	{
		private var data:Array = [];  //表格数据源
		private var columns:Array = [];  //列项
		private var table:JTable;
		/**
		 * PropertyTableModel是JTable的表格模型之一,常常用于把一个对象列表中的对象数据,以对象为行,
		 * 以对象属性为列来显示,它提供默认方式把属性值以直接字符串化显示,也提供转换器(PropertyTranslator 或Function)
		 * 把值转换成期望的字符串格式来显示
		 */
		private var tableModel:PropertyTableModel; 
		/**
		* VectorListModel是AsWing自带的ListModel 实现,它的行为类似一个Vector, 
		* 可以随意在任何位置插入/删除数据,并且在数据改变时,会自动触发对应的事件,使得JList 自动更新界面显示。
		*/
		private var modeList:VectorListModel; 
		/**
		 * TableSorter表格排序器。它是TableModel 接口的一个实现,通过包装一个现有的 TableModel 来实现排序。
		 * 实现原理为:以选择排序方式为基准,变换原始TableModel 类的行的值,以达到变换行顺序的目的。
		 * 排序所采用的值比较函数,可以通过给指定列设定列类型,然后给指定列类型设定比较函数来达到。
		 * 默认情况下,所有列的类型都是Object 类型,TableSorter 自带String 和Number 类型的比较函数,
		 * 对于没有指定比较函数的列,默认将采用String 类型的比较函数
		 */
		private var sorter:TableSorter;

		public function JTableExample()
		{
			super();
			init();
		}

		private function init():void
		{		
			this.stage.frameRate = 25;
			data = [{name:"iiley", sex:1, age:26, score:99},
				{name:"Comeny", sex:0, age:24, score:100},
				{name:"Tom", sex:1, age:30, score:98},
				{name:"Lita", sex:0, age:16, score:36}]
			;
			modeList = new VectorListModel(data);
			columns = ["Name", "Sex", "age", "Score"] ;
			tableModel = new PropertyTableModel(modeList,columns,["name","sex","age","score"],[null,sexTranslator,null,null,]);
			sorter = new TableSorter(tableModel);

			this.table = new JTable(sorter);
			this.table.setRowHeight(22);
			//水平间隔线
			table.setShowHorizontalLines(false);
			//竖直间隔线
			table.setShowVerticalLines(false);
			//设置字体颜色,前景色
			 table.setForeground(new ASColor(0xffffff));
			//设置选中行的时候的字体颜色
			table.setSelectionForeground(new ASColor(0x123456));
			//拉伸的模式,随意拉伸
			this.table.setAutoResizeMode ( JTable.AUTO_RESIZE_OFF );
			//只能选择一行
	 		this.table.setSelectionMode ( JTable.SINGLE_SELECTION );
			//设置表格底色
			this.table.setBackground(new ASColor(0x000000));
			//设置监听row选中
			this.table.addEventListener(SelectionEvent.ROW_SELECTION_CHANGED,__rowSelectHandler);

			var panel:JScrollPane = new JScrollPane();
			panel.setSizeWH(200, 100);
			panel.append(this.table);
			this.addChild(panel);
		 	panel.validate();
		}
		/**
		 * row选择执行事件
		 */
		private function __rowSelectHandler(e:SelectionEvent):void
		{
			var rowCount : int = this.table.getSelectedRow();

			if(rowCount&gt;0)
			{
				var row:Object = modeList.getElementAt(sorter.modelIndex(rowCount));
			}
			if(row!=null)
			{
				trace("Human"+" Name:"+row.name+",Sex:"+row.sex+",Age:"+row.age+",Score:"+row.score);
			}
		}
		/**
		 * 性别转换器
		 */
		private function sexTranslator(info:*, key:String):String
		{
			if(info[key]=="1")
			{
				return "男";
			}
			else
			{
				return "女";
			}
		}
	}
}  参考:

http://www.aswing.org/?tag=jtable

http://wiki.9ria.com/index.php/Aswing

http://www.ebibi.com/i/study/2010/0913/1262.html


纯AS3项目导入fl包的方法以及fl.controls.DataGrid的详细应用

2013-07-05 ActionScript3

在Flash CS4中打开“D:\Program Files\Adobe\Adobe Flash CS4\Common\Configuration\Components\”目录下的“User Interface.fla”文件 进入文件—发布设置—Flash—勾选“导出SWC” 点“导出影片”,输入文件名,确定之后就出现了swc文件 进入Flash builder,在ActionScript项目属性中引用刚刚导出的swc文件 这时就可以在源代码中 import fl.controls.* 并使用Flash CS4中的UI组件了

另外fl.controls.DataGrid的详细应用

参见:http://edutechwiki.unige.ch/en/Flash_datagrid_component_tutorial

http://crazyrabbit.blogbus.com/logs/38711416.html


AS3使用thrift的与JHava servlet服务器端通信

2013-06-22 ActionScript3 Java

##一、基本概念

Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 等等编程语言间无缝结合的、高效的服务。

Thrift最初由facebook开发,07年四月开放源码,08年5月进入apache孵化器。thrift允许你定义一个简单的定义文件中的数据类型和服务接口。以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的无缝跨编程语言。

官网地址:http://thrift.apache.org

###1.数据类型

基本类型: bool:布尔值,true 或 false,对应 Java 的 boolean byte:8 位有符号整数,对应 Java 的 byte i16:16 位有符号整数,对应 Java 的 short i32:32 位有符号整数,对应 Java 的 int i64:64 位有符号整数,对应 Java 的 long double:64 位浮点数,对应 Java 的 double string:utf-8编码的字符串,对应 Java 的 String 结构体类型: struct:定义公共的对象,类似于 C 语言中的结构体定义,在 Java 中是一个 JavaBean 容器类型: list:对应 Java 的 ArrayList set:对应 Java 的 HashSet map:对应 Java 的 HashMap 异常类型: exception:对应 Java 的 Exception 服务类型: service:对应服务的类

###2.服务端编码基本步骤:

实现服务处理接口impl 创建TProcessor 创建TServerTransport 创建TProtocol 创建TServer 启动Server 3.客户端编码基本步骤:

创建Transport 创建TProtocol 基于TTransport和TProtocol创建 Client 调用Client的相应方法 4.数据传输协议

TBinaryProtocol : 二进制格式. TCompactProtocol : 压缩格式 TJSONProtocol : JSON格式 TSimpleJSONProtocol : 提供JSON只写协议, 生成的文件很容易通过脚本语言解析 tips:客户端和服务端的协议要一致

##二、as3与java通信示例

test.thrift namespace java com.xzw.thrift namespace as3 com.xzw.thrift struct User{ 1:i32 userId, 2:string loginName, 3:string password, 4:string name }

exception UserNotFound{ 
    1:string msg  //as3中由于message是关键字,所以避免使用message关键字。 
} 

service UserService{ 
    User getUser(1:string loginName) throws (1:UserNotFound unf), 
    list&lt;User&gt; getUsers() 
}  通过命令生成java代码

thrift –gen java test.thrift

以上命令会生成gen-java的目录拷贝里面的代码到你的项目中。如图com.xzw.thrift就是

工具生成java类。

其中我们需要去实现UserService类中的IFace接口。代码如下: /* * To change this template, choose Tools Templates * and open the template in the editor. */ package com.xzw.service;
import com.xzw.thrift.User; 
import com.xzw.thrift.UserNotFound; 
import com.xzw.thrift.UserService; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.logging.Logger; 
import org.apache.thrift.TException; 

/** 
 * 
 * @author xzw 
 */ 
public class UserServiceHandler implements UserService.Iface{ 

    public User getUser(String loginName) throws UserNotFound, TException { 
        if(!"xuzhiwei".equals(loginName)){ 
            UserNotFound e = new UserNotFound("用户无法找到!"); 
            throw e; 
        }  
        User user = new User(); 
        user.setUserId(100); 
        user.setLoginName("xuzhiwei"); 
        user.setPassword("123456"); 
        user.setName("user1"); 
        Logger.getLogger("user=&gt;"+user.toString()); 
        return user;  
    } 

    public List&lt;User&gt; getUsers() throws TException { 
       List&lt;User&gt; list = new ArrayList&lt;User&gt;();   
        User user = new User();   
        user.setUserId(100);   
       user.setLoginName("xuzhiwei"); 
        user.setPassword("123456"); 
        user.setName("user1");   
        list.add(user);   
        User user2 = new User();   
        user2.setUserId(200);   
        user2.setLoginName("login2");   
        user2.setPassword("pwd2");   
        user2.setName("user2");   
        list.add(user2);   

         Logger.getLogger("user list=&gt;"+list.toString()); 
        return list;   
    } 

}
编写servlet,servlet需要继承thrift提供的类包TServlet即可,不需要去重写doGet,doPost方法。 /* * To change this template, choose Tools Templates * and open the template in the editor. */ package com.xzw.service;
import com.xzw.thrift.UserService; 
import org.apache.thrift.protocol.TBinaryProtocol; 
import org.apache.thrift.server.TServlet; 

/** 
 * 
 * @author xzw 
 */ 
public class UserServlet extends TServlet{   

     public UserServlet(){   
         super(new UserService.Processor(new UserServiceHandler()),new TBinaryProtocol.Factory(true, true)); 
     }        
}

以上就完成服务器端的编写了。

可以使用junit测试一下: /* * To change this template, choose Tools Templates * and open the template in the editor. */
import com.xzw.thrift.User; 
import com.xzw.thrift.UserService; 
import java.util.List; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import org.apache.thrift.TException; 
import org.apache.thrift.protocol.TBinaryProtocol; 
import org.apache.thrift.protocol.TProtocol; 
import org.apache.thrift.transport.THttpClient; 
import org.junit.*; 

/** 
 * 
 * @author xzw 
 */ 
public class TestServlet { 

     @Test 
    public void test(){ 
        String serveltUrl = "http://localhost:8080/test_thrift/userServlet"; 
        try { 
            THttpClient thc = new THttpClient(serveltUrl); 
            TProtocol lopFactory = new TBinaryProtocol(thc); 
           UserService.Client client = new UserService.Client(lopFactory); 

           List users = client.getUsers(); 
           System.out.println("--&gt;&gt;"+users.toString()); 
        } catch (TException ex) { 
            Logger.getLogger(TestServlet.class.getName()).log(Level.SEVERE, null, ex); 
        } 
   } 

    @Test 
    public void test2(){ 
        String serveltUrl = "http://localhost:8080/test_thrift/userServlet"; 
        try { 
            THttpClient thc = new THttpClient(serveltUrl); 
            TProtocol lopFactory = new TBinaryProtocol(thc); 
           UserService.Client client = new UserService.Client(lopFactory); 

           User user = client.getUser("xuzhiwei"); 
           System.out.println("--&gt;"+user.toString()); 
        } catch (TException ex) { 
            Logger.getLogger(TestServlet.class.getName()).log(Level.SEVERE, null, ex); 
        } 
   } 
}

接下来生成as3代码

thrift –gen as3 test.thrift www.it165.net

以上代码会生成gen-as3的目录,拷贝目录下的代码到你的工程中。

编写as3客户端类:

package { 
import com.xzw.thrift.User; 
import com.xzw.thrift.UserNotFound; 
import com.xzw.thrift.UserService; 
import com.xzw.thrift.UserServiceImpl;

    import flash.display.Sprite; 
    import flash.net.URLRequest; 
    import flash.text.TextField; 

    import org.apache.thrift.protocol.TBinaryProtocol; 
    import org.apache.thrift.protocol.TProtocol; 
    import org.apache.thrift.transport.THttpClient; 

    public class testthrift extends Sprite 
    {  
        private const SERVER_URL:String = "http://localhost:8080/test_thrift/userServlet";  
        private var textField:TextField; 

        public function testthrift() 
        {  
            init(); 
            connServer();  
        } 

        private function init():void 
        { 
            textField = new TextField();  
            textField.width = 300; 
            textField.height = 500;  
            textField.autoSize = "left"; 
            addChild(textField); 
        } 

        private function connServer():void 
        {   //实例化URLRequest 
            var urlRequest:URLRequest = new URLRequest(SERVER_URL); 
            //实例化THttpClient 
            var thc:THttpClient = new THttpClient(urlRequest); 
            var protocol:TProtocol = new TBinaryProtocol(thc); 

            var usImpl:UserService = new UserServiceImpl(protocol); 
            usImpl.getUser("xuzhiwei",onError,onUserSuccess); 
            //usImpl.getUsers(onError,onSuccess); 
        } 

        private function onError(e:UserNotFound):void{ 
            trace(e); 
        } 

        private function onUserSuccess(user:User):void{ 
            trace("success:"); 
            trace(user); 
            textField.text = user.toString(); 
        } 

        private function onSuccess(user:Array):void{ 

            trace(user); 
            textField.text = user.toString(); 
        } 

    } 
}

写完了,测试结果

参考:http://xuzhiwei.blog.51cto.com/978424/1184540

http://jnb.ociweb.com/jnb/jnbJun2009.html


由“JasperReports 4.1.2升级到5.1.2对flex项目的解析”到AS3 带命名空间的XML的操作

2013-06-21 JasperReports

项目中,对JasperReports-4.1.2核心包进行了升级,发现,前端flex无法对JasperReports的格式进行解析了~

iReport 4.1 设计的模版可以解析,而iReport 4.6 设计的模版就不行了~

断点后,对比了从后台传过来的JasperReports 的xml数据,发现存在差异

4.1.2包生成的xml数据jasperPrint标签为:

<jasperPrint name="report13" pageWidth="842" pageHeight="842" topMargin="0" leftMargin="0" bottomMargin="0" rightMargin="0" locale="zh_CN" timezone="Asia/Shanghai"> 5.1.2包生成的xml数据jasperPrint标签为:

<jasperPrint xmlns="http://jasperreports.sourceforge.net/jasperreports/print"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/print
http://jasperreports.sourceforge.net/xsd/jasperprint.xsd" name="report13"
pageWidth="842" pageHeight="842" topMargin="0" leftMargin="0" bottomMargin="0"
rightMargin="0" locale="zh_CN" timezone="Asia/Shanghai">

后期版本的JasperReports核心包多生成了命名空间

而之前官方提供JasperReports 的flex解析包net.sf.jasperreports.flex (来自JasperReports的项目示例jasperreports-flash-4.0.0-project.zip)任然停留在2010年的版本未更新(估计JasperReports放弃了对flash的支持),导致无法对新版本的xml数据进行解析

AS3对于带命名空间的XML的解析操作上有很大的差异,例如以下来自JasperReports的ReportFactory.as

var props:XMLList = xml.property;
		for each (var prop:XML in props)
		{
			if (prop.@name == "net.sf.jasperreports.export.xml.start.page.index")
			{
				report.startPageIndex = int(prop.@value);
			}
			if (prop.@name == "net.sf.jasperreports.export.xml.end.page.index")
			{
				report.endPageIndex = int(prop.@value);
			}
			if (prop.@name == "net.sf.jasperreports.export.xml.page.count")
			{
				report.pageCount = int(prop.@value);
			}
		}

由于新版本多了命名空间,所以 直接xml.property 是无法获取到property的。要带上命名空间

var ns:Namespace = new Namespace("http://jasperreports.sourceforge.net/jasperreports/print");
trace(xml.ns::property);    //输出带名字空间的XML

由于 涉及到多个 命名空间,这种方式在该项目中不合适,且要修改后续的其他操作。

最简单的方式,就是 干掉命名空间,这样后续操作不变。

这个就涉及到XML的操作了。查XML api发现了removeNamespace(ns:Namespace):XML方法,以为轻松搞定,实验后 ,发现 不行。默认的命名空间(如 xmlns=”http://jasperreports.sourceforge.net/jasperreports/print”)无法删除。

用xml.children()方法取他孩子,发现,每个孩子也带上了命名空间。

最后用上了正则表达式。限定类型的命名表达式可以删除了。而且用了两次。汗。。

       var str:String = oldxml.toString();

       var str2:String = str.replace(/xmlns(.*?)="(.*?)"/gm, "").replace(/xsi(.*?)="(.*?)"/gm, "");

        xml = new XML(str2);

FlashBuilder4.7更新AIR SDK方法

2013-06-15 AIR

默认情况下,Flash Builder 4.7安装了AIR SDK 3.4。如果你想使用别的SDK版本,你覆盖掉它就行了。下面就来介绍一下如何覆盖。 下载合适的AIR SDK文件:http://labs.adobe.com/downloads/asc2.html ,然后保存到AIR SDK的根目录(是SDK的根目录)。 注意了:这个AIR SDK包含了:Adobe AIR SDK、ActionScript编译器以及其它必需的组件和文件。 在进入以下步骤前,先退出Flash Builder: 在Flash Builder里更新AIR SDK的步骤: 1.(可选)备份旧的AIR SDK,把整个SDK目录都复制一份吧。AIR SDK的目录是在(因人而异,但大概一样): Windows 7: C:\Program Files (x86)\Adobe\Adobe Flash Builder 4.7\eclipse\plugins\com.adobe.flash.compiler_4.7.0.349722 Mac OS: /Applications/Adobe Flash Builder 4.7/eclipse/plugins/com.adobe.flash.compiler_4.7.0.349722

  1. 在备份完后,删除SDK文件夹里的所有文件(译者注:这个SDK文件夹的名字为“AIRSDK”。只删除SDK文件夹里的文件,不要把SDK文件夹也删除了)。
  2. 下载的SDK通常是一个压缩包(zip/tbz2)。解压这个包,提取所有文件,把文件复制到那个名为“AIRSDK”的文件夹。

参考Adobe 原文:http://helpx.adobe.com/flash-builder/kb/overlay-air-sdk-flash-builder.html


一个用于检测FPS和内存占用的小例子

2013-06-14 ActionScript3

用于实时检测FPS(实际上可以算是检测CPU)和内存占用情况。

使用方法,在application的Document Class(或者Application Class)上构建一个检测器实例(MonitorKit)并addChild即可,所含参数比较简单,不再一一赘述:

 var monitor:MonitorKit = new MonitorKit(MonitorKit.MKMODE_T);
addChild(monitor);
package 
{
  import flash.display.Sprite;
  import flash.display.Stage;
  import flash.events.Event;
  import flash.system.System;
  import flash.text.TextField;
  import flash.text.TextFieldAutoSize;
  import flash.text.TextFormat;
  import flash.utils.getTimer;

  public class MonitorKit extends Sprite{
    public static const MKMODE_T:String = "MKMODE_T";
    public static const MKMODE_B:String = "MKMODE_B";
    public static const MKMODE_L:String = "MKMODE_L";
    public static const MKMODE_R:String = "MKMODE_R";
    public static const MKMODE_TL:String = "MKMODE_TL";
    public static const MKMODE_TR:String = "MKMODE_TR";
    public static const MKMODE_BL:String = "MKMODE_BL";
    public static const MKMODE_BR:String = "MKMODE_BR";

    private static var stageInstance:Stage;

    private var lastTime:uint = getTimer();
    private var frames:Number = 0;
    private var monitorKitTextField:TextField;
    private var mode:String;
    private var textColor:uint;
    private var backgroundColor:uint;
    private var transparent:Boolean;
    public static var delay:Number = 0;
    public function MonitorKit(_mode:String = MKMODE_T,
        _transparent:Boolean = true,
        _textColor:uint=0xffffff,
        _backgroundColor:uint=0x000000) {
      mode = _mode;
      transparent = _transparent;
      textColor = _textColor;
      backgroundColor = _backgroundColor;
      // Initialize it when rendered on the stage.
      addEventListener(Event.ADDED_TO_STAGE, initMonitorHandler);
    }

    private function initMonitorHandler(event:Event):void {
      // Unregister the event handler
      removeEventListener(Event.ADDED_TO_STAGE, initMonitorHandler);
      stageInstance = this.stage;
      monitorKitTextField = new TextField();
      monitorKitTextField.selectable = false;
      monitorKitTextField.background = transparent;
      monitorKitTextField.textColor = textColor;
      monitorKitTextField.backgroundColor = backgroundColor;
      monitorKitTextField.autoSize = TextFieldAutoSize.LEFT;
      var format:TextFormat = new TextFormat();
      format.font = "Courier New";
      format.size = 15;
      monitorKitTextField.setTextFormat(format);
      monitorKitTextField.defaultTextFormat = format;
      monitorKitTextField.text = "[ Loading... ]";
      addChild(monitorKitTextField);
      stageInstance.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
    }

    public function enterFrameHandler(evt:Event):void {
      frames++;
      var currentTime:uint = getTimer();
      var deltaTime:uint = currentTime - lastTime;
      var fps:Number = frames / deltaTime * 1000;
      monitorKitTextField.text = "FPS: " + fps.toFixed(1);
      monitorKitTextField.appendText("\nMem: " + Number(System.totalMemory/1024/1024).toFixed(3)+"(M)");
      frames = 0;
      lastTime = currentTime;
      // Replace the monitor object
      switch (mode) {
        case MKMODE_T:
          monitorKitTextField.x = stageInstance.stageWidth / 2 - monitorKitTextField.width / 2;
          monitorKitTextField.y = 0;
          break;
        case MKMODE_B:
          monitorKitTextField.x = stageInstance.stageWidth / 2 - monitorKitTextField.width / 2;
          monitorKitTextField.y = stageInstance.stageHeight - monitorKitTextField.height;
          break;
        case MKMODE_L:
          monitorKitTextField.x = 0;
          monitorKitTextField.y = stageInstance.stageHeight / 2 - monitorKitTextField.height / 2;
          break;
        case MKMODE_R:
          monitorKitTextField.x = stageInstance.stageWidth - monitorKitTextField.width;
          monitorKitTextField.y = stageInstance.stageHeight / 2 - monitorKitTextField.height / 2;
          break;
        case MKMODE_TL:
          monitorKitTextField.x = 0;
          monitorKitTextField.y = 0;
          break;
        case MKMODE_TR:
          monitorKitTextField.x = stageInstance.stageWidth - monitorKitTextField.width;
          monitorKitTextField.y = 0;
          break;
        case MKMODE_BL:
          monitorKitTextField.x = 0;
          monitorKitTextField.y = stageInstance.stageHeight - monitorKitTextField.height;
          break;
        case MKMODE_BR:
          monitorKitTextField.x = stageInstance.stageWidth - monitorKitTextField.width;
          monitorKitTextField.y = stageInstance.stageHeight - monitorKitTextField.height;
          break;
        default:
        break;
      }
    }
  }
} 

AIR SDK 0 AIR SDK location does not exist 解决

2013-06-05 AIR

导入AS3项目时提示 “AIR SDK 0.0: AIR SDK location "D:\Program Files\Adobe Flash Builder 4.7\eclipse\plugins\com.adobe.flexbuilder.flex_4.7.0.349722\devsdks\AIRSDK\Win" does not exist.”

是AS3项目找不见AIR SDK. 打开项目配置 ActionScript Build Path ,路径出错。

他默认是去Flash Builder 4.7安装目录下的..\Adobe Flash Builder 4.7\eclipse\plugins\com.adobe.flexbuilder.flex_4.7.0.349722\devsdks\AIRSDK\Win去找。

但是 我的Builder根本没有这个Win文件

##解决步骤:

###1. 先去官网下载下载和更新SDK

可参考此文http://www.waylau.com/update-air-sdk-flash-builder

###2. 如果上述方法无效

..\Adobe Flash Builder 4.7\eclipse\plugins\com.adobe.flexbuilder.flex_4.7.0.349722\ 目录下创建 devsdks文件夹,再在devsdks创建AIRSDK,再在AIRSDK下创建Win 即创建它搜索的那个路径

###3.将下载的AIRSDK中的文件复制进新建的Win文件夹下。

###4.回到配置界面ActionScript Build Path移除之前的AIRSDK,再点击“ADD AIR SDK”


iReport 5.1.0下载、安装、创建数据源、制作报表

2013-05-22 iReport

一、ireport下载最新版

本例为5.1.0 http://sourceforge.net/projects/ireport/files/?source=navbar

二、安装,直接下一步

三、ireport连接数据库,创建数据源

默认数据源是空的 ,需要自己创建数据源,当然也可以选择他的测试数据库

 

1.点击图中按钮,弹出窗,点击 new

 

2.这里选择的是 Database JDBC Connection

 

3.iReport默认的数据库驱动为黑色字体部分,红色字体需另外导入包

 

4.工具à选项

 

5.在Classpath添加数据库驱动包

这里我们连接的是sql2000数据库,填加一个jtds-1.2.2.jar

 

6.再回到之前的那个数据源设置界面

net.sourceforge.jtds.jdbc.Driver 变成了黑色。选中它

 

7.JDBC URL中填入数据库的地址和库名,并填入正确的用户名和密码。

本例选用了一个已经存在的数据库。

点击Test,提示test succesful则说明连接成功。

输入Name, 本例为”EEMS”。

点击Save保存设置。

 

四、新增报表模版

1.文件 –>new file,选择blank A4 ,点击 launch report wizard

 

2.填入报表名称,选择输出的目录

 

3.直接填入查询sql语句,或者选择load query导入已有的sql文件

本例选用design query 采用可视化界面来设计sql语句

 

双击选中的数据库表,选择要查询的字段

 

点击OK,自动生成了sql语句

 

4.选择要参与的字段

 

这里向右移入所有字段

 

5.选择要分组的字段

这里选择loginName字段

 

6.出现下面提示,说明模版创建成功!

 

五、设计报表

 

报表的结构包括如下部分:Title、Page Header、Column Header、Detail、Column Footer、Page Footer、Summary.下面一一的介绍各个部分。

Title:为报表的标题部分,如果报表有多页,则只显示在第一页。

Page Header :为报表每页的一个头部名称,如果报表有多页,则每页都会显示。

Column Header:可以理解成表头,如果报表有多页,则每页都会显示。

Detail:详细记录,迭代列出所有的查询结果,有多少数据都会显示出来(分页)。

Column Footer:相当于表尾,如果报表有多页,则每页都会显示。

Page Footer:与Page Header对应,每页都会显示。

Summary:报表的一些统计信息。比如共有多少页,当前是第几页等信息。

设计报表的要求是:列出所有用户的信息,(查询语句决定。)

1.从组件面板中,拖出一个 Static Text 组件来,放置在报表的Title部分,输入”用户列表”。

 

2.在Page Header 也同样拖入一个 Static Text 组件,输入”管理员”

3.展开左侧的 Report Inspector,展开Fields子项,

 

将图所示的字段,拖入Detail项中,此时会发现,Column Header项中自动填充了Static Text的表头,如图所示:

 

在右侧”属性”,也可以对表头进行编辑,重命名等操作。可以调整各组件的位置、大小等信息。

 

4.选择 预览方式,这里选HLML

 

5.点击预览,选择Preview

 

6.显示数据库数据啦,成功啦。~


Activiti 5.12.1 下载、安装和运行

2013-05-18 Activiti

一、下载和安装

activiti下载:

本例子版本:activiti-5.12.1.zip

http://www.activiti.org/download.html

 

JDK 下载 JDK 6+

本例子版本:jdk7

http://www.oracle.com/technetwork/java/javase/downloads/index.html

eclipse下载 Eclipse Indigo and Juno:

本例子版本:Eclipse Juno (4.2)

http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/juno/SR2/eclipse-jee-juno-SR2-win32.zip

 

解压activiti-5.12.1.zip获取activiti-explorer.war

001

 

activiti-explorer.war 拷贝至Tomcat.(或其他java web服务器,本例为Tomcat 6.0)的webapps目录下

二、运行

启动tomcat,在浏览器打开项目(本例子tomcat端口为8089)

http://localhost:8089/activiti-explorer/

 

003

 

见到这个界面说明项目运行成功了!

默认使用的是内存数据库 H2,下面为数据库表

Table 用户和分组

UserId

Password

Security roles

kermit

kermit

admin

gonzo

gonzo

manager

fozzie

fozzie

user

 

可以使用上面的账号登入系统(本例为kermit)

004

 


Flex4.6 textArea 文字换行 示例

2013-05-13 Flex

###flex4.6 textArea 文字换行 有 几种实现形式,

####法1:在text文字里面直接加 “&#13;”

<s:TextArea  text="这是个 TextArea 分行的例子&amp;#13; http://www.waylau.com "/>

####法2:采用了 TLF 标记 形式

<s:TextArea  width="100%" height="340"   >
		<s:content >
			flex 4.6	<s:span color="#FF0000" fontWeight="bold">这是个 TextArea 分行的例子 </s:span><s:br/>
			<s:span color="#008800"> 采用了 TLF 标记 形式  </s:span> <s:br/>

			<s:a href="http://www.waylau.com" target="_blank">技术支持:www.waylau.com </s:a>.</s:content>
	</s:TextArea>

Flex4.6项目本地右键编译正常,部署后访问不了图片资源。解决

2013-05-11 Tomcat

###问题: 如题 遇到 一个 奇怪的 问题, 项目右键运行 图片显示正常。 但 部署到 web服务器 就 显示不正常了。

PS:图片命名用了中文。 用了英文的貌似显示 都正常。

###解决 初步 认定 可能是 web 服务器 编码所致使

在tomcat/conf/server.xml中找到 Connector 在后面加上 URIEncoding=”UTF-8” 即可

<Connector port="8089" protocol="HTTP/1.1" 
           connectionTimeout="20000" 
           redirectPort="8443"  URIEncoding="UTF-8"/>

惠州(惠州学院)——大亚湾(霞冲镇\金海岸)骑行路线图

2013-05-10 Outdoor

1.惠城区出发时,先骑(新S254)惠南大道 2.到了永湖镇后,左转进入(旧S254)惠澳大道,直走 3.到大亚湾的疏港大道, 4.1 快到石化大道前的一个十字路口(有指往霞冲镇的路标),转左直走就能到达霞冲镇,这是一条新路,左边有一条绿道直达霞冲镇 4.2 或到澳霞立交 左转,进入石化大道,直达霞冲镇 5.过了霞冲镇直走约3公里就是金海岸海滨浴场


SOAP webserivce 和 RESTful webservice 对比及区别

2013-04-25 REST Web

简单对象访问协议(Simple Object Access Protocol,SOAP)是一种基于 XML 的协议,可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议(HTTP),简单邮件传输协议(SMTP),多用途网际邮件扩充协议(MIME),基于“通用”传输协议是 SOAP的一个优点。它还支持从消息系统到远程过程调用(Remote Procedure Call,RPC)等大量的应用程序。SOAP提供了一系列的标准,如WSRM(WS-Reliable Messaging)形式化契约确保可靠性与安全性,确保异步处理与调用;WS-Security、WS-Transactions和WS-Coordination等标准提供了上下文信息与对话状态管理。

</wbr>

相对而言,SOAP协议属于复杂的、重量级的协议,当前随着Web2.0的兴起,表述性状态转移(Representational State Transfer,REST)逐步成为一个流行的架构风格。REST是一种轻量级的Web Service架构风格,其实现和操作比SOAP和XML-RPC更为简洁,可以完全通过HTTP协议实现,还可以利用缓存Cache来提高响应速度,性能、效率和易用性上都优于SOAP协议。REST架构对资源的操作包括获取、创建、修改和删除资源的操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法,这种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。REST架构尤其适用于完全无状态的CRUD(Create、Read、Update、Delete,创建、读取、更新、删除)操作。

基于REST的软件体系结构风格(Software Architecture Style)称之为面向资源体系架构(Resource-oriented Architecture,ROA)。按照REST原则设计的软件、体系结构,通常被称为“REST式的”(RESTful),在本文中以下称之为RESTful Web服务,以便于和基于SOAP的Web服务区别。 </wbr>

服务器端采用J2EE,客户端采用JSP、Flex、JavaFX、AIR等可以直接调用Servlet,其他的实现技术基本上不能直接调用,但是无论是那种客户端,对于基于SOAP的Web服务或者基于RESTful Web服务务都是支持的,如AJAX的 XMLHttpRequest、Flex的HTTPService等。如下图所示:

客户端和服务器端的通讯方式

 

SOAP
HTTP 的 GET、HEAD 请求本质上应该是安全的调用,即:GET、HEAD 调用不会有任何的副作用,不会造成服务器端状态的改变。对于服务器来说,客户端对某一 URI 做 n 次的 GET、HAED 调用,其状态与没有做调用是一样的,不会发生任何的改变。 HTTP 的 PUT、DELTE 调用,具有幂指相等特性 , 即:客户端对某一 URI 做 n 次的 PUT、DELTE 调用,其效果与做一次的调用是一样的。HTTP 的 GET、HEAD 方法也具有幂指相等特性。 HTTP 这些标准方法在原则上保证你的分布式系统具有这些特性,以帮助构建更加健壮的分布式系统。 安全控制 为了说明问题,基于上面的在线用户管理系统,我们给定以下场景: 参考一开始我们给出的用例图,对于客户端 Client2,我们只希望它能以只读的方式访问 User 和 User List 资源,而 Client1 具有访问所有资源的所有权限。 如何做这样的安全控制? 通行的做法是:所有从客户端 Client2 发出的 HTTP 请求都经过代理服务器 (Proxy Server)。代理服务器制定安全策略:所有经过该代理的访问 User 和 User List 资源的请求只具有读取权限,即:允许 GET/HEAD 操作,而像具有写权限的 PUT/DELTE 是不被允许的。 如果对于 REST,我们看看这样的安全策略是如何部署的。如下图所示: 图 4. REST 与代理服务器 (Proxy Servers) REST 一般代理服务器的实现根据 (URI, HTTP Method) 两元组来决定 HTTP 请求的安全合法性。 当发现类似于(http://localhost:8182/v1/users/{username},DELETE)这样的请求时,予以拒绝。 对于 SOAP,如果我们想借助于既有的代理服务器进行安全控制,会比较尴尬,如下图: 图 5. SOAP 与代理服务器 (Proxy Servers) REST 所有的 SOAP 消息经过代理服务器,只能看到( http://localhost:8182/v1/soap/servlet/messagerouter , HTTP POST)这样的信息,如果代理服务器想知道当前的 HTTP 请求具体做的是什么,必须对 SOAP 的消息体解码,这样的话,意味着要求第三方的代理服务器需要理解当前的 SOAP 消息语义,而这种 SOAP 应用与代理服务器之间的紧耦合关系是不合理的。 关于缓存 众所周知,对于基于网络的分布式应用,网络传输是一个影响应用性能的重要因素。如何使用缓存来节省网络传输带来的开销,这是每一个构建分布式网络应用的开发人员必须考虑的问题。 HTTP 协议带条件的 HTTP GET 请求 (Conditional GET) 被设计用来节省客户端与服务器之间网络传输带来的开销,这也给客户端实现 Cache 机制 ( 包括在客户端与服务器之间的任何代理 ) 提供了可能。HTTP 协议通过 HTTP HEADER 域:If-Modified-Since/Last- Modified,If-None-Match/ETag 实现带条件的 GET 请求。 REST 的应用可以充分地挖掘 HTTP 协议对缓存支持的能力。当客户端第一次发送 HTTP GET 请求给服务器获得内容后,该内容可能被缓存服务器 (Cache Server) 缓存。当下一次客户端请求同样的资源时,缓存可以直接给出响应,而不需要请求远程的服务器获得。而这一切对客户端来说都是透明的。 图 6. REST 与缓存服务器 (Cache Server) REST 而对于 SOAP,情况又是怎样的呢? 使用 HTTP 协议的 SOAP,由于其设计原则上并不像 REST 那样强调与 Web 的工作方式相一致,所以,基于 SOAP 应用很难充分发挥 HTTP 本身的缓存能力,图 7. SOAP 与缓存服务器 (Cache Server) REST 两个因素决定了基于 SOAP 应用的缓存机制要远比 REST 复杂: 其一、所有经过缓存服务器的 SOAP 消息总是 HTTP POST,缓存服务器如果不解码 SOAP 消息体,没法知道该 HTTP 请求是否是想从服务器获得数据。 其二、SOAP 消息所使用的 URI 总是指向 SOAP 的服务器,如本文例子中的 http://localhost:8182/v1/soap/servlet/messagerouter ,这并没有表达真实的资源 URI,其结果是缓存服务器根本不知道那个资源正在被请求,更不用谈进行缓存处理。 关于连接性 在一个纯的 SOAP 应用中,URI 本质上除了用来指示 SOAP 服务器外,本身没有任何意义。与 REST 的不同的是,无法通过 URI 驱动 SOAP 方法调用。例如在我们的例子中,当我们通过 getUserList SOAP 消息获得所有的用户列表后,仍然无法通过既有的信息得到某个具体的用户信息。唯一的方法只有通过 WSDL 的指示,通过调用 getUserByName 获得,getUserList 与 getUserByName 是彼此孤立的。 而对于 REST,情况是完全不同的:通过 http://localhost:8182/v1/users URI 获得用户列表,然后再通过用户列表中所提供的 LINK 属性,例如 <link>http://localhost:8182/v1/users/tester</link> 获得 tester 用户的用户信息。这样的工作方式,非常类似于你在浏览器的某个页面上点击某个 hyperlink, 浏览器帮你自动定向到你想访问的页面,并不依赖任何第三方的信息 REST 构建的系统其系统的扩展能力要强于 SOAP,这可以体现在它的统一接口抽象、代理服务器支持、缓存服务器支持等诸多方面, 而SOAP的成熟性可以给需要提供给多开发语言的,多传输方式的,对于安全性要求较高的接口设计带来便利。   原文载自:http://luckykapok918.blog.163.com/blog/static/20586504320123238260833/

自行车骑行装备的选择

2013-04-24 Outdoor

一、骑行人员装备 从上至下,依次为: 1、骑行头盔:为轻质头盔,以高强度泡沫压制而成,用于头部防护; 2、骑行头巾:多种用途,主要用于排汗遮阳阻隔灰尘; 3、骑行眼镜:按照佩带时间段,镜片可分为多种颜色,一般为深灰色、黄色、白色。深灰色-适合于中午阳光照射充足的时间佩带,以阻隔刺眼的眼光;黄色-适合清晨、黄昏阳光照射相对较暗的时候佩带;白色,适合天气阴暗或晚上佩带。其主要功能在于,阻隔阳光、阻隔风尘; 4、骑行服:骑行人员专用衣服,由多种面料制作而成,可按需选用。其功能主要功能为保暖、速干、透气; 5、骑行袖套:又称为臂套,主要和短袖骑行服搭配穿着,方便拆解,其主要功能为保暖、防晒; 6、骑行手套:为骑行人员专用手套,有半指与全指之分,手掌部位做加厚处理,高档骑行手套均垫有硅胶层,主要用于摔车时,减少伤害,防止擦破手; 7、骑行背包或腰包:骑行背包并没有做特殊规定,主要用于盛装骑行过程所需之物,满足需求即可,并不做特殊要求; 8、骑行裤:为骑行者专用裤子,有长短之分并在臀部配有坐垫,其功能主要为高弹减少腿部于自行车之间的摩擦,同时配备的坐垫减少长时间骑行屁股会疼的状况,提高骑行的舒适性; 9、骑行腿套:如直筒一般,与骑行短裤搭配使用,方便拆解,主要功能为保暖、防晒; 10、骑行袜:为骑行者专用袜子,按照COOLMAX含量可分为多种,骑行者可按照骑行时间的长短和骑行活动的强度来选用适合穿着的骑行袜; 11、绑腿:又名束带主要用于扎结裤腿角,防止裤腿绞进链条,以保障骑行的安全; 12、骑行鞋:为骑行者专用鞋子,同样可分为多种,有山地骑行鞋与公路骑行鞋之分,可按照所骑自行车款式进行选择,如自行车配备专用脚蹬,则骑行鞋必须选用锁鞋; 13、骑行鞋套:骑行鞋套用于骑行锁鞋的搭配,有减少风阻,防污保暖等用途。

 

二、车载装备 从自行车前头往后依次有: 1、打气桶:一般为便携装,安置于前叉部位; 2、车首包:又名车把包、车前包常见于山地车装备中。适合长途骑行装载物品之用; 3、车灯\尾灯:常见于夜间骑行的自行车中,照明警示用; 4、喇叭:有气喇叭与电喇叭之分,可按需取用,功能并无太大差别,只是发声装置不同; 5、三角包:隶属于包裹类,作用同于车首包,只是安装部位不同,另还有尾包-安装于自行车座立管部位,驮包安装于自行车后坐部位;车架包,位于车头与车管部位 6、水壶:有多种可选,无需专门配备,主要用于盛装在骑行过程中所需要饮用的水。

  1. 水壶架:放置水壶
  2. 码表:显示里程,测速
  3. 扶把(副把):减少手部疲劳 10.货架(后车架):用于长途骑行装载驮包用 11.挡泥板:雨天必备 12.硅胶坐垫:保护小DD,长途适用 13.护链贴:防止链条脱落与车架激烈摩擦 14.车锁:不多说 15.修补工具:翘胎棒、摩擦片、胶水、补胎片、内六角、一字十字螺丝刀、扳手。。太多了,见下图

 

 


DOM4J介绍与代码示例

2013-04-18 Java

原文摘自:http://zhangjunhd.blog.51cto.com/113473/126310

DOM4J是dom4j.org出品的一个开源XML解析包。Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。

DOM4J下载jar包:http://downloads.sourceforge.net/dom4j/dom4j-1.6.1.jar
JAXEN(对XPath的支持):http://dist.codehaus.org/jaxen/distributions/jaxen-1.1.1.zip
1.DOM4J主要接口
DOM4J主要接口都在org.dom4j这个包里定义。
-Node为所有的dom4j中XML节点定义了多态行为;
-Branch为能够包含子节点的节点如XML元素(Element)和文档(Docuemnts)定义了一个公共的行为;
|-Element 定义XML 元素;
|-Document定义了XML文档;
-DocumentType 定义XML DOCTYPE声明;
-Entity定义 XML entity;
-Attribute定义了XML的属性;
-ProcessingInstruction 定义 XML 处理指令;
-CharacterData是一个标识借口,标识基于字符的节点。如CDATA,Comment, Text;
|- CDATA 定义了XML CDATA 区域;
|-Text 定义XML 文本节点;
|- Comment 定义了XML注释的行为;
2.创建XML文档
示例xml:students.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="students.xsl"?>
<students>
<!--A Student Catalog-->
<student sn="01">
<name>sam</name>
<age>18</age>
</student>
<student sn="02">
<name>lin</name>
<age>20</age>
</student>
</students>
下面是用dom4j创建上述文档,通过两种方式创建,一种是调用dom4j提供的方法,一种是通过字符串转换。
XmlGen.java
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.XMLWriter;
public class XmlGen {
public Document generateDocumentByMethod() {
Document document = DocumentHelper.createDocument();
// ProcessingInstruction
Map<String, String> inMap = new HashMap<String, String>();
inMap.put("type", "text/xsl");
inMap.put("href", "students.xsl");
document.addProcessingInstruction("xml-stylesheet", inMap);
// root element
Element studentsElement = document.addElement("students");
studentsElement.addComment("An Student Catalog");
// son element
Element stuElement = studentsElement.addElement("student");
stuElement.addAttribute("sn", "01");
Element nameElement = stuElement.addElement("name");
nameElement.setText("sam");
Element ageElement = stuElement.addElement("age");
ageElement.setText("18");
// son element
Element anotherStuElement = studentsElement.addElement("student");
anotherStuElement.addAttribute("sn", "02");
Element anotherNameElement = anotherStuElement.addElement("name");
anotherNameElement.setText("lin");
Element anotherAgeElement = anotherStuElement.addElement("age");
anotherAgeElement.setText("20");
return document;
}
public Document generateDocumentByString() {
String text = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<?xml-stylesheet type=\"text/xsl\" href=\"students.xsl\"?>" +
"<students><!--An Student Catalog--> <student sn=\"01\">" +
"<name>sam</name><age>18</age></student><student sn=\"02\">" +
"<name>lin</name><age>20</age></student></students>";
Document document = null;
try {
document = DocumentHelper.parseText(text);
} catch (DocumentException e) {
e.printStackTrace();
}
return document;
}
public void saveDocument(Document document, File outputXml) {
try {
// 美化格式
OutputFormat format = OutputFormat.createPrettyPrint();
/*// 缩减格式
OutputFormat format = OutputFormat.createCompactFormat();*/
/*// 指定XML编码
format.setEncoding("GBK");*/
XMLWriter output = new XMLWriter(new FileWriter(outputXml), format);
output.write(document);
output.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
public static void main(String[] argv) {
XmlGen dom4j = new XmlGen();
Document document = null;
// document=dom4j.generateDocumentByMethod();
document = dom4j.generateDocumentByString();
dom4j.saveDocument(document, new File("output.xml"));
}
}
方法generateDocumentByMethod()通过调用方法构建xml文档:
1.使用DocumentHelper得到Document实例
Document document = DocumentHelper.createDocument();
2.创建Processing Instruction
document.addProcessingInstruction("xml-stylesheet", inMap);
3.创建元素Element
Element studentsElement = document.addElement("students");
4.为元素添加注释Comment
studentsElement.addComment("An Student Catalog");
5.为元素添加属性
studentsElement.addComment("An Student Catalog");
6.为元素添加文本值Text
ageElement.setText("18");
方法generateDocumentByString()通过字符串转换直接构建xml文档,使用DocumentHelper.parseText()来实现.
document = DocumentHelper.parseText(text);
方法saveDocument(Document document, File outputXml)将文档输出到文件保存,可指定字符编码,可指定格式化输出。
3.修改XML文档
这里使用xpath来定位待修改的元素和属性,需要jaxen的支持。
示例中将students-gen.xml的第一个student元素的sn属性改为001,其子元素name内容改为jeff。
XmlMod.java
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class XmlMod {
public void modifyDocument(File inputXml) {
try {
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(inputXml);
List list = document.selectNodes("//students/student/@sn");
Iterator iter = list.iterator();
while (iter.hasNext()) {
Attribute attribute = (Attribute) iter.next();
if (attribute.getValue().equals("01"))
attribute.setValue("001");
}
list = document.selectNodes("//students/student");
iter = list.iterator();
while (iter.hasNext()) {
Element element = (Element) iter.next();
Iterator iterator = element.elementIterator("name");
while (iterator.hasNext()) {
Element nameElement = (Element) iterator.next();
if (nameElement.getText().equals("sam"))
nameElement.setText("jeff");
}
}
XMLWriter output = new XMLWriter(new FileWriter(new File(
"students-modified.xml")));
output.write(document);
output.close();
}
catch (DocumentException e) {
System.out.println(e.getMessage());
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
public static void main(String[] argv) {
XmlMod dom4jParser = new XmlMod();
dom4jParser.modifyDocument(new File("students-gen.xml"));
}
}
1.使用File定位文件资源,并基于此获得Document实例
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(inputXml);
2.Document实例的selectNodes方法可以传入xpath,并返回一个List实例,基于此使用迭代器,完成特定的应用
List list = document.selectNodes("//students/student/@sn");
4.遍历XML文档
这里提供两种遍历方法,一种是基于迭代的遍历,一种是基于Visitor模式的遍历。
XmlTra.java
import java.io.File;
import java.util.Iterator;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.ProcessingInstruction;
import org.dom4j.VisitorSupport;
import org.dom4j.io.SAXReader;
public class XmlTra {
private File inputXml;
public XmlTra(File inputXml) {
this.inputXml = inputXml;
}
public Document getDocument() {
SAXReader saxReader = new SAXReader();
Document document = null;
try {
document = saxReader.read(inputXml);
} catch (DocumentException e) {
e.printStackTrace();
}
return document;
}
public Element getRootElement() {
return getDocument().getRootElement();
}
public void traversalDocumentByIterator() {
Element root = getRootElement();
// 枚举根节点下所有子节点
for (Iterator ie = root.elementIterator(); ie.hasNext();) {
System.out.println("======");
Element element = (Element) ie.next();
System.out.println(element.getName());
// 枚举属性
for (Iterator ia = element.attributeIterator(); ia.hasNext();) {
Attribute attribute = (Attribute) ia.next();
System.out.println(attribute.getName() + ":"
+ attribute.getData());
}
// 枚举当前节点下所有子节点
for (Iterator ieson = element.elementIterator(); ieson.hasNext();) {
Element elementSon = (Element) ieson.next();
System.out.println(elementSon.getName() + ":"
+ elementSon.getText());
}
}
}
public void traversalDocumentByVisitor() {
getDocument().accept(new MyVisitor());
}
/**
* 定义自己的访问者类
*/
private static class MyVisitor extends VisitorSupport {
/**
* 对于属性节点,打印属性的名字和值
*/
public void visit(Attribute node) {
System.out.println("attribute : " + node.getName() + " = "
+ node.getValue());
}
/**
* 对于处理指令节点,打印处理指令目标和数据
*/
public void visit(ProcessingInstruction node) {
System.out.println("PI : " + node.getTarget() + " "
+ node.getText());
}
/**
* 对于元素节点,判断是否只包含文本内容,如是,则打印标记的名字和 元素的内容。如果不是,则只打印标记的名字
*/
public void visit(Element node) {
if (node.isTextOnly())
System.out.println("element : " + node.getName() + " = "
+ node.getText());
else
System.out.println("--------" + node.getName() + "--------");
}
}
public static void main(String[] argv) {
XmlTra dom4jParser = new XmlTra(new File("students-gen.xml"));
// dom4jParser.traversalDocumentByIterator();
dom4jParser.traversalDocumentByVisitor();
}
}
方法traversalDocumentByIterator()提供一种基于迭代的遍历实现,每个Element通过elementIterator()和attributeIterator()取代其子元素和属性的迭代器。
Visitor是GOF设计模式之一。其主要原理就是两种类互相保有对方的引用,并且一种作为Visitor去访问许多Visitable。DOM4J中的Visitor模式只需要自定一个类实现Visitor接口即可。
public class MyVisitor extends VisitorSupport {
public void visit(Element element) {
System.out.println(element.getName());
}
public void visit(Attribute attr) {
System.out.println(attr.getName());
}
}
调用: root.accept(new MyVisitor())
Visitor接口提供多种Visit()的重载,根据XML不同的对象,将采用不同的方式来访问。上面是给出的Element和Attribute的简单实现,一般比较常用的就是这两个。VisitorSupport是DOM4J提供的默认适配器,Visitor接口的Default Adapter模式,这个模式给出了各种visit(*)的空实现,以便简化代码。
注意,这个Visitor是自动遍历所有子节点的。如果是root.accept(MyVisitor),将遍历子节点。我第一次用的时候,认为是需要自己遍历,便在递归中调用Visitor,结果可想而知。
5.使用ElementHandler
XmlHandler.java
import java.io.File;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.ElementHandler;
import org.dom4j.ElementPath;
import org.dom4j.io.SAXReader;
public class XmlHandler {
public static void main(String[] args) {
SAXReader saxReader = new SAXReader();
File file = new File("students.xml");
try {
// 添加一个ElementHandler实例。
saxReader.addHandler("/students/student", newStudentHandler());
saxReader.read(file);
} catch (DocumentException e) {
System.out.println(e.getMessage());
}
}
/**
* 定义StudentHandler处理器类,对<student>元素进行处理。
*/
private static class StudentHandler implements ElementHandler {
public void .Start(ElementPath path) {
Element elt = path.getCurrent();
System.out.println("Found student: " + elt.attribut.ue("sn"));
// 添加对子元素<name>的处理器。
path.addHandler("name", new NameHandler());
}
public void .End(ElementPath path) {
// 移除对子元素<name>的处理器。
path.removeHandler("name");
}
}
/**
* 定义NameHandler处理器类,对<student>的<name>子元素进行处理。
*/
private static class NameHandler implements ElementHandler {
public void .Start(ElementPath path) {
System.out.println("path : " + path.getPath());
}
public void .End(ElementPath path) {
Element elt = path.getCurrent();
// 输出<name>元素的名字和它的文本内容。
System.out.println(elt.getName() + " : " + elt.getText());
}
}
}
6.使用XSLT转换XML
这里必须使用JAXP的支持。
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import org.dom4j.Document;
import org.dom4j.io.DocumentResult;
import org.dom4j.io.DocumentSource;
……
public Document styleDocument(Document document, String stylesheet)
throws Exception {
// load the transformer using JAXP
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(newStreamSource(stylesheet));
// now lets style the given document
DocumentSource source = new DocumentSource(document);
DocumentResult result = new DocumentResult();
transformer.transform(source, result);
// return the transformed document
Document transformedDoc = result.getDocument();
return transformedDoc;
}
……
 

SecurityError Error 2148 SWF 不能访问本地资源

2013-04-13 Flash

##错误提示:

SWF 文件不能被本地访问 不能访问本地 只有仅限于文件系统的 SWF 文件和可信的本地 SWF 文件可以访问本地资源

##错误信息:

SecurityError: Error #2148: SWF 文件 D:\demo\demo.swf 不能访问本地资源 D:\demo\demo\bin-debug\textLayout_4.0.0.10485.swf。只有仅限于文件系统的 SWF 文件和可信的本地 SWF 文件可以访问本地资源。

##解决方法:

###第一种办法

在Flash插件上右键->全局设置->高级->开发人员工具->受信任的位置设置->添加 ,然后添加你的文件或者文件夹即可。

说明:在本地测试期间,Flash Player 可以显示阻止应用程序正常运行的安全警告。您可以使用“受信任位置设置”面板将您自己的 SWF 或 FLV 内容指定为可信内容,从而解决这一问题。您可以将个别文件的路径指定为可信路径,或者指定文件夹为可信文件夹。可信文件夹中的所有文件及其任何子文件夹也会受信任。使用此选项卡可指定您计算机上包含您信任的 SWF 或 FLV 内容的位置。可信内容不遵循阻止内容访问 Internet 和本地计算机文件系统的安全规则。

###第二种方法:

在C:\WINDOWS\system32\Macromed\Flash\FlashPlayerTrust目录下添加一个文件,比如:1.txt(文件名可任意起),文件内容为项目的路径,当然也可以设置为“D:\” 说明: 为了让你的Flash在用户硬盘中拥有同时访问网络和本地的能力,你必须在用户计算机的FlashPlayerTrust目录中为你的Flash添加权限. FlashPlayerTrust 配置文件。 这些是列出受信任路径的简单文本文件。这些文件由可执行的安装程序创建。当安装程序将 SWF 安装到用户的计算机时, 它能够安装信任的配置文件并指定 SWF 是受信任的。


Flex4.6 用Lable自定义LinkButton

2013-04-08 Flex

很简单,先是继承Lable ,而后 设置相关属性,比如 小手鼠标、下划线等

package com.waylau.eagleos.components
{
	import spark.components.Label;

	public class LinkButton extends Label
	{
		public function LinkButton()
		{
			super();

			this.useHandCursor = true ;
			this.buttonMode = true ;
			this.mouseChildren = false ;

			this.setStyle("textDecoration","underline");
		}
	}
}

Golang strings.Split获取字符串中的url/域名的简易方法

2013-04-07 Golang

package main

import (
	"fmt"
	"strings"
)

func main() {
	fmt.Println("Hello World!")

	a := "golang strings.Split获取字符串中的url/域名的简易方法http://www.waylau.com/golang-strings-split-get-url/"
	a1 := strings.Split(a, "//")[1]
	a2 := strings.Split(a1, "/")[0]

	fmt.Println(a1) //输出为:www.waylau.com/golang-strings-split-get-url/
	fmt.Println(a2) //输出为:www.waylau.com
}

惠州——平海古城、海滨温泉、巽寮湾-旅游攻略

2013-04-06 Outdoor

1.在惠州汽车站。乘坐惠州——惠东汽车到达惠东汽车站(18元),转乘惠东——港口专线巴士(18元),至平海镇下车,下车向巷子里走约200米 ,见 城墙,即是古城

其实,平海镇方圆不大,东南西北四个门都见完了也就 几十分钟的事情。城内有几个庙。 恰逢清明节,百姓插旗烧香祭祖,院门大开,也算是领略了风俗民情。 城内无吃饭的地方,吃饭在下车的大路边。 在沙县吃了一碗鸡腿饭13元。

2.平海古城转车去海滨温泉就有所不便,没有的士,也没有班车,上了摩托35元,也只能认了,自己走的话大概要十几公里。 一路狂飙,披头散发,直接送到海滨温泉旅游区门口。

海滨温泉门票是团购的100+,因为是过节临时加多了10元,不限时,貌似营业到晚上12点 去到那里 大概是下午1点半左右,里面大大小小温泉40多个,各种药池,花池,酒池 ,不过里面的温水是不是地热的水就不好说了~ 提供免费的花生小吃还有饮料,橙汁兑水的吧,淡出鸟来 还有花生都不脆,感觉过气的。 另外有小番薯提供,这个不错。 吃了串鱼丸,三颗10元。

泡了一圈,发觉才2点多,休息了一下又去平泡了一圈。其实不能泡太久。 熬到四点过,有歌舞看,走了,不看了。 出门,发现搭车又不便了。决定走到巽寮镇。距离也就是十几公里。(其实是有去惠东的巴士可以搭的) 走了一半路程,天已经暗了。有哥们停车顺了一段路,都是来泡泉的,有亲切感。还是有车好,一脚油门,几分钟就到了酒店。 我是团购的海景山庄,100+标双,到店需要观海的房间的又要对加钱。 酒店内的设施一般,晚上定点放热水。 位置不错,基本上躺床上就能见到海 附近没有吃货,全是酒店。走约两三公里就到镇上。淡季,海鲜还是这么贵~

3.第二天起来,约了隔壁的几个家伙一起去巽寮湾出海打鱼。 一出门就下雨了,我汗。 酒店附近不能直接下海,要走一两公里到滨海度假村有入口可以进海滩。 也没捡贝壳,光避雨去了。附近都是待建的工地。一片荒凉。 天晴上了渔船打鱼,80元包船,打到都是自己的。 结果一趟来回就是几个濑尿虾,不够吃啊。又买了条鱼,叫渔家帮忙煮了。 坐渔家的快艇还是有快感,擦,一条鱼带加工费要了120元

4.附近还有天后宫岭南民俗文化商业街, 酒吧一条街还在招商,人影木有。 商业街有妈祖庙。 天又下雨,走出街到大路,坐车回惠东17元 总结: 路费 100+ 打鱼 80 吃饭 200+ 交通不是很方便。 2013-4-5


Golang 实现的一个小游戏--猜数字

2013-04-06 Golang Game

随机生成一个数字,输入一个数字看是否匹对,匹配则结速,反之提示是大了还是小了,

代码如下: package main

import (
	"bufio"
	"fmt"
	"math/rand"
	"os"
	"strconv"
	"time"
)
var (
	endNum int //设置生成数的范围
)
func main() {
	i := createRandomNumber(endNum)
	//fmt.Println("生成规定范围内的整数:", i)    //本句调试用

	fmt.Println("请输入整数,范围为:0-", endNum)

	flag := true
	reader := bufio.NewReader(os.Stdin)

	for flag {
		data, _, _ := reader.ReadLine()

		command, err := strconv.Atoi(string(data)) //string to int,并作输入格式判断
		if err != nil {
			fmt.Println("格式不对,请输入数字")
		} else {

			fmt.Println("你输入的数字:", command)

			if command == i {
				flag = false
				fmt.Println("恭喜你,答对了~")
			} else if command &lt; i {
				fmt.Println("你输入的数字小于生成的数字,别灰心!再来一次~")
			} else if command &gt; i {
				fmt.Println("你输入的数字大于生成的数字,别灰心!再来一次~")
			}
		}
	}
}
func init() {
	endNum = 10
}

//生成规定范围内的整数
//设置起始数字范围,0开始,endNum截止
func createRandomNumber(endNum int) int {
	r := rand.New(rand.NewSource(time.Now().UnixNano()))
	return r.Intn(endNum)
}

golang实现字符串逆序,不允许临时变量的原地逆序

2013-04-06 Golang

package main

import (
	"fmt"
)

var (
	s1    string
)
func main() {
	fmt.Println(s1)
	fmt.Println(converString(s1))
}
func init() {
	s1 = "我爱你waylau.com"
}
func reverseString(s string) string {
	str := []rune(s)

	for i, j := 0, len(str)-1; i &lt; j; i, j = i+1, j-1 {
		str[i], str[j] = str[j], str[i]
	}

	return string(str)
}

后台输入为

我爱你waylau.com
moc.ualyaw你爱我


Flex的一些总结

2013-03-26 Flex

##Loader与URLLoader,SWFLoader

(1) Loader Loader 类可用于加载 SWF 文件或图像(JPG、PNG 或 GIF)文件。 使用 load() 方法来启动加载。 被加载的显示对象将作为 Loader 对象的子级添加。 (2)URLLoader URLLoader 类以文本、二进制数据或 URL 编码变量的形式从 URL 下载数据。 在下载文本文件、XML 或其它用于动态数据驱动应用程序的信息时,它很有用。URLLoader 对象会先从 URL 中下载所有数据,然后才将数据用于 ActionScript。 它会发出有关下载进度的通知,通过 bytesLoaded 和bytesTotal 属性以及已调度的事件,可以监视下载进度。在加载非常大的视频文件(如 FLV 的视频文件)时,可能会出现内存不足错误。

区别:一个用来加载可显示数据,一个用来加载非显示数据因为loader是继承与容器类的,所以首先它是个容器,而URLLoader 是继承与EventDispatcher,它不是容器URLLoader 类以文本、二进制数据或 URL 编码变量的形式从 URL 下载数据,在加载非常大的视频文件(如 FLV 的视频文件)时,可能会出现内存不足错误,返回的数据在data属性里面而loader多加载图片,swf等可视化对象,加载后作为唯一的子对象显示在列表上。

应用范围 Loader: 多用于swf,图片(jpg,png,gif) URLLoader: 多用于文本文件(xml,php,jsp…) 使用方法

    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete); 
    private function loadComplete(event:Event)
    { 
        trace("done");
        addChild(loader);
    }

    //URLLoader:
    xmlLoader.dataFormat=URLLoaderDataFormat.TEXT; 
    xmlLoader.addEventListener(Event.COMPLETE,xmlLoaded); 
    private function xmlLoaded(event:Event) { 
        try {
            myXML = XML(event.target.data);area.text=myXML;
        }catch (e:TypeError) 
        {
            area.text="Load faild:\n"+e.message;
        } 
    }  Loader 在使用Loader来加载数据时,添加侦听事件时,注意一定要给Loader的 contentLoaderInfo属性增加事件,而不是给Loader对象增加事件。
 var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler); loader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITYERROR, securityErrorHandler); loader.contentLoaderInfo.addEventListener(IOErrorEvent.IOERROR, ioErrorHandler);

(3)可以使用SWFLoader和Loader两个类来加载子应用程序,多数情况下我们使用SWFLoader。它是Loader的一个包装类,提供了很多附加功能,使加载子应用程序更简单。 SWFLoader有如下特征: 支持flex的样式和特效;而Loader类却不支持任何固有的样式和特效。 方便管理加载进度;如果使用Loader则首先要获取LoaderInfo引用。

是一个UIComponent组件。SWFLoader它自己管理了所有子显示对象,不需要添加多余的代码。 自动缩放显示内容的大小

可以加载Application以外的实现类,如果检测到不是一个Application,会自动进行处理。 可以处理不同的版本。Loader不支持加载不同的编译版本

当使用Loader加载不是受信任区域的swf时,必须提供一个遮罩来重新定位,否则它会显示在屏幕外面: 代码 import flash.display.*; import flash.net.URLRequest; var rect:Shape = new Shape(); rect.graphics.beginFill(0xFFFFFF); rect.graphics.drawRect(0, 0, 100, 100); addChild(rect); var ldr:Loader = new Loader(); ldr.mask = rect; var url:String = “http://www.unknown.example.com/content.swf”; var urlReq:URLRequest = new URLRequest(url); ldr.load(urlReq); addChild(ldr);

SWFLoader加载外部swf是一个很好的方法,在进行Flex游戏开发的时候,我们通常会需要很多Flash提供的游戏角色,这些角色可以每个都是一个单独的swf,也可以是存在于一个swf文件中的各个元件。两种方法各有优劣: 1. 单独的swf,每个角色独立性很强,可以在需要的时候才加载。未来修改角色也不会影响到其它角色。但是会有很多的swf需要管理。 2. 每个角色是一个元件,存在于一个swf中,这种方法比较容易管理资源,比较干净。但是修改一个角色都需要重新编译swf,可能会误操作影响其它的元件。而且一次加载所有角色,可能会加载许多不必要的元件,浪费带宽。

两种方法怎么选择,根据项目读者根据以下几个问题考虑: 1. 你的所有元件相互之间是否又很多公用元件?如果是的话,可以考虑放到一个swf中,因为这样会降低所有元件的文件量。 2. 你的所有元件是否都继承同一些类,实现同一些接口,调用同一些类?如果是的话,可以考虑放到一个swf中,这样比较容易管理类包,而且降低swf的文件量,因为共有的类只编译一次。 3. 你的所有元件是否完全独立,没有任何关系?如果是的话,你可以考虑每个角色独立的swf。 具体实现代码如下:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
               creationComplete="init()"
               >
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <fx:Script>
        <![CDATA[
            import mx.controls.SWFLoader;
            import mx.core.UIComponent;

            private var swfLoader:SWFLoader = new SWFLoader();
            private function init():void{
                swfLoader.addEventListener(Event.COMPLETE,swfLoadComplete);
                swfLoader.load("assets/fishmomo.swf");
            }
            private function swfLoadComplete(e:Event):void{
                /**
                 * 将整个swf都加载到flex舞台上
                 * 此方法将每个flex要用的资源做成单独的swf,需要时才加载进来
                 */ 
                addElement(swfLoader);
                var swf:MovieClip = swfLoader.content as MovieClip;
                //fish 是 swf主舞台上的一个鱼对象,属性命名为fish
                //调用舞台上fish元件的say方法
                swf.fish.say("Load a swf");

                /**
                 * 此方法可以把所有的flex要用的资源放到一个swf中
                 * 把需要在flex中使用的元件链接到一个类,并将此元件拖到flash舞台
                 * 通过类名,随意显示其中一个元件到flex舞台
                 */ 
                var FishSymbol:Object = swfLoader.content.loaderInfo.applicationDomain.getDefinition("Fish");
                var f:MovieClip = new FishSymbol() as MovieClip;
                //调用元件的say方法
                f.say("Load a symbol within a swf");
                var ui:UIComponent = new UIComponent();
                ui.addChild(f);
                addElement(ui);
            }
        ]]>
    </fx:Script>
</s:Application>

##导致内存泄露的一些情况:

事件监听: 对父级对象加了监听函数,会造成内存泄露,例:

override protected function mouseDownHandler(…):void { 
systemManager.addEventListener(“mouseUp”, mouseUpHandler); …… 
}  解决: 在销毁对象的时候,remove掉这些监听,虽然弱引用也可以避免这些问题,但自己掌控感觉更好。 但以下几种情况不会造成内存泄露: 弱引用:

someObject.addEventListener(MouseClick.CLICK, handlerFunction, false, 0, true);  对自己的引用:

this.addEventListener(MouseClick.CLICK, handlerFunction);  子对象的引用: 

private var childObject:UIComponent = new UIComponent; addChild(childObject); childObject.addEventListener(MouseEvent.CLICK, clickHandler);  总之…有addEventListener,就removeEventListener一下吧,要为自己做的事负责~哈哈

清除引用 remove掉子对象后并不会删除该对象,他还保留在内存中,应该将引用设置为null removeChildren(obj); obj = null;

静态成员 Class (或MXML)中有: public static var _eventService : MyService=new MyService(); 解决:在dispose时,需要设置: _eventService =null;

module (未解决) moduleLoader unloadModule后 ModuleInfo 并不会被GC. Garbage Collection in a MultiCore Modular Pipes Application 这篇文章介绍了一种GC策略,感觉对于ModuleInfo 的GC无效。 (未尝试、未遇到)

CSS样式 module 中如果使用了shell的CSS定义或是 这样的定义,那么这个module将不能GC. 弹出的窗口应该是同样的结果. 解决方法,使用动态CSS文件 module init中 StyleManager.loadStyleDeclarations(“css/myStyle.swf”); module dispose中 StyleManager.unloadStyleDeclarations(“css/myStyle.swf”);

TextInput/Textarea(未解决) 如果module中有window使用了TextInput/Textarea控件,不点击没有问题,只要点上去,那么很遗憾了,module和所在窗体将不能被GC. 这个BUG非常严重,目前还没有解决方法。 memory leak when using TextInput and TextArea when click the keyboard 这里面附加的解决方法无效。 通过profiler分析,应该和Focusmanager有关,只有一点击就不会释放。

CursorManager.setCursor 使用了 cursorID = CursorManager.setCursor(iconClosed); dispose时要 CursorManager.removeCursor(cursorID);

Bitmap 如果使用Bitmap,结束时需要调用其dispose方法,否则内存消耗巨大。 另外,BitmapData是可以共享使用的,多个Bitmap可以使用同一BitmapData,节省不少内存。 var bmp:Bitmap =new Bitmap(); …….. if (bmp.bitmapData!=null) { bmp.bitmapData.dispose(); } Image 包含了Image对象时,在removeChildren时会造成不能释放(测试多次,结果不一,建议还是做如下处理)。 解决: img.source = null; this.removeChild(img); img = null;

Loader、SWFLoader、声音、视频、Effect等… 如果是加载SWF文件,先停止播放。 停止声音的播放 停止正在播放的影片剪辑(Movieclip) 关闭任何连接的网络对象,例如Loader正在加载,要先close。 取消对摄像头或者麦克风的引用 取消事件监听器 停止任何正在运行的定时器,clearInterval() 停止任何Timer对象,timer.stop() 停止正在播放的效果(Effect) 其他

binding也疑似有memory leak 问题。 引用以及内存泄露相关博文和资料: http://blogs.adobe.com/aharui/2007/03/garbagecollectionandmemory.html http://www.craftymind.com/2008/04/09/kick-starting-the-garbage-collector-in-actionscript-3-with-air/ http://www.cnblogs.com/janyou/archive/2008/11/25/1340753.html http://www.dreamingwell.com/articles/archives/2008/05/understandingm.php 总结:由于之前Flash一直是在网页上使用,一般网页都是看完就关掉的,估计Adobe在内存回收这块也没有下太大的功夫, 现在AIR的出现使得内存管理也相当重要了,并且,AIR本身对内存的消耗就相当大,一个没有任何内容的初始创建的AIR程序,就得占掉10-20M+的内存…AIR还需改善.

##Modules

为什么要模块化;模块化提供了分离应用程序代码到不同的swf文件上以便减少下载时间和文件大小。 使用Modules的好处是:

  1. 主应用程序开始时不需马上下载modules。应用程序会根据需求载入和卸载modules。

  2. 由于每个modules独立于其他应用程序modules,当需要改变一个modules时,你只需要重编译这个modules而不是整个应用程序。模块化可创建模块化应用程序是提高Flex框架性能的重要方面,提供更多能力控制下载时间和文件大小,使用modules,你可以根据哪些可被独立载入,哪些可被其他程序使用而分离应用程序代码。

优点是合理分割了主Application,模块化开发。更小的SWF文件体积,配合RSL和延迟加载策略,大大减少用户等待时间。

缺点就是容易引起内存泄露。

##RSL

RSL(Runtime Shared Library),即运行时加载库。当前L主要有3个级别的RSL,一个是Standard RSL(即一个网站内共享),一个是Cross-domain RSL(跨域共享),最后一个也是最关键的是Framework RSL(Flex框架共享)。 功能说明 Flex Builder在默认情况下,编译的每个程序都是独立的。每个程序都包含了所需类的一个副本,例如:在多个程序中都用到了VBox这个控件,那么每个程序都要独立的拥有一个VBox类。由此造成了程序代码的重复,使得代码量增大很多。而RSL正是解决此问题的一种方法,它可以把共享代码提取出来,然后在相同域的程序之间进行共享。这些共享代码不会再编译进程序,而是放在单独的库中,供运行时加载。另外,RSL也可以在客户端进行缓存,因此不需要在每次使用程序时重复下载。

RSL(Runtime shared libraries)即动态链接库,在程序运行时由FlashPlayer动态加载。静态链接库是SWC文件,通过编译器的library-path和include-libraries 编译进应用程序。采用静态链接的应用程序SWF会产生比较大的文件以及更长的下载时间。使用RSL的应用程序载入时间短且文件比较小,而且提高了内存使用效率,只是 在开始需要花点时间下载RSL。RSL的强大体现在多个应用程序共享公共代码时,因为RSL只需要被下载一次,多个应用程序动态链接到相同的RSL,访问其中已经缓存在客 户端的资源。 使用RSL: (1).在项目文件夹中点右建,选择”properties”-“Flex Build Path”-“Library Path” (2).该选项卡上我们看到”FrameWork linkage”,默认是”Merged into cdoe”(FLEX4默认是RSL) (3).点开下拉,选择”runtime shared library(RSL)” (4).针对自定义的SWC,修改其link type为RSL,选择None,同时勾上Automatically extract swf to deployment path(自动将SWF提取到部署路径)。如果想对不同域的RSL共享,则选择Digests(摘要),同时指定其Policy file url(策略文件)。具体可参考FLEX SDK中的SWC文件处理方式。 (5).点击OK

##SWC

SWC 文件是类似 zip 的文件。静态链接库是SWC文件,通过编译器的library-path和include-libraries编译进应用程序。新建Flex Library Object或使用compc命令可以制作SWC。

##E4X E4X是在ECMA-357标准中定义的,并成为AS3的一部分。优点是提供更简明和可读性强的语法从XML中查找和提取数据。

##profile工具 可以很方便地观察对象的创建和销毁,帮助检查内存泄露问题。

##FlexUnit FlexUnit - Flex单元测试框架

##其他 1、flex生成出来的文件都是很大,请问你用什么办法进行缩小呢? (1)RSL (2)Module (3)外部加载资源

2、做一个flex项目,你认为成功的要素在哪呢? (1)数据和需求等传统软件项目的成功要素 (2)模块化开发,MVC框架 (3)swf文件减肥,运行效率,内存泄露问题,前台优化 (4)开源组件的使用

3、flex 前端的性能优化 (1)、避免容器的多级嵌套,减少相对尺寸、相对定位的使用。 (2)、尽量使用轻量级的容器 (3)、避免使用大体积的组件,比如DataGrid、AdvancedDataGrid (4)、处理数据时多用分页的方式 (5)、少使用setStyle (6)、使用延迟实例化加载子组件

4.Embed绑定图片有什么缺点? 答:直接编译到swf文件中,造成其体积过大。而且由于嵌入代码中,维护不便。

5、flex里调用JS措施? 答:直接在AS中利用ExternalInterface.call()来调用JS措施。如: import flash.external.ExternalInterface ; ExternalInterface.call(“JSFunction”); ExternalInterface.call(“JSFunctionWithParameters”,”myParameter”); var result:String=ExternalInterface.call(“JSFunctionWithReturn”); 6、用JavaScript调用ActionScript函数 答:利用ExternalInterface.addCallback在JavaScript里设置对Flex的回调措施并且在JavaScript里调用ActionScript措施。 AS: ExternalInterface.addCallback(“function1”,callback1); privatefunctioncallback1():void { Alert.show(“callback1executed”); } JS: container[swf].function1(); 6、FileReference browse(typeFilter:Array = null):Boolean//揭示一个文件博览对话框,让用户抉择要上载的文件。 cancel():void//废止正在对该 FileReference 对象厉行的任何上载或下载垄断。 download(request:URLRequest, defaultFileName:String = null):void//敞开对话框,以批准用户从长途服务器下载文件. upload(request:URLRequest, uploadDataFieldName:String = “Filedata”, testUpload:Boolean = false):void//开始将用户抉择的文件上载到长途服务器。

7、flash与flex是如何调停开发的? 答:这个问题能够这么来会意,万一是确乎必需用到FLEX SDK的利用,那我们就能够发生一个flex工程,翔实必需flash做UI的时候,输出成swc作为flex的skin,万一说并无须要flex sdk,只是为了编码得体而抉择flex的话,那我们凡是发生一个as工程,让flex作为flash的编码器。

8、请说下事件里的currentTarget 和 target的区别? 答:在事件流的过程中,目标阶段确定的目标对象由Event中的target属性来记录, 冒泡阶段移动的游标则由currentTarget来记录。事件对象冒泡过程中每往上移动一级,就会克隆出一个仅与前副本currentTarget不同的新副本。

9、warning: unable to bind to property ” on class ‘Object’ (class is not an IEventDispatcher) 在使用ItemRender时,经常会出现这种警告? 答:ArrayCollection的子元素是无法作为数据源绑定的。可以声明中间变量,在override set data时将ArrayCollection的子元素传入, 然后再将中间变量作为新的绑定源即可。

10、常用的几个切换数据的组件比如: TabNavigator等都有属性 creationPolicy 你知道这种策略的使用方式是什么嘛?以及优,缺点呢? 答:延迟实例化。优点是可以更快地加载组件,缺点是首次访问其他组件时,由于需要重新加载此组件,可能会有一定的延迟。

11、请试写一个自定义的验证组件 答:

package myCompenent
    {
        import mx.validators.Validator;//引用Validator类
        import mx.validators.ValidationResult;//引用ValidationResult类
        public class myValidators extends Validator
        {
            public function myValidators()//构造函数
            {
                super();
            }
            private var results:Array;//定义一个数组,用以存储错误
            //重写验证函数
            override protected function doValidation(value:Object):Array
            {
                var s:String = value as String;
                results = [];//清空数组
                results = super.doValidation(value);//先用继承类中的doValida tion方法验证
                if (results.length &gt; 0)//如果验证时有错,返回错误信息
                    return results;
                if(s.length&gt;6)//自定义验证,字符长度不超过6
                {
                    //记录出错信息
                    results.push(new ValidationResult(true,”text”,”StringTooLong”, “字符长度超过6了”));
                }
                return results;
            }
        }
    } 

Way Lau

Software Engineer and Full Stack Developer, now work and live in Shenzhen, China. Detail

Donate

See the list of Donors.