??xml version="1.0" encoding="utf-8" standalone="yes"?> 【改变输出swf的尺?背景颜色或频?nbsp; 【华氏温度和摄氏温度之间的{换?nbsp; 本文转自:http://hi.baidu.com/honfei/blog/item/df5d1e945a7b441bd31b7045.html
1.1 屏蔽键盘所有键
<script language="javascript">
<!--
function document.onkeydown(){
event.keyCode = 0;
event.returnvalue = false;
}
-->
</script>
1.2 屏蔽鼠标右键
在body标签里加上on_contextmenu=self.event.returnvalue=false
或?
<script language="javascript">
<!--
function document.on_contextmenu()
{
return false;
}
-->
</script>
function nocontextmenu()
{
if(document.all) {
event.cancelBubble=true;
event.returnvalue=false;
return false;
}
}
或?
<body onmousedown="rclick()" on_contextmenu= "nocontextmenu()">
<script language="javascript">
<!--
function rclick()
{
if(document.all) {
if (event.button == 2){
event.returnvalue=false;
}
}
}
-->
</script>
1.3 屏蔽 Ctrl+N、Shift+F10、F5h、退格键
<script language="javascript">
<!--
//屏蔽鼠标右键、Ctrl+N、Shift+F10、F5h、退格键
function window.onhelp(){return false} //屏蔽F1帮助
function KeyDown(){
if ((window.event.altKey)&&
((window.event.keyCode==37)|| //屏蔽 Alt+ 方向?←
(window.event.keyCode==39))){ //屏蔽 Alt+ 方向?→
alert("不准你用ALT+方向键前q或后退|页Q?);
event.returnvalue=false;
}
/* 注:q还不是真正地屏?Alt+ 方向键,
因ؓ Alt+ 方向键弹告框Ӟ按住 Alt 键不放,
用鼠标点掉警告框Q这U屏蔽方法就失效了。以后若
有哪位高手有真正屏蔽 Alt 键的ҎQ请告知?/
if ((event.keyCode == &&
(event.srcElement.type != "text" &&
event.srcElement.type != "textarea" &&
event.srcElement.type != "password") || //屏蔽退格删除键
(event.keyCode ==116)|| //屏蔽 F5 h?
(event.ctrlKey && event.keyCode==82)){ //Ctrl + R
event.keyCode=0;
event.returnvalue=false;
}
if ((event.ctrlKey)&&(event.keyCode==78)) //屏蔽 Ctrl+n
event.returnvalue=false;
if ((event.shiftKey)&&(event.keyCode==121)) //屏蔽 shift+F10
event.returnvalue=false;
if (window.event.srcElement.tagName == "A" && window.event.shiftKey)
window.event.returnvalue = false; //屏蔽 shift 加鼠标左键新开一|页
if ((window.event.altKey)&&(window.event.keyCode==115)){ //屏蔽Alt+F4
window.showModelessDialog("about:blank","","dialogWidth:1px;dialogheight:1px");
return false;}
}
/* 另外可以?window.open 的方法屏?IE 的所有菜?
W一U方法:
window.open("你的.htm", "","toolbar=no,location=no,directories= no,menubar=no,scrollbars=no,resizable=yes,status=no,top=0,left=0")
W二U方法是打开一个全屏的面Q?
window.open("你的.asp", "", "fullscreen=yes")
*/
//-->
</script>
1.4屏蔽览器右上角“最化”“最大化”“关闭”?
<script language=javascript>
function window.on_beforeunload()
{
if(event.clientX>document.body.clientWidth&&event.clientY<0||event.altKey)
{
window.event.returnvalue = "";
}
}
</script>
或者用全屏打开面
<script language="javascript">
<!--
window.open(www.32pic.com,"32pic","fullscreen=3,height=100, width=400, top=0, left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no, status=no");
-->
</script>
注:在body标签里加上on_beforeunload="javascript:return false"Q不能关闭H口Q?
1.5屏蔽F5?
<script language="javascript">
<!--
function document.onkeydown()
{
if ( event.keyCode==116)
{
event.keyCode = 0;
event.cancelBubble = true;
return false;
}
}
-->
</script>
1.6屏蔽IE后退按钮
在你链接的时候用 <a href="javascript:location.replace(url)">
1.7屏蔽ȝ口滚动条
在body标签里加?style="overflow-y:hidden"
1.8 屏蔽拷屏,不断地清I剪贴板
在body标签里加上onload="setInterval('clipboardData.setData(\'Text\',\'\')',100)"
1.9 屏蔽|站的打印功?
<style>
@media print {
* { display: none }
}
</style>
1.10 屏蔽IE6.0 囄上自动出现的保存图标
Ҏ一Q?
<META HTTP-EQUIV="imagetoolbar" CONTENT="no">
Ҏ二:
<img galleryimg="no">
1.11 屏蔽中所有的script
<noscrript></noscript>
2.表单提交验证c?
2.1 表单不能ؓI?
<script language="javascript">
<!--
function CheckForm()
{
if (document.form.name.value.length == 0) {
alert("误入您姓名!");
document.form.name.focus();
return false;
}
return true;
}
-->
</script>
2.2 比较两个表单的值是否相?
<script language="javascript">
<!--
function CheckForm()
if (document.form.PWD.value != document.form.PWD_Again.value) {
alert("您两ơ输入的密码不一P请重新输?");
document.ADDUser.PWD.focus();
return false;
}
return true;
}
-->
</script>
2.3 表单只能ؓ数字?_",用于电话/银行帐号验证?可扩展到域名注册{?
<script language="javascript">
<!--
function isNumber(String)
{
var Letters = "1234567890-"; //可以自己增加可输入?
var i;
var c;
if(String.charAt( 0 )=='-')
return false;
if( String.charAt( String.length - 1 ) == '-' )
return false;
for( i = 0; i < String.length; i ++ )
{
c = String.charAt( i );
if (Letters.indexOf( c ) < 0)
return false;
}
return true;
}
function CheckForm()
{
if(! isNumber(document.form.TEL.value)) {
alert("您的电话L不合法!");
document.form.TEL.focus();
return false;
}
return true;
}
-->
</script>
2.4 表单输入数?长度限定
<script language="javascript">
<!--
function CheckForm()
{
if (document.form.count.value > 100 || document.form.count.value < 1)
{
alert("输入数g能小于零大于100!");
document.form.count.focus();
return false;
}
if (document.form.MESSAGE.value.length<10)
{
alert("输入文字于10!");
document.form.MESSAGE.focus();
return false;
}
return true;
}
//-->
</script>
2.5 中文/英文/数字/邮g地址合法性判?
<SCRIPT LANGUAGE="javascript">
<!--
function isEnglish(name) //英文值检?
{
if(name.length == 0)
return false;
for(i = 0; i < name.length; i++) {
if(name.charCodeAt(i) > 128)
return false;
}
return true;
}
function isChinese(name) //中文值检?
{
if(name.length == 0)
return false;
for(i = 0; i < name.length; i++) {
if(name.charCodeAt(i) > 128)
return true;
}
return false;
}
function isMail(name) // E-mail值检?
{
if(! isEnglish(name))
return false;
i = name.indexOf("@");
j = name.lastIndexOf("@");
if(i == -1)
return false;
if(i != j)
return false;
if(i == name.length)
return false;
return true;
}
function isNumber(name) //数值检?
{
if(name.length == 0)
return false;
for(i = 0; i < name.length; i++) {
if(name.charAt(i) < "0" || name.charAt(i) > "9")
return false;
}
return true;
}
function CheckForm()
{
if(! isMail(form.Email.value)) {
alert("您的电子邮g不合法!");
form.Email.focus();
return false;
}
if(! isEnglish(form.name.value)) {
alert("英文名不合法Q?);
form.name.focus();
return false;
}
if(! isChinese(form.cnname.value)) {
alert("中文名不合法Q?);
form.cnname.focus();
return false;
}
if(! isNumber(form.PublicZipCode.value)) {
alert("邮政~码不合法!");
form.PublicZipCode.focus();
return false;
}
return true;
}
//-->
</SCRIPT>
2.6 限定表单不能输入的字符
<script language="javascript">
<!--
function contain(str,charset)// 字符串包含测试函?
{
var i;
for(i=0;i<charset.length;i++)
if(str.indexOf(charset.charAt(i))>=0)
return true;
return false;
}
function CheckForm()
{
if ((contain(document.form.NAME.value, "%\(\)><")) || (contain(document.form.MESSAGE.value, "%\(\)><")))
{
alert("输入了非法字W?);
document.form.NAME.focus();
return false;
}
return true;
}
//-->
</script>
]]>
?Navigator"H框里右键你的项?gt;选中"Properties">选中"ActionScript Compiler">?Additional compiler arguments"里输入你所需要的命o
如想改变背景颜色,误? -default-background-color 0xffffff
【鼠标坐标?nbsp;
mouseX mouseY
【检查变量类型ƈq回布尔倹{?nbsp;
is
【检查变量类型ƈq回cd?nbsp;
typeof
【检查对象类型ƈq回该对象?nbsp;
as
【是数字但不是有效数字问题?nbsp;
var quantity:Number = 15 - "rabbits";
trace(typeof quantity); //昄: "number" , 但它是NaN (not a number)
trace(quantity is Number); //true
trace(quantity != NaN); //false
//使用isNaN()函数?
isNaN(quantity); //true
//变量是否内含有效数?
!isNaN(quantity); //false
【取消默认的严格~译模式?nbsp;
?Navigator"H框里右键你的项?gt;选中"Properties">选中"ActionScript Compiler">取消"Enabel compile-time type checking"选项
【基元数据类型和复杂数据cd好比"值类??引用cd"?nbsp;
基元数据cdcM按g?
var intOne:int = 1;
var intTwo:int = 1;
trace(intOne == intTwo); //true
【复杂数据类型类似按引用传递?nbsp;
var arrayOne:Array = new Array("a", "b");
var arrayTwo:Array = arrayOne;
trace(arrayOne == arrayTwo); //true
//-----------------------------------
var arrayOne:Array = new Array("a", "b");
var arrayTwo:Array = new Array("a", "b");
trace(arrayOne == arrayTwo); //false
【优化逻辑AND(&&)和OR(||)的小知识?nbsp;
对于逻辑And(&&):
除非条g表达式的前半部分为真,否则,ActionScript不会再去求算逻辑ANDq算W的后半?如果前半部ؓ?整个条g表达式一定ؓ?所以再L后半部没效率?
对于逻辑OR(||):
除非条g表达式前半部为假,否则,ActionScript不会再去求算逻辑ORq算W的后半?如果前半部ؓ?整个条g表达式一定ؓ?
ȝ:使用逻辑AND(&&)?把结果最可能为false的表辑ּ攑ֈ前面;使用逻辑OR(||)?把结果最可能为true的表辑ּ攑ֈ前面.
【TimercL意事V?nbsp;
不要认ؓTimer可以极其准确;使用Timer旉间隔不要低于10毫秒.
【private,protected,internal,public讉K权限?nbsp;
private:只能在类本n内部讉K,按惯?命名U有成员时以下划U?_"开?
protected:可以q本n或Q何子c访?但这是以实例为基?换言?cd例可以访问自q保护成员或者父cȝ保护成员,但不能访问相同类的其它实例的保护成员,按惯?命名保护成员时以下划U?_"开?
internal:可以q本n或者相同包内的Mc访?
public:可以在类内部讉K,也可以由cd例访?或者声明ؓstatic?可以直接从类讉K.
【一个函数具有未知个数的参数,用arguments对象?...(rest)"W号讉K它的参数?nbsp;
注意:使用"...(rest)"参数会 arguments 对象不可?
private funciton average():void{
trace(arguments.length); //输出参数的个?nbsp;
// arguments的类型是:object,但可以像讉K数组一样去讉K?nbsp;
trace(arguments[1]); //输出W二个参?nbsp;
}
private function average(...argu):void{
trace(argu[1]); //输出W二个参?argu参数名是自定义的.
}
【错误处理try,catch,finally?nbsp;
private function tryError():void{
try {
trace("试开?try");
throwError();
}catch(errObject:Error) {
trace("错误信息:" + errObject.message);
trace("试l束-catch");
return;
}finally{
trace("虽然catch里已l有returnҎ,但位于returnҎ后面的finally里的代码依然会被执行.其实无论returnҎ是在try?q是catch?finally里的代码始终会被执行");
}
trace("前面已经有return?此处是不会再执行?除非没有抛出错误,以catch里的代码没有被执?);
}
private function throwError():void{
throw new Error("抛出错误");
}
【for...in与for each...in的区别?nbsp;
与for...in循环不同的是,for each...in循环中的q代变量包含属性所保存的?而不包含属性的名称(或主?索引).
【命名包路径的小技巧?nbsp;
使用相应于拥有者和相关目的包名称会比较好.按惯例来?包名U的开头应该是逆向的网址名称.例如,如果Example Corp(examplecorp.com)写了一些ActionScript3.0c?׃把所有类攑֜com.examplecorp包内(或?com.examplecorp的子包内).如此一?如果英国有另一家Example Corp(examplecorp.co.uk)也写了一些ActionScript3.0c?只要使用包uk.co.examplecorp,可保 唯一?
当类属于特定应用E序的一部分?应该放在该应用E序特定的子包内.例如,Example Corp可能有个应用E序名叫WidgetStore.如果WidgetStore应用E序使用一个名为ApplicationManager的类,则此 cd应该攑֜com.examplecorp.widgetstore包内,或者位于该包的子包?
按惯例来?包名U的开头是写字母.
【隐式的取出Ҏ(getter)和设定方?setter)?nbsp;
public function get count():uint {
return _count;
}
public function set count(value:uint):uint {
if(value < 100){
_count = value;
}else {
throw Error();
}
}
【确保类是绝不会有子c?使用final?nbsp;
final public class Example{}
【super关键字的使用?nbsp;
super(); //父类的构造函?只能在类实例构造函数内部?nbsp;
super.propertyName; //调用父类的属?属性需要声明ؓpublic或protected
super.methodName(); //调用父类的方?Ҏ需要声明ؓpublic或protected
【徏立常?使用关键字const而不是var?nbsp;
static public const EXAMPLE:String = "example";
【检播攑֙版本?nbsp;
flash.system.Capabilities.version
对于8.5版以前的MFlash Player版本,q种Ҏ都不适用.
【判断客Lpȝ?nbsp;
flash.system.Capabilities.os
【检播攑֙cd?nbsp;
flash.system.Capabilities.playerType
可能的值有:
"StandAlone"Q用于独立的 Flash Player
"External"Q用于外部的 Flash Player 或处于测试模式下
"PlugIn"Q用?Flash Player 览器插?nbsp;
"ActiveX"Q用?Microsoft Internet Explorer 使用?Flash Player ActiveX 控g
【检系l语a?nbsp;
flash.system.Capabilities.language
【判断用h否启用了IME(输入法编辑器)?nbsp;
flash.system.IME.enabled
【检屏q的分L率?nbsp;
flash.system.Capabilities.screenResolutionX
flash.system.Capabilities.screenResolutionY
【把弹出H口居中的算法?nbsp;
X = (舞台?2)-(H口?2)
Y = (舞台?2)-(H口?2)
【控制媄片配合Player的方?包括~放问题?nbsp;
stage.scaleMode
可供选择?flash.display.StageScaleMode
【舞台的寚w方式?nbsp;
stage.align
可供选择?flash.display.StageAlign
【隐藏Flash Player的右键菜单?nbsp;
stage.showDefaultContextMenu = false;
【检系l是否具有音频功能?nbsp;
flash.system.Capabilities.hasAudio
【检播攑֙是在hMP3解码器的pȝ上运?q是在没有MP3解码器的pȝ上运行?nbsp;
flash.system.Capabilities.hasMP3
【检播攑֙?(true) q是不能 (false) 播放式视频?nbsp;
flash.system.Capabilities.hasStreamingVideo
【检播攑֙是在支持 (true) 嵌入视频的系l上q行Q还是在不支?(false) 嵌入视频的系l上q行?nbsp;
flash.system.Capabilities.hasEmbeddedVideo
【检播攑֙?(true) q是不能 (false) 对视频流Q如来自 Web 摄像头的视频)q行~码?nbsp;
flash.system.Capabilities.hasVideoEncoder
【显C?Flash Player 中的"安全讄"面板?nbsp;
flash.system.Security.showSettings();
可供选择?flash.system.SecurityPanel
【让其它域的.swf讉K本域?swf?nbsp;
在本域的.swf文g里加?flash.system.Security.allowDomain()
或者用安全策略文?crossdomain.xml".在Flash 8以前,q个文g必须攑֜.swf所在域的根目录,现在,你可以用flash.system.Security.loadPolicyFile(),?定安全策略文件所在的位置.拒绝M域的做法是在<cross-domain-policy>标签内什么也不填,安全{略文g也支持通用字符 "*":
<?xml version="1.0"?>
<!-- http://www.mydomain.com/crossdomain.xml -->
<cross-domain-policy>
<allow-access-from domain="www.riahome.cn" />
<allow-access-from domain="*.Y-boy.cn" />
<allow-access-from domain="210.38.196.48" />
<allow-access-from domain="*" />
</cross-domain-policy>
【数字的不同q制之间的{换?nbsp;
parseInt(str:String, radix:uint = 0):Number q回十进制的?参数radix表示要分析的数字的基?如果省略radix,默认ؓ10,除非字符串的开头是"0x","0X"?0":
trace(parseInt("0x12")); //讑֮radix?6,输出:18
trace(parseInt("017")); //讑֮radix?,输出:15
或者用Number,uint和int对象的toString(radix)Ҏ.
【用Math.round()对一个数取整,四舍五入?nbsp;
Math.round()
trace(Math.round(204.499)); //输出:204
trace(Math.round(401.5)); //输出:402
【用Math.floor()对一个数向下取整,是只要整数部分而不理会数分?nbsp;
trace(Math.floor(204.99)); //输出:204
【用Math.ceil()对一个数向上取整,只要数部分不ؓ?整数部分加1?nbsp;
trace(Math.ceil(401.01)); //输出:402
【生一个随机数?nbsp;
使用Math.random()产生一个伪随机数n,其中 0 <= n < 1
【把数字取至最q的数点位,x定精度?nbsp;
1. 军_你要取的数字的小数点位数:例如,如果你想?0.337取成90.34,pCZ要取C位小数点?也就是说你想取至最q的0.01;
2. 让输入值除以步?所选的数字(此例?.01);
3. 使用Math.round()把步?所计得的值取成最q的整数;
4. 把步?所得的l果乘以步骤2用于除法的那个?
例如,要把90.337取成两个数点位?可以使用:
trace(Math.round(90.337/0.01)*0.01); //输出:90.34
【把数字取成一个整数的最接近倍数倹{?nbsp;
?,q样会把92.5取成5的最q倍数?
trace(Math.round(92.5/5)*5); //输出:95
?,q样会把92.5取成10的最q倍数?
trace(Math.round(92.5/10)*10); //输出:90
【在指定数D围内获得随机数?nbsp;
//可取范围:[min, max]
private function randRange(min:Number, max:Number):Number {
var randomNum:Number = Math.floor(Math.random() * (max - min + 1)) + min;
return randomNum;
}
应用例子:
模拟投银?卛_望得到随机布?true ?false): randRange(0, 1);
模拟投骰?卛_望得到随机六个? randRange(1, 6);
为避免被~存而需要生一个独一无二的数字追加在URL,通常最x法是取得当前毫秒?
【弧?radian)与度?degree)之间的{换?nbsp;
从弧度{为度? degrees = radians * 180 / Math.PI
从度数{为弧? radians = degrees * Math.PI / 180
【计两点之间的距离?nbsp;
勾股定理: c2 = a2 + b2
假设有两个媄片剪辑mc1和mc2,则它们两炚w的距c?
var c:Number = Math.sqrt(Math.pow(mc1.x - mc2.x, 2) + Math.pow(mc1.y - mc2.y, 2));
【模拟圆周运动?nbsp;
已知圆心o(x0, y0),半径r和弧度angle,求圆上Q意一点P(x, y)的坐?
x = x0 + (Math.cos(angle) * r);
y = y0 + (Math.sin(angle) * r);
注意:舞台的x轴正方向水^向右,y轴正方向垂直向下.
【模拟椭圆运动?nbsp;
已知圆心o(x0, y0),长ua,短ub以及弧度angle,求圆上Q意一点P(x, y)的坐?
x = x0 + (Math.cos(angle) * a);
y = y0 + (Math.sin(angle) * b);
华氏温度 = 摄氏度数 * 9 / 5 + 32
摄氏温度 = (华氏度数 - 32) * 5 /9
【公斤与之间的转换?nbsp;
公斤 = ?* 2.2
?= 公斤 / 2.2
【向数组d元素?nbsp;
var array:Array = new Array();
array.push("a", "b");
//向数l尾端添加单一元素也可以这?
array[array.length] = "c";
//如果以烦引设定的元素不存?数组本n会自动扩展以包含_的元素数?介于中间的元素会被设为undefined:
array[5] = "e";
trace(array[4]); //输出: undefined
【向数组开端添加元素?nbsp;
var array:Array = ["a", "b"];
array.unshift("c", "d");
trace(array); //输出: c,d,a,b
【删除数l中W一个元素ƈq回该元?使用shift()Ҏ?nbsp;
var letters:Array = new Array("a", "b", "c");
var firstLetter:String = letters.shift();
trace(letters); //输出: b,c
trace(firstLetter); //输出: a
【删除数l中最后一个元素ƈq回该元素的?使用pop()Ҏ?nbsp;
var letters:Array = new Array("a", "b", "c");
trace(letters); //输出: a,b,c
var letter:String = letters.pop();
trace(letters); //输出: a,b
trace(letter); //输出: c
【删除数l中的元?l数l添加新元素q返回删除的元素,使用splice()Ҏ?nbsp;
splice(startIndex:int, deleteCount:uint, ... values):Array
startIndex: 一个整敎ͼ它指定数l中开始进行插入或删除的位|处的元素的索引;
deleteCount: 一个整敎ͼ它指定要删除的元素数?
... values: 用逗号分隔的一个或多个值的可选列表或数组Q此列表或数l将插入到此数组中由 startIndex 参数指定的位|?
【查找数l中W一个相匚w的元素?nbsp;
var array:Array = ["a", "b", "c", "d", "a", "b", "c", "d"];
var match:String = "b";
for(var i:int = 0; i < array.length; i++) {
if(array[i] == match) {
trace("Element with index " + i + " found to match " + match);
//输出: Element with index 1 found to match b
break;
}
}
【查找数l中最后一个相匚w的元素?nbsp;
var array:Array = ["a", "b", "c", "d", "a", "b", "c", "d"];
var match:String = "b";
for(var i:int = array.length - 1; i >= 0; i--) {
if(array[i] == match) {
trace("Element with index " + i + " found to match " + match);
//输出: Element with index 5 found to match b
break;
}
}
【把字符串{成数l?nbsp;
使用String.split()Ҏ:
var list:String = "I am YoungBoy.";
var words:Array = list.split(" "); //以空g为分隔符字W串切割
trace(words); //输出: I,am,YoungBoy.
【把数组转成字符丌Ӏ?nbsp;
使用String.join()Ҏ:
var myArr:Array = new Array("one", "two", "three");
var myStr:String = myArr.join(" and ");
trace(myArr); //输出: one,two,three
trace(myStr); //输出: one and two and three
【用对象数l处理相x据?nbsp;
var cars:Array = new Array();
cars.push({make:"Mike", year:1997, color:"blue"});
cars.push({make:"Kelly", year:1986, color:"red"});
for(var i:int = 0; i < cars.length; i++) {
trace(cars[i].make + " - " + cars[i].year + " - " + cars[i].color);
}
//输出:
// Mike - 1997 - blue
// Kelly - 1986 - red
【在数组中获取最或最大倹{?nbsp;
var scores:Array = [10, 4, 15, 8];
scores.sort(Array.NUMERIC);
trace("Minimum: " + scores[0]);
trace("Maximum: " + scores[scores.length - 1]);
【用for ... in语句d兌数组元素?nbsp;
var myObject:Object = new Object();
myObject.name = "YoungBoy";
myObject.age = 20;
for(var i:String in myObject) {
trace(i + ": " + myObject[i]);
}
//输出: name: YoungBoy
// age: 20
注意: for ... in循环不会昄对象所有的内徏属?例如,循环会显C执行期间新增的Ҏ属?但是,不会列出内徏对象的方?即都是储存在对象属性内.
【AVM(ActionScript Virtual Machine,虚拟?和渲染引?Rendering Engine)?nbsp;
AVM负责执行ActionScriptE序,而渲染引擎则是把对象l制在显C器?
【指出容器的昄清单中有多少昄对象?nbsp;
每个容器都有numChildren属?
【把目新增xC清单?nbsp;
addChild(child:DisplayObject)
addChildAt(child:DisplayObject, index:int)
index: d该子的索引位置.如果指定当前占用的烦引位|?则该位置以及所有更高位|上的子对象会在子列表中上UM个位|?
【从昄清单中移除项目?nbsp;
removeChild(child:DisplayObject)
removeChildAt(index:int)
index: 要删除的 DisplayObject 的子索引,该子之上的M昄对象的烦引位|都减去1.
如果想移除窗口所有子元g,可以l合removeChildAt(),numChildren属性以及for循环.因ؓ每次一个子元g被移除时,索引位置都会变化,所?有两U方法可以处理所有子元g的移?
1. LU除位置0的子元g;
2. 倒过来移除子元g,也就是从开?
【更改现有子在昄对象容器中的位置?nbsp;
setChildIndex(child:DisplayObject, index:int):void
可能用到的方?
q回 DisplayObject ?child 实例的烦引位|? getChildIndex(child:DisplayObject):int
q回位于指定索引处的子显C对象实? getChildAt(index:int):DisplayObject
注意: 当子元gUd低于它现在所在位|的索引?那么,从标的烦引v,直到子元件烦引前面的那个索引的所有子元g都会令其索引增加1,而该子元件就会指定至标的 索引.当子元gUd较高索引?从该子元件烦引之上的那个索引?直到标的索引的所有子元g都会令其索引往下减1,而该子元件就会指定至标的索引?
【关于TextField以垂直方式把文字摆在按钮表面中心点的技巧?nbsp;
textField.y = (_height - textField.textHeight) / 2;
textField.y -= 2; //?个像素以调整偏移?nbsp;
【外?swfq载入和互动?nbsp;
1. 监听init事g;
2. 透过content属性存取所载入的媄?
当所载入的媄片做好够的初始化工?使其Ҏ和属性可以接受互动时,init事g׃被发?只有在蝲入器发vinit事g?才能控制q.所载入的媄片还没初始化p着与它互动,是会产生执行期间错误?
_loader.contentLoaderInfo.addEventListener(Event.INIT, handleInit); //当蝲入的.swf的属性和Ҏ可用?nbsp;
_loader.load(new URLRequest("ExternalMovie.swf"));
private function handleInit(event:Event):void {
var movie:* = _loader.content;
trace(movie.getColor());
movie.setColor(0xFF0000);
}
【TextField有两U类?动?dynamic)和输?input),默认gؓ动?改变TextFieldcdҎ?nbsp;
field.type = TextFieldType.INPUT; //selectable属性默认gؓtrue
flash.text.TextFieldType.INPUT和flash.text.TextFieldType.DYNAMIC
【过滤文字输入?nbsp;
TextField.restrict = "此处为可输入的内?;
field.restrict = "^此处为禁止输入的内容";
restrict属性支持一些类似正则表辑ּ的样?
field.restrict = "a-zA-z"; //只允许大字?nbsp;
field.restrict = "a-zA-z "; //只允许字母和I格
field.restrict = "0-9"; //只允许数?nbsp;
field.restrict = "^abcdefg"; //除了写字母abcdefg不允许外,其它都允?nbsp;
field.restrict = "^a-z"; //所有小写字母都不允?但是,其它内容都允?包括大写字母
field.restrict = "0-9^5"; //只允许数??例外
让restrict字符包含hҎ意义的字?例如-和^):
field.restrict = "0-9\\-"; //允许数字和破折号
field.restrict = "0-9\\^"; //允许数字和^
field.restrict = "0-9\\\\"; //允许数字和反斜杠
你也可以使用Unicode转义序列,指定允许的内?例如:
field.restrict = "^\u001A";
注意:ActionScript有区分大写?如果restrict属性设为abc,允许字母的大写Ş?A,B和C)输入时会变成写对待形式(a,b和c),反之亦然.restrict属性只影响用户可以输入的内?脚本可将M文本攑օ文本字段?
【设定输入框的最大长度?nbsp;
TextField.maxChars:int
【向TextFieldq加内容?nbsp;
TextField.appendText(text:String):void
与通过?text 属性用加法赋值来q接两个字符?例如 field.text += moreText)相比,此方法的效率更高.
【显CHTML格式的文字?nbsp;
TextField.htmlText = "<b>Html text</b>";
支持的HTML标签集有: <b>,<i>,<u>,<font>(有face,size以及color属?,< p>,<br>,<a>,<li>,<img>以及<textformat>(?leftmargin,rightmargin,blockindent,indent,leading以及tabstops属?相应?TextFormatcȝ同名属?
【羃减空白?nbsp;
TextField.condenseWhite = true;
删除hHTML文本的文本字D中的额外空?I格,换行W等),如同多数HTML览器所做的那样.
注意: 在设|?htmlText 属性之前设|?condenseWhite 属?nbsp;
【自动大调整和寚w?nbsp;
TextField.autoSize = TextFieldAutoSize.LEFT;
可选之?
flash.text.TextFieldAutoSize.CENTER
flash.text.TextFieldAutoSize.LEFT
flash.text.TextFieldAutoSize.NONE
flash.text.TextFieldAutoSize.RIGHT
【指C文本字D|否自动换行?nbsp;
TextField.wordWrap = true; //自动换行
【用E序手段滚动文字?nbsp;
水^方向以像素ؓ单位,而垂直方向以行做单位:
scrollV: 指出文字框可见区域的最行,可读?
bottomScrollV: 指出文字框内最底端可见?只读;
maxScrollV: scrollV的最大?只读;
numLines: 定义多行文本字段中的文本行数,只读;
TextField.scrollV = field.maxScrollV; //滚动到最后一?nbsp;
【响应滚动事件?nbsp;
field.addEventListener(Event.SCROLL, onTextScroll);
【样式化文字的方法?nbsp;
1. 使用HTML标签q行样式?
2. 使用TextFormat对象;
3. 使用CSS.
例如: HTML是用<font>标签,TextFormat对象是设定font属?而CSS是用font-family属性的.
受支持的层叠样式?CSS)属性和?及其相应的ActionScript属性名U?括号内):
color(color),display(display),font-family(fontFamily),font-size(fontSize),font-style(fontStyle),font-weight(fontWeight),kerning(kerning),leading(leading),letter-spacing(letterSpacing),margin-left(marginLeft),margin-right(marginRight),text-align(textAlign),text-decoration(textDecoration),text-indent(textIndent)
受支持的HTML实体: <(于? <), >(大于? >), &(? &), "(双引? "), '(撇号,单引? ')
其中样式对象的两U写?
写法一:
var sampleStyle:Object = new Object();
sampleStyle.color = "#FFFFFF";
sampleStyle.textAlign = "center";
css.setStyle(".sample", sampleStyle);
写法?
var sampleStyle:Object = {color: "#FFFFFF", textAlign: "center"};
css.setStyle(".sample", sampleStyle);
【对用户输入的文字进行样式化?nbsp;
使用defaultTextFormat属?样式会施加至用户键入输入框的文字w上:
var formatter:TextFormat = new TextFormat();
formatter.color = 0x0000FF; //把文字变成蓝?nbsp;
field.defaultTextFormat = formatter;
【对现有文字的一部分q行样式化?nbsp;
TextFormat.setTextFormat(format:TextFormat, beginIndex:int = -1, endIndex:int = -1):void
【设定文字框的字体?nbsp;
例子:
HTML: field.htmlText = "<font face='Arial'>Formatted text</font>";
TextFormat: formatter.font = "Arial";
CSS: P{ font-family: Arial; }
也可以用以逗号隔开的字体清? formatter.font = "Arial, Verdana, Helvetica";
注意:
字体和字体群l不?字体组有三U? _sans,_serif以及_typewriter.
_sans组一般就是指Arial或Helveticaq种字体;
_serif组一般就是指Times或Times New Romanq种字体;
_typewriter组一般就是指Courier或Courier Newq种字体.
【嵌入字体?nbsp;
使用[Embed]后设标签.[Embed]后设标签应该出现在ActionScript文g?处于cd告之?你可以内嵌TrueType字体或系l字?内嵌TrueType字体时的语法:
[Embed(source="pathToTtfFile", fontName="FontName", mimeType="application/x-font-truetype")]
pathToTtfFile: ttf文g的\?TrueType字体的\径可以是相对?也可以是l对?
FontName: 字体名称;
内嵌pȝ字体的语?
[Embed(systemFont="Times New Roman", fontName="Times New Roman", mimeType="application/x-font-truetype")]
fontName: 以相同名UC为实际系l字体名U?
注意: 在用嵌入字体时,要把TextField的embedFonts属性设为true,q样TextField只能用内嵌字体了.如果你试着?embedFonts设ؓtrue的TextField使用讑֤字体,什么都不会昄.如果embedFonts设ؓtrue,无法指定以逗号盔R的字 体清?
【徏立可以旋转的文字?nbsp;
使用内嵌字体.当你旋{文字框时,讑֤字体׃消失.
【显CUnicode文字?nbsp;
1. 从外部来源蝲入Unicode文字;
2. 假如你的~辑器支持Unicode(?Flex Builder),则可以直接在ActionScriptE序中用该字符;
3. 使用Unicode转义字符,ActionScript里所有Unicode转义字符都以\u开?后面再跟四位十六q制数字.
注意: 如果你想取得Unicode字符,在Windows下? 开?gt;所有程?gt;附g>pȝ工具>字符映射?
【把Flash Player的焦点带l文字框?nbsp;
stage.focus = field;
把焦点移?
stage.focus = null;
注意: ?swf文g首次载入至网|览器?q没有焦?因此,以程序的方式把焦Ҏ定给Flash应用E序的一个元素前,必须先把焦点U至Flash Player.
【以ActionScript选取文字?nbsp;
使用TextField.setSelection(beginIndex:int, endIndex:int):void
Z可以正常选取文字,文字框必d有焦?
stage.focus = field; //把焦点设l文字框
field.text = "This is example text"; //讑֮文字
field.setSelection(0, 4); //?This"q个单词以高亮显C?nbsp;
使用只读的selectionBeginIndex和selectionEndIndex属性访问所选取的字W范围的索引.
【在文字内设定安插点(游标位置)q访问游标位|的索引倹{?nbsp;
可以使用TextField.setSelection()把v始和l尾的烦引参数都设成相同?在文字内讑֮游标位置(假设h焦点):
field.setSelection(0, 0); //在第一个字W前摆放安插?nbsp;
trace(field.caretIndex); //输出游标位置的烦引?/p>
]]>
虽然我们不想创徏在无法预期时抛出q行时异常的E序Q但q种情况q是会发生——尤其是W一ơ运行复杂程序时。通常是用默认行为、打印堆栈溢出和l束U程的生命来处理q些异常?
从哪里发现默认行为?每个U程都属于一个由 java.lang.ThreadGroup c表C的U程l。顾名思义Q线E组允许您将U程l合在一赗您可能是ؓ了方便而将U程l合Q例如,一个线E池中的所有线E都属于l?XQ而另一个池的所有线E则属于l?YQ或者是Z讉K控制而将U程q行l合。组 X 中的U程无权讉K或改变组 Y 中的U程Q除非它们都在同一U程l内Q或在一个子l内Q?
?Tiger 之前Q?ThreadGroup cL供了一U处理未捕获异常的方法: ThreadGroup ?uncaughtException() Ҏ。如果异怸?ThreadDeath Q则线E的名称和堆栈回溯(stack backtraceQ发送到 System.err 。但?Tiger d了另一U方法: Thread.UncaughtExceptionHandler 接口。细?ThreadGroup 或安装该新接口的实现都允许您更改默认行ؓ。我们将?Tiger 之前和之后提供的Ҏ都进行研I?
使用 ThreadGroup 的定制行?/strong>
发生未捕L异常Ӟ默认行ؓ是将堆栈溢出打印输出到系l错误( System.err Q中Q如清单 1 中所C。不需要用Q何命令参数来启动E序?
清单 1. U程溢出CZ
public class SimpleDump {
public static void main(String args[]) {
System.out.println(args[0]);
}
}
不用Q何参数运行该E序生成清?2 中的输出。尽它不是一个很长的堆栈跟踪Q但它是一个完整的堆栈跟踪?br />
清单 2. 默认U程溢出输出
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at SimpleDump.main(SimpleDump.java:3)
正如 Java q_的许多东西一P如果不喜Ƣ默认行为,您可以对其进行更攏V在 Java q_?Tiger 版以前的版本中,不能替代所有线E的默认行ؓQ但是可以创Z个新?ThreadGroup Qƈ更改在该l内创徏的Q何线E的默认行ؓ。您可以重写 uncaughtException(Thread t, Throwable e) Ҏ来定制该行ؓ。然后,当发生未预料的运行时异常Ӟ该线E组内创建的MU程都将获得新的行ؓ。不q,最好是修复基础问题Q我提供一个简单的CZQ说明更攚w认行为所必需的步骤。清?3 展示了将执行代码攑օ新线E的调整q的试E序Q?
清单 3. 调整q的U程溢出CZ
public class WindowDump {
public static void main(String args[]) throws Exception {
ThreadGroup group = new LoggingThreadGroup("Logger");
new Thread(group, "myThread") {
public void run() {
System.out.println(1 / 0);
}
}.start();
}
}
LoggingThreadGroup cL一个新的内容,清单 4 中显CZ它的定义。ؓ了进行说明,通过重写 uncaughtException() Ҏ实现的特D行为将在一个弹出窗口中昄该异常,q项操作是在Ҏ Handler 的帮助下使用 Java Logging API 来完成的?
清单 4. LoggingThreadGroup 的定?br />
import java.util.logging.*;
public class LoggingThreadGroup extends ThreadGroup {
private static Logger logger;
public LoggingThreadGroup(String name) {
super(name);
}
public void uncaughtException(Thread t, Throwable e) {
// Initialize logger once
if (logger == null) {
logger = Logger.getLogger("example");
Handler handler = LoggingWindowHandler.getInstance();
logger.addHandler(handler);
}
logger.log(Level.WARNING, t.getName(), e);
}
}
q里创徏的定?Handler 的类型ؓ LoggingWindowHandler Q该cd的定义在清单 5 中。处理程序用了一个支持类 LoggingWindow Q该cd异常昄在屏q上?清单 6 中显CZ该类的定义?Handler ?public void publish(LogRecord record) Ҏ实现了一些重要操作。其余操作大部分只与配置有关?
清单 5. LoggingWindowHandler 的定?br />
import java.util.logging.*;
public class LoggingWindowHandler extends Handler {
private static LoggingWindow window;
private static LoggingWindowHandler handler;
private LoggingWindowHandler() {
configure();
window = new LoggingWindow("Logging window...", 400, 200);
}
public static synchronized LoggingWindowHandler getInstance() {
if (handler == null) {
handler = new LoggingWindowHandler();
}
return handler;
}
/**
* Get any configuration properties set
*/
private void configure() {
LogManager manager = LogManager.getLogManager();
String className = getClass().getName();
String level = manager.getProperty(className + ".level");
setLevel((level == null) ? Level.INFO : Level.parse(level));
String filter = manager.getProperty(className + ".filter");
setFilter(makeFilter(filter));
String formatter = manager.getProperty(className + ".formatter");
setFormatter(makeFormatter(formatter));
}
private Filter makeFilter(String name) {
Filter f = null;
try {
Class c = Class.forName(name);
f = (Filter)c.newInstance();
} catch (Exception e) {
if (name != null) {
System.err.println("Unable to load filter: " + name);
}
}
return f;
}
private Formatter makeFormatter(String name) {
Formatter f = null;
try {
Class c = Class.forName(name);
f = (Formatter)c.newInstance();
} catch (Exception e) {
f = new SimpleFormatter();
}
return f;
}
// Overridden abstract Handler methods
public void close() {
}
public void flush() {
}
/**
* If record is loggable, format it and add it to window
*/
public void publish(LogRecord record) {
String message = null;
if (isLoggable(record)) {
try {
message = getFormatter().format(record);
} catch (Exception e) {
reportError(null, e, ErrorManager.FORMAT_FAILURE);
return;
}
try {
window.addLogInfo(message);
} catch (Exception e) {
reportError(null, e, ErrorManager.WRITE_FAILURE);
}
}
}
}
清单 6. LoggingWindow 的定?br />
import java.awt.*;
import javax.swing.*;
public class LoggingWindow extends JFrame {
private JTextArea textArea;
public LoggingWindow(String title, final int width,
final int height) {
super(title);
EventQueue.invokeLater(new Runnable() {
public void run() {
setSize(width, height);
textArea = new JTextArea();
JScrollPane pane = new JScrollPane(textArea);
textArea.setEditable(false);
getContentPane().add(pane);
setVisible(true);
}
});
}
public void addLogInfo(final String data) {
EventQueue.invokeLater(new Runnable() {
public void run() {
textArea.append(data);
}
});
}
}
执行 清单 3 中的 WindowDump E序出现屏q。因为没有从 Logger 中删除控制台处理E序Q所以堆栈溢Z出现在控制C?
发生q行时异常时Q可能要做许多工作来更改发生的问题。该代码的大部分都是 Logging HandlerQ但是,要执行更改,必ȝ?ThreadGroup Q重?uncaughtException() Q然后在该线E组中执行您的线E。不q,让我们通过只安?Thread.UncaughtExceptionHandler Q来看一?Tiger 的处理方式?
使用 UncaughtExceptionHandler 的定制行?/strong>
对于 TigerQ?Thread cd义中d了一个新的公共内部类 UncaughtExceptionHandler Q更完整的名UCؓ Thread.UncaughtExceptionHandler Q其他类讉K内部cL需要用完整名Uͼ。接口的定义是一个方法,如图 7 中所C:
清单 7. UncaughtExceptionHandler 的定?br />
public interface Thread.UncaughtExceptionHandler {
public void uncaughtException(Thread, Throwable);
}
您可能没有注意到Q清?7 中的Ҏ与我们前面重写的 ThreadGroup 的方法相同。实际上Q现在由 ThreadGroup cd现该接口?
新的内部cd以帮助我们了解下列两ҎҎQƈ有助于我们在 Thread 中用它们:
getUncaughtExceptionHandler() ?setUncaughtExceptionHandler() ?
getDefaultUncaughtExceptionHandler() ?setDefaultUncaughtExceptionHandler() ?/td>
W一Ҏ法是 getUncaughtExceptionHandler() ?setUncaughtExceptionHandler() Q它们允许您为当前线E及其后代定制行为,从而允怺十或更多的线E拥有自q定制行ؓ。不q,您更可能使用W二Ҏ?getDefaultUncaughtExceptionHandler() ?setDefaultUncaughtExceptionHandler() 。如果用第二对Ҏ讄默认处理E序Q那么没有自q异常处理E序的所有线E都用默认处理程序?
听v来好像很单。ؓ了进行说明,清单 8 转换?清单 3 中的 ThreadGroup 友好的程序,使用新的 UncaughtExceptionHandler 接口Q?
清单 8. UncaughtExceptionHandler CZ
public class HandlerDump {
public static void main(String args[]) throws Exception {
Thread.UncaughtExceptionHandler handler = new LoggingThreadGroup("Logger");
Thread.currentThread().setUncaughtExceptionHandler(handler);
System.out.println(1 / 0);
}
}
该程序只是将 LoggingThreadGroup 重用?UncaughtExceptionHandler Qƈ没有创徏新的处理E序实现。请注意Q与原来的代码相比,C码要z得多?
其他U程更改
Thread cM仅支持?Tiger d的未捕获异常处理E序Q它q支持?getAllStackTraces() 获得所有有效线E的堆栈跟踪Q或者支持?getStackTrace() 来只获得当前U程的堆栈跟t。这两种堆栈跟踪都返回类型ؓ java.lang.StackTraceElement 的对象, java.lang.StackTraceElement ?Java 1.4 q_中添加的一个类Q它可以让您生成自己的堆栈跟t。同ӞJava 5 q_新添加的功能是一个惟一U程标识W(可以使用 getId() 获得该标识符Q和一个新?Thread.State c,以及与该cȝ关的 getThreadState() Ҏ。最后一个线E更Ҏ一个状态枚举表Q该表是用来监视pȝ状态,而不是用来同步状态的?
l束?/strong>
像添加未捕获的异常处理程序这L单库更改Q可以极大地增加原代码的可理解性。虽然在U程l别上Q新的库代码的功能与原来库代码的相同Q但新模型中的易用性和灉|性远q超Z代码调整ؓ更新的方式所需的时间。当Ӟ老方法仍然可以用,但最好将代码更新为最新的库功能?
]]>
]]>
<property name="password" value="DB_PASSWORD"/>
<property name="selectMethod" value="direct"/>
<property name="serverName" value="DB_HOSTNAME"/>
<property name="portNumber" value="1433"/>
<property name="databaseName" value="DATABASE_NAME"/>
如下图:
Ҏ配置文g里说明:
datasource-classname="com.microsoft.jdbcx.sqlserver.SQLServerDataSource"
res-type="javax.sql.DataSource"
如下图:
q里注意的是Q需要连接驱动jar包三个,攑֜%glassfish_home%\lib下:
msbase.jar、mssqlserver.jar、msutil.jar
然后点击ping按钮Q测试连接是否成功,如果如上配置Qsqlserver已经启动Q则如下图:
q有是sqlserver的n份验证得为合模式,如下图:
不然如上配|在pingӞ会报用户"sa"dp|Q未与信任SQL Serverq接相关联,如下图:
Q,mysql 5.1的数据库q接池的配置?br />
配置比较利Q查看mysql_type4_datasource.xml配置文gQ?br />
<property name="user" value="DB_USER"/>
<property name="password" value="DB_PASSWORD"/>
<property name="url" value="jdbc:mysql://DB_HOSTNAME:3306/DATABASE_NAME"/>
不过偶这里采用了另外的配|方式,如下图:
q且Q?br />
datasource-classname="com.mysql.jdbc.jdbc2.optional.MysqlDataSource"
res-type="javax.sql.DataSource">
如下图:
而且?glassfish_home%\lib下放mysqlq接驱动Q?br />
mysql-connector-java-5.0.8-bin.jar
然后点击ping按钮Q测试连接是否成功,如果如上配置Qmysql已经启动Q则如下图:
]]>
从TIOBE|站的语a排名可以看出Q比?000?008q_Java ?0%跌到20%左右, C++?8%跌到11Q, 静态语a?2%占有率降C60%; 动态语a?7%升到40%Q其中Python?%?%, Ruby?< 1%?.5%。PHP?%长到11%?以上数据为大U估?
从企业界角度看,语言的流行性与以个几点有关Q?
1) 成熟的库(library)
Python的库非常多, Groovy可以调用强大的Java所有的库,ruby差些Q但是正在赶上?
2) 行框架
如果某种语言有个行框架Q那p吸引q来很多使用者。Ruby on Rail是杀手框架。Python 框架很多Q但是目前尚没有特别H出的。Groovyq年轻,只有个GrailsQ但是可以利用JAVA已有的框架如SPRING HIBERNATE?
3) 行E序
如果某个行E序使用了某语言Q那么这U语a不可必免会被多h使用。比如iPhone的出C一U可能没多少人听说过?Cocoa热了hQ因Zh们用它编写在iPhone上运行的手机E序。这三种动态语a中Python在图象处理,或科学计界已占有一席之地。Ruby可能落后一些,Groovy几乎没有。JavaEye
4) 企业界的們
市场通常会們于简单好用省时省力,易于使用l护Q稳定,能承受大负荷(scalable)的语aQ这也是JAVA的流行性当时超qCQ?的原因,q三个语a比静态语a都简单,其中Python׃其语法和句法单,所以可能是最好维护,而且能够承受高负?Youtube每天C点击)QRUBY 有些语法也能使程序写得很单,Ml护上比Python感觉差了一点,让其他h看程序可能不是非常直接易懂,性能上目前也差些。Groovy 模仿了大量RUBYQ也借鉴了少量Python文法Q由于在JVM上运行,性能上应该是不错的?
5)对硬件的利用
对着双核的出玎ͼ可以预料双核Q四核,16, 32..核CPU都可能在未来出现。如果未来语a只能利用多核中的一核,那未免太费了,也可能因此而落于h后。从q一点上看GROOVY有天然优势,能借助JVM完成q一dQPYTHON 正在U极研制新的Ҏ实现Q也可以在JVM或WINDOW环境下运行JPython 与IronPythonQRuby落后些,但是也有JRuby和IronRubyQv步晚些?
从语a的各自优~点来看Q?
Python:
1)三者中最成熟Q通用Q工具库多,资源丰富Q文档等支持强大Q几乎能做Q何事Q网l,囑Ş界面Q桌面程序,服务器,囑Ş处理Q算法等?
2)相比之下性能好,q行速度快,负蝲力强?
3)单易学,文法z,其用空白羃q代替花括号或END使代码看h很干净Q易L懂因此易l护?
4)Z量使用一U方法完成一件事Q越单越好的哲学。这U哲学适合大型目Q因其他人看着易懂Q好l护Q不至于q多灉|J杂的语法自己玩的爽了Q别人看得傻了。这与RUBY的用许多U方法完成一件事的哲学正相反。GROOVY感觉在两者之间?
5)得到业界承认
a) 大多数LinuxQ或者流行Linux中绝大多数都默认安装PythonQ这意味着不管你是哪国人在哪里Q想用哪台Linux机子Q想用Python可以用Q省旉手;要用Ruby Groovyq得安装?
b) 有巨头支持。几个例子,Google 互联|老大Q公司内部中Python是官方的W三语言Q有内部员工说他们是能用PythonqPythonQ?实在不行才用C++; Youtube 大部分是?Python写的Q著名Linux发行版Ubuntu的发行公司的官方语言Q也是其创始人的首选语aQ其他还有Redhat, NASA, 动画公司Pixar{;桌面E序如流行程序BT客户端等Q?
~点Q?
1)不是完全的面向对象,语法中杂有函数调用Ҏ?
2)使用I白~进代替截止W在|页制作有点问题Q这时还得需要新语言或语法,代码Copy Paste{时Q用Tab时也可能有点ȝQ?
3)好象目前q不支持多核CPU
4)管创始Pythonq一名字取自一个喜剧团体,但是其名字或图标可能会一些h反感Q有些Python语言|站的的Python囄着实不令h喜欢。不喜欢q种动物的h可以考虑选其它的Q比如Python的弟弟Ruby?
要:Python适合大中型企业各类开发,几乎无所不在Q无所不能Q想跟紧大型企业或者需要成熟的库,Python可能较合适?
Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-
Ruby
1) 语法是更U正的面向对象语aQ许多功能让从Java/C++世界q来的h耳目一斎ͼ因ؓ它借鉴了包括Python, Smalltalk, Lisp{在内的一些其它优U语言的优炏V一切都是ObjectQ如避免Python的类似len("name")Q而采?"name”.length, q有提供cd部参数数据的保护{?提供的更多语法,使程序更易懂l, 比如它有Block closure,它用' < ' 来表C类l承Q用?来表C回是否的函数?
2) 灉|的魔q语法,如模块的混入Q块Q开攑ּ的类定义Q加上已有的动态性其变得极其灵z;各种J多的著名设计模式在它手中好象都失去了意义,Java做梦都想辑ֈ的灵zL在RUBY手中轻而易举,Spring AOP相比也失M光泽Q设计大师们的法则与多年l验也好象都不再适用?
3) 相比Python提供了End作ؓE序块的截止W,q是Rubist们自认ؓ的一大进步,也是与Python的一个重要区别?
4) 杀手框架QRuby on RailsQ及q有些其它杀手框架正在一一跃出?
5Q有跑在JVM的JRuby和微软的IronRuby
6Q名字与图标很好 Ruby U宝x瞄准Perl Q珍珠)的承者而来的,名字与图标都优雅端庄赏心阅目?
~点
1)灉|可能有负面媄?
开攄cd大型E序中可能会造成混ؕQ不易懂不易l护Q类可能会不知道是谁在哪个角落改?不过有了IDE的支持这U情况可能可以解?Q语法方法的灉|可能使代码不规范Q一个h喜欢写魔qM码的有可能后来人看不懂Q其用多U方法实C个目的的哲学好象是在鼓励代码的多LzL,q在大型目中会加大l护隑ֺ。这可能也是Z目前未有大型企业界使用Ruby的原因?
2)性能相对不强 原有的Ruby速度慢,E_性相对差些,据说是原有的GC写的不强。不q随着新的更好的RUBY~译器的出现与硬件的快速发展与h降低Q此性能问题应该能够在不q的未来解决。据Java Eye的RobbinԌ即有此性能问题Q扩充硬件或讄pȝ也多可解决问题?
3)对线E支持不强,Ruby 2.0据说要加?
4)好象未支持多核Q不q未来可能解冻I道理?)
5)对End的意?nbsp; 不少为Ruby的Endq多Q显得不好看。代码在写很多层时尤其如此,q样使查扄应的起始位置增加隑ֺ。有人徏议其创始人Mats提供End的替代字W,他有此意Q但是好象没有他看的上的Q如果谁不喜ƢEnd的,找个自认Z错的字符发给总部吧,要趁早,否则以后来难攏V?
要:Ruby是o人兴奋的Q学习Ruby可以加深E序员对面向对象Q及计算a的理解,从这一点上_Python更只象个工具QRuby灉|却又很有深度Q值得一学。Ruby的主要缺Ҏ其性能性,但是看Java的历史可知,当时Java的速度被评为比C++差得太远Q可是几q后性能随着g的发展而大大加强,所以Ruby的性能应该在未来不会是大问题?
看过Python 和ruby后,本应此|手了,但是对这两语a感觉仍有遗憾之处Q于是看C以前看Ruby时瞧不上的Groovy, 却发现这是个不可看的语aQ不仅如此,而且Groovy可能会成为未来耀眼的新星?
------------------------------------
Groovy
1Q初看Groovy, 它好象是Ruby 与java的结合体Q也d了少量Python的东ѝRuby中引以ؓ傲的一切是对象QGroovy也可以作刎ͼ?3.times { ...}, 块传递,动态改变类Q增加类函数{。它借鉴了大量Ruby 的语法,但是保留了C/C++/JavaE序员熟悉的花括P没有用Ruby无所不在?End”。而且对Ruby的一些生ȝ字符q行了改q,使得更加友好易懂Q如块中?| x | 换成?→ x
2Q被Thoughtwork(是写重构那本书的Martin Fowler所在公?l理UCؓ “Java 2.0” Q可?#8220;无缝”l合Java 代码Q你可以在Groovy文g中写Java代码Q用Java库。Groovy象是个轻量的动态版Java,而且加大扩展了许多易用的句法Q以前曾惌的一?Java 要是q么写多好啊" 竟然在Groovy中实CQ?如去掉了多余的分P三引号得多行的文本变量整洁好看Q砍掉了没多大用的getter setter{?
3 )可以使用所有Java的库Q因为Groovy"是Java”。相比Ruby爱好者在一个一个辛苦编写各U库的时候,Groovy已经是站在Java 的R头上向前冲了?
4)支持多核CPUQ未来的g是多核CPU的世界,谁不支持多核可能不是淘汰p后。由于跑在JVM上,Groovy再次领先于Python和RubyQ有Q也有Jython 和Jruby 啊,但是从与Java的结合性及调用Java代码或库来说QGroovy无疑是极佳的l合QJruby或Jython相比下显得ƈ不自然?
5)性能不错
Groovy不再是一个玩h试用品,一个已l用Groovy的公司其正式发布的品中有超q十万行Groovy代码?
其性能相比Python我不清楚Q但有测试说Grail性能不亚于,甚至更强于Ruby on Rails.׃Groovy跑在JVM上,性能应该不会太差?
6)业界的支?
Groovy 2003q左叛_出现Q还是新生儿Q还谈不上大型业界的大量支持Q就qSun公司也对Ruby青眼有加Q得Groovy爱好者大׃qI抱怨Sun偏向外hQ不向自p个Java 亲生子。目前可能只有Oracle与Thoughwork支持?那么目前业界q未大力支持Q谁可能会支持Groovy呢?U下认同q种说法Q就是全世界Java与C++的几百万E序员中可能会有不少支持的。这是由于Groovy与JavaQ或Cpd语言句法的近似及与其与Java“无缝”l合的特点相关的。流行语a的发展目前ؓ止是在相似的基础上发展的Q想想C → C++ → Java 他们的句法是不是怼Q从q一点上看,Groovy最与JavacMQ?试想Q如果有两种语言有相q的功能Q一U有你熟悉的句法Q另一U却较ؓ生僻Q哪U语a更易上手Q从企业界的角度来说QJava的业?Sun, IBM Oracle{?在过dq中已经投资了大量金׃旉在Java上,如果一U语a能与目前的Java目自然l合使用调用Q另一U语a有全新的语法要员工学习,企业界的目l理会选择哪个Q?即Ruby On Rails再强大,如果使用Ruby Python意味着十年来的人力Q资源,框架(Spring Hibernate)库等投资大部分作废,在Grail能带来Rails 70%的编码效率,120%的性能Qƈ且利用已有的框架与员工的情况下,企业会选择哪个Q所以个为JavaE序员或企业界可能会以后认识到Groovy能带来的益处?
7Q名字v的也不错
名字?#8220;很棒“Q?”极佳“Q?有着很积极正面的含意
~点Q?
1Q它虽然借鉴了大量Ruby的语法,但是有少部分没有完全实现Q如开攄c,它只是在一定范围内对类开放修攏V?
2QGroovy是Java, 目前只有JVM的实玎ͼ只能跑在有JVM的机子上。做桌面E序有着Java相同的弱点,不适合做小巧的WindowE序
Groovy是个有前途的语言Q照现在的势头发展,仅管它现在排名在39名,未来几年内闯?0名,再过些年闯入前十名或更前都不是不可能的事?
三种语言各有特点Q选择哪种语言与您的工作环境,目特点或个人爱好有着关系。随着动态语a的向前发展,他们的简单灵zM强大能帮助我们节省时间与资源Q学一U有潜力的语a能让E序员们站得更稳Q立于领先之圎ͼ如果有天动态语a发达了,设计模式们很多都用不上了Q这不是多年的经验淘C吗?E序员们不要忽视了他们了啊?
以上内容为参看一些文章与自己初步使用的感受的一些感惻I与网友们分nQ有错误之处Q请指正?br />
转自Q?br />
http://www.javaeye.com/topic/259257
那年Q她做了新娘Q就像实C一个梦惻I感觉真好。但是,婚后的生zd像划q的火柴Q擦亮之后就再没了光亮。他不拘节、不爱干净、不擅交往Q他崇尚自由Q喜Ƣ无拘无束,虽然她乖巧得像上帝的羊Q可他仍觉得婚姻束缚了他。但是他们仍然相爱,而且他品行端正,从不拈花惹草?/p>
她含着泪和他离了婚Q但是带C安的钥匙。她不再他蓬ؕ的头发,不再他几点休息Q不再管他到哪里厅R和谁在一P只是一如既往地去收拾戉KQ清理那些垃圾。他也习惯她间断地光_也比在婚M更浪漫地爱她Q什么烛光晚、远x游、玫瑰花床,奚w不是在恋爱和婚姻中n受到的,而是在现在。除了大U的l婚证变成了墨绿的离婚证外,他们和夫L什么两栗?/p>
后来Q他l于成ؓ了有名的艺术Ӟ那一尺堆高的画E,变成了一打打pl绿的钞,她帮他经营帮他管理帮他消贏V他们就一直那栯着Q直C被确诊ؓ癌症晚期。I留之际,他拉着她的手问她,Z么会一生无悔地陪着他。她告诉他,p比婚姻长得多Q婚ȝ束了Q爱却没有结束,所以她才会守侯他一生?/p>
是的Q爱比婚ȝ长度要长Q婚ȝ束,p可以l箋Q爱不在于有无婚姻这个Ş式,而在于内宏V?/strong>
2.破碎的花?/strong>
他和Ҏ大学同学Q他来自偏远的农村,Ҏ自繁华的都市。他的父亲是农民Q她的父亲是l理。除了这些,没有Z说他们是天生的一对,在她家h的极力反对下Q他们最l还是走C一赗?/p>
他是定向分配的考生Q毕业只能回到预定的单位。她攑ּ了父亲找好的单位Q随他回C所在的县城。他在局里做着职员,她在中学教书Q过着艰辛而又q静的生zR在物欲横流的今天,q样的爱情不亚于好来坞的“l典”?/p>
那天Q很冗她拖着重感冒的w体Q在学校l落评学生补课Q她l他打过电话Q让他早点回家作饭。可当她又篏又饿地回到家Ӟ他不在,屋子里冷锅冷Ӟ没有一丝h气,她刚要vw做饭,他回来了。她问他d了,他说Q因为她不能回来做饭Q他出d了。她很伤心,含着满眶的泪水走q了卧室。她走过茶几Ӟ裙角刮落了茶几上的花Ӟq掉在CQ碎了。半q后Q她d了县城,回到了繁华的都市?/p>
q便是婚姻,坚强而又脆弱。如同漂亮的qQ放在一个合适的位置Q可以经受得住岁月的风化Q但是只要轻Mͼ掉在CQ就可能会变成无数的片?/strong>
3.滴水的窗?/p>
他和她属于青梅竹马,怺熟悉得连呼吸的频率相伹{时间久了,婚姻便有了一U沉闷与压抑。她知道他体_知道他心好,可还是感C满,奚w他,你怎么一Ҏ都没有Q他尬地笑W,怎么才算有情?
后来Q她想离开他。他问,Z么?她说Q我讨厌q种LL生活。他_那就让老天来决定吧Q如果今晚下雨,是天意让我们在一赗到了晚上,她刚睡下Q就听见雨滴打窗的声韻I她一惊,真的下雨了?她vw走到窗前,ȝ上正淌着_望望夜空Q却是繁星满天!她爬上楼Ӟ天啊Q他正在g一Z勺地往下浇水。她心里一动,从后面轻d把他׃?/p>
婚姻是需要一Ҏ的Q它q如沙漠中的一片绿zԌ让我们疲劳的眼睛感到希望和美Q适当地给“左手”?#8220;x”一U新鲜的感觉吧?/strong>
4.最后的旅行
他是个搞设计的工E师Q她是中学毕业班的班任老师Q两人都错过了恋q最佛_节,后来lh介绍而相识。没有惊天动地的q程Q^qxE淡地相处Q自自然然地l婚?/p>
婚后W三天,他就跑到单位加班Qؓ了赶设计Q他甚至可以d拼命Q连l几天几夜不回家。她忙于毕业班的理Q经常晚归。ؓ了各自的事业Q他们就像两个陀螺,在各自的轨道上高速旋转着?/p>
送走了毕业班Q清闲了的她开始重新审视自q生活Q审视自q婚姻Q她开始迷茫,不知道自己在他心里有多重Q她g不记得他说过׃。一天,奚w他是不是爱她Q他说当然爱Q不然怎么会结婚,奚w他怎么不说爱,他说不知道怎么说。她拿出写好的离婚协议,他愣了,_那我们去旅游吧,l婚的蜜月我都没陪你Q我亏欠你太多?/p>
他们M奇峰异石的张家界。飘雨的天气和他们阴郁的心情一P走在盘旋的山道上Q她发现他L走在外侧Q她问他Z么,他说路太滑,他怕外侧的栅栏不牢Q怕她万一不小心跌倒。她的心忽然感到了温暖,回家把那䆾d协议撕掉了?/p>
很多时候,爱是埋在心底的,其是婚姻进行中的爱Q^qxE淡,说不出来Q但是真实存在?/strong>
5.晾晒的萝卜干
g住着一对老夫妻,L是离休的处q部Q女的退休前是一家大医院的主d师,他们的两个孩子,一个是某局里的中层q部Q一个在国外M?/p>
入秋的一个傍晚,我看见那老夫人在L萝卜Q我很奇怪,像她q样的家庭,q用自己淹菜吃吗Q我问她Q张阿姨Q你家还淹咸菜吗Q那老夫人很有丰韵,Wv来一脸的q福Q她说你王伯q吃我做的萝卜咸菜Q吃了一辈子都不腻,q去工作再忙Q都要给他晾菜,何况现在退休了Q有多是旉?/p>
望着菜的老hQ忽然就惌v林语堂先生的名言Q爱一个hQ从他肚子v。对那些走过几十载风风雨雨的婚姻来说Q爱可能真的p在碗里,落在“萝卜q?#8221;上了?/p>
不是每䆾爱都是惊天动地的Q实实在在,朴实无华是婚ȝ一U境界?/strong>
6.w边的风?/strong>
和许多家庭一P他们曄那么热烈地相pQ但是随着岁月的流失,他开始变得冷漠了Q大概就是h们常说的“审美疲劳”吧,Ȁ情越来越,心开始了漂移?/p>
他开始上|,聊QQQ在虚拟中寻找新鲜的感觉。一日,他在一个网站看C个v?#8220;飘落的枫?#8221;所写的短文Q写的是一个女子对婚姻对生zȝ失望。那优美的文字和文字间流溢的淡E忧伤Q深深打动了他。他不明白,一个感情这L腅R丰富的奛_Q她的丈夫怎会不知道珍惜?他禁不住阅了那奛_的注册资料,却发现那注册的信q是妻子的姓名全拼Q他猛地释然了,d的名字不正是“?#8221;吗,自己怎么忘了,d曾是大学里的文学C֛d呢,只是婚姻让她淡忘了许多爱好?/p>
他走q厨房,用手从后面环住妻子的腎ͼ我们吃完饭出L步吧。妻子肩头微微一颤:太阳从西边出来了Q你不上|了Q他转过d的nQ看着那其实很好看的脸_我以后天天陪你散步?/p>
“不识庐山真面目,只缘w在此山?#8221;Qh们常说nҎ有风景,其实风景往往在你n辏V?/strong>
7.温顺的丈?/strong>
他和奚w是小工hQ薪水不高,但是_生活。丈夫很普通,d却很漂亮Q也很伉俐?/p>
因ؓ彼此都很有时_他们每个月或是出ȝ场电影,或是去逛逛公园,间或出去吃顿晚餐。只要妻子想Q丈夫就陪着。什么事都顺着dQ只要妻子高_只要条g允许Q从来不说半?#8220;?#8221;字,好像从来没有自qx。一ơ,他们出去吃晚饭,d让丈夫点菜,丈夫_点你爱吃的吧Q妻子有点生气,你就没一点自q主见Q是不是有点H囊Q丈夫楞了,叹了口气Q我只是一个普通的工hQ不能给你宽敞的住房和漂亮汽车,我只惛_自己“?#8221;的范围内Q给你最好的?/p>
世界上有卑微的男奻I却没有卑微的爱情Q爱她,qҎ好的Q我惌也该是婚姻的真谛吧?/strong>